0

我必须在多个列中实现全文搜索,并根据某些列/字段的相关性进行结果加权。

我遇到的所有解决方案似乎都使​​用单列索引来计算相关性,并使用一个多列索引来计算WHERE子句。请参阅:https ://stackoverflow.com/a/600915/168719或https://stackoverflow.com/a/6305108/168719

这是我的查询:

SELECT MATCH(name) AGAINST (text) as relevance_name, 
MATCH(description) AGAINST(text) as relevance_description, 
MATCH(description_long) AGAINST (text) as relevance_description_long 
FROM products WHERE

我面临着以下选择:

一个)

MATCH(name, description, description_long) AGAINST (text) > 0

b)

MATCH(name) AGAINST (text) > 0 
OR MATCH(description) AGAINST (text) > 0 
OR MATCH(description_long) AGAINST (text) > 0

之后是排序子句。

ORDER BY (relevance_name * 2 + 
relevance_description * 3 + 
relevance_description_long * 4) / 9

问题是 - a(显然是首选方法)优于b的优势是什么?

a需要创建另一个全文索引(跨所有可搜索列),这显然会占用更多磁盘空间。

有什么优势?是性能问题吗?还是搜索质量?

4

1 回答 1

2

手册第12.9.1 页。自然语言全文搜索告诉我们:

对于表中的每一行,MATCH() 返回一个相关值;也就是说,搜索字符串与 MATCH() 列表中命名的列中该行中的文本之间的相似性度量。

因此,MATCH () 将返回 MATCH (c1,c2,c3) 和 MATCH(c1) + MATCH(c2) + MATCH(c3) 的不同值。将 match 与 OR 运算符一起使用时也会有类似的区别。

相关性是根据行中的单词数、该行中的唯一单词数、集合中的单词总数以及包含特定单词的文档(行)数来计算的。

您应该使用方法B,因为它与您的查询形式相同。

于 2013-05-23T14:08:14.050 回答