我有一张 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这是一个防止“树溢出”的错误修复。
答案2
这些列可能未被索引。手动的:
MATCH() 列列表必须与表的某些 FULLTEXT 索引定义中的列列表完全匹配,除非此 MATCH() 为 IN BOOLEAN MODE。布尔模式搜索可以在非索引列上进行,尽管它们可能很慢。
这可以解释为什么你在布尔模式下看到不同的行为。