具有相关性的全文搜索 - 为什么需要多列索引?

时间:2013-05-23 09:10:52

标签: mysql sql search full-text-search

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

我遇到的所有解决方案似乎都使​​用单列索引来计算WHERE子句的相关性和一个多列索引。请参阅:https://stackoverflow.com/a/600915/168719https://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

我正面临着:

之间的选择

a)

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 需要创建另一个全文索引(跨所有可搜索列),这显然会占用更多磁盘空间。

有什么好处?这是性能问题吗?还是搜索质量?

1 个答案:

答案 0 :(得分:2)

手册页12.9.1. Natural Language Full-Text Searches告诉我们:

  

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

因此,MATCH()将返回MATCH(c1,c2,c3)和MATCH(c1)+ MATCH(c2)+ MATCH(c3)的不同值。使用与OR运算符匹配时会有类似的差异。

  

相关性的计算基于行中的单词数,该行中唯一单词的数量,集合中的单词总数以及包含特定单词的文档(行)数。

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