Mysql 具有相关性的全文搜索-为什么需要多列索引?
我必须在多个列中实现全文搜索,并根据特定列/字段的相关性对结果进行加权 我遇到的所有解决方案似乎都使用单列索引来计算相关性,而使用一个多列索引来计算Mysql 具有相关性的全文搜索-为什么需要多列索引?,mysql,sql,search,full-text-search,Mysql,Sql,Search,Full Text Search,我必须在多个列中实现全文搜索,并根据特定列/字段的相关性对结果进行加权 我遇到的所有解决方案似乎都使用单列索引来计算相关性,而使用一个多列索引来计算WHERE子句。见:或 这是我的问题: SELECT MATCH(name) AGAINST (text) as relevance_name, MATCH(description) AGAINST(text) as relevance_description, MATCH(description_long) AGAINST (text) as
WHERE
子句。见:或
这是我的问题:
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)
之后是排序子句
ORDER BY (relevance_name * 2 +
relevance_description * 3 +
relevance_description_long * 4) / 9
问题是,a(显然是首选方法)比b有什么优势
a需要创建另一个全文索引(跨所有可搜索列),这显然会占用更多磁盘空间
有什么好处?这是性能问题吗?还是搜索质量?第页的手册告诉我们:
对于表中的每一行,MATCH()返回一个相关值;也就是说,搜索字符串与MATCH()列表中指定列中该行的文本之间的相似性度量
因此,MATCH()将为MATCH(c1、c2、c3)和MATCH(c1)+MATCH(c2)+MATCH(c3)返回不同的值。当使用“与或匹配”运算符时,也会出现类似的差异
相关性是根据行中的字数、该行中唯一的字数、集合中的字数总数以及包含特定字词的文档(行)数来计算的
您应该使用方法B,因为它的形式与您的查询相同。在
WHERE
子句中,我不关心确切的相关性是什么。它除了筛选不匹配的结果外,没有其他用途。我的印象是b也足够了。但为什么a最常被推荐?当然,背后一定有某种道理that@Konrad. 对于Match(1,2,3),索引只有一次读取,而对于B,有三次读取,这使其速度变慢。我回答的要点是,在select和where子句中应该使用相同的构造。因此,您的意思是,这3次读取(在select
中)无论如何都会被缓存,因此在方法b中,我最终总共有3次读取(而不是6次)?当在这个查询中使用a添加第四个read?时,我说的是单个语句。当您使用选择M(1)、M(2)、M(3)[…]时,其中M(1)或M(2)或M(3)
则有3次全文索引读取。当您使用Select M(1)、M(2)、M(3)[…]Where M(1,2,3)
时,Select子句有3次读取全文索引,Where子句有1次读取。但是,在中选择M(1,2,3)[…],其中M(1,2,3)
将只读取一次全文索引。切切是另一回事。
ORDER BY (relevance_name * 2 +
relevance_description * 3 +
relevance_description_long * 4) / 9