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

我有一个具有> 200M行的MySQL 5.5.4表,它有两列(Title,Body)上的FULLTEXT索引。

当我在默认的NATURAL LANGUAGE模式下为一些stream行的结果(他们会返回2M +行)做一个简单的FULLTEXT查询时,我得到了零行:

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行在任何一种模式下都可以正常工作,所以如果与结果大小有关,它似乎会在50K到2M之间的某个地方出现。

我试着玩各种缓冲区大小的variables,无济于事。 这显然不是50%的门槛,因为我们没有得到任何结果的100M行。

有任何想法吗?

你看到的行为是通过devise。 如果使用自然语言查询(NLQ),如果包含该术语的文档总数大于200万,那么权重将为0。

这在/storage/myisam/ft_nlq_search.c的以下行完成:

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

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

它看起来像你将不得不切换到狮身人面像或Lucene的解决scheme。

它可能是这些列没有被索引。 手册的相关部分:

除非MATCH()是IN BOOLEAN MODE,否则MATCH()列表必须完全匹配表的某些FULLTEXT索引定义中的列列表。 布尔模式search可以在非索引列上完成,尽pipe它们可能很慢。

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