当存在匹配的行时,为什么这个 MySQL FULLTEXT 查询返回 0 行?

当存在匹配的行时,为什么这个 MySQL FULLTEXT 查询返回 0 行?

我有一张 MySQL 5.5.4 表,其中有超过 2 亿行,在两列(标题、正文)上有 FULLTEXT 索引。

当我在默认的自然语言模式下对一些常见结果(它们会返回 200 万行以上)执行简单的全文查询时,我得到零行:

SELECT COUNT(*) FROM itemsearch WHERE MATCH (Title, Body) AGAINST ('fubar');

但是当我在 BOOLEAN 模式下执行 FULLTEXT 查询时,我可以看到有问题的行确实存在(我得到了 2M+ 个结果,具体取决于):

SELECT COUNT(*) FROM itemsearch WHERE MATCH (Title, Body) AGAINST ('+fubar' IN BOOLEAN MODE);

我有一些查询返回~500K 行,它们在任何一种模式下都可以正常工作,所以如果它与结果大小有关,它似乎出现在 500K 和 2M 稍北之间的某个地方。

我尝试过各种缓冲区大小变量,但无济于事。显然这不是 50% 的阈值,因为我们没有得到任何结果的 1 亿行。

有任何想法吗?

答案1

您看到的行为是设计使然。使用自然语言查询 (NLQ) 时,如果包含该术语的文档总数大于 200 万,则权重将为 0。

这是按照以下方式完成的/存储/myisam/ft_nlq_search.c

gweight=word->weight*GWS_IN_USE;
if (gweight < 0 || doc_cnt > 2000000)
  gweight=0;

根据修订1346.322.1这是一个防止“树溢出”的错误修复。

看来你必须切换到狮身人面像Lucene解决方案。

答案2

这些列可能未被索引。手动的

MATCH() 列列表必须与表的某些 FULLTEXT 索引定义中的列列表完全匹配,除非此 MATCH() 为 IN BOOLEAN MODE。布尔模式搜索可以在非索引列上进行,尽管它们可能很慢。

这可以解释为什么你在布尔模式下看到不同的行为。

相关内容