我有一个具有> 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它们可能很慢。
这将解释为什么你在布尔模式下看到不同的行为。