我必须在多个列中实现全文搜索,并根据某些列/字段的相关性进行结果加权。
我遇到的所有解决方案似乎都使用单列索引来计算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
我正面临着:
之间的选择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 需要创建另一个全文索引(跨所有可搜索列),这显然会占用更多磁盘空间。
有什么好处?这是性能问题吗?还是搜索质量?
答案 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 ,因为它与查询的格式相同。