Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 具有相关性的全文搜索-为什么需要多列索引?_Mysql_Sql_Search_Full Text Search - Fatal编程技术网

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