当我查询我的数据库时,以下两个查询返回相同的(预期)结果:
SELECT * FROM articles
WHERE content LIKE '%Euskaldunak%'
SELECT * FROM articles
WHERE MATCH (content) AGAINST ('+"Euskaldunak"' IN BOOLEAN MODE)
它正在搜索的内容字段中的文字如下:“......这些Euskaldunak,或新人......”
但是,对同一个表的以下查询将返回预期的单个结果:
SELECT * FROM articles
WHERE content LIKE '%PCC%'
以下查询返回空结果:
SELECT * FROM articles
WHERE MATCH (content) AGAINST ('+"PCC"' IN BOOLEAN MODE)
与此结果相匹配的内容字段中的文字如下所示:“...波特兰社区学院(PCC)是最大的......”
我无法弄清楚为什么搜索“Euskaldunak”与MATCH ... AGAINST语法一起工作但“PCC”没有。有没有人看到我没有看到的东西?
(另外:“PCC”不是此字段中的常用短语 - 没有其他行包含该单词,因此自然语言搜索不应排除它。)
答案 0 :(得分:3)
我可以立即想到两件事。第一个是你的ft_min_word_len值设置为超过3个字符。任何小于ft_min_word_len长度的“单词”都不会被索引。
第二个是超过50%的记录包含'PCC'字符串。与超过50%的记录匹配的全文搜索被认为是无关紧要的,并且不返回任何内容。
全文索引与常规字符串索引具有不同的规则。例如,有一个停用词列表,所以某些常见的词,如,,和,不会被索引。
答案 1 :(得分:3)
您的全文最小字长可能设置得太高。我认为默认值是4,这可以解释你所看到的。如果您希望所有单词都被索引而不管长度如何,请将其设置为1.
运行此查询:
show variables like 'ft_min_word_len';
如果值大于3并且您希望对短于此的单词进行匹配,请编辑/etc/my.cnf并使用适合您的应用程序的值在[mysqld]部分中添加或更新此行:
ft_min_word_len = 1
然后重启MySQL并重建全文索引,你应该全部设置。