我对我们已经使用了一段时间的后续查询感到困惑,以下工作
搜索" fire"
的查询SELECT product FROM product_descriptions WHERE MATCH(product) AGAINST('+fire*' IN BOOLEAN MODE) LIMIT 5
返回
Fire Storage 31020 S1 E
Fire Storage 31020 S1 K
Fire Storage 31021 S1 E
Fire Storage 31021 S1 K
Fire Storage 31022 S1 E
但是以下搜索查询"保持"
SELECT product FROM product_descriptions WHERE MATCH(product) AGAINST('+keep*' IN BOOLEAN MODE) LIMIT 5
不返回任何结果,但我们在表格中有产品,例如" Fire Door Keep Shut Sign"," Keep Clear Sign"
到目前为止,我发现的唯一不起作用的是工作"保持"
以下搜索工作" steel"," door"因为我认为它可能是双字符的问题
答案 0 :(得分:3)
Keep是一个停止词
在计算中,停用词是在之前过滤掉的词,或者 之后,处理自然语言数据(文本)。 [...]一些工具 特别是避免删除它们以支持短语搜索。任何一组 可以选择单词作为给定目的的停用词。对于一些 搜索机器,这些是一些最常见的短功能 单词,例如,is,at,which和on。在这种情况下,停止单词 搜索包含它们的短语时可能会出现问题, 特别是在“The Who”,“The The”或“Take That”等名称中。 其他搜索引擎删除了一些最常见的单词 - 包括 词汇词,例如“想要” - 来自查询以便改进 性能
http://dev.mysql.com/doc/refman/5.1/en/fulltext-stopwords.html
您可以在storage / myisam / ft_static.c文件中找到实际使用的列表。
这个事实在 http://dev.mysql.com/doc/refman/5.5/en/fulltext-boolean.html
您可能想要使用Lucene。
停止词的列表要小得多,而且你可以完全删除它们:
How to instruct StandardAnalyzer in Lucene to not to remove stop words?
或者你可以添加
ft_stopword_file = ""
或链接空文件“empty_stopwords.txt” 到你的.cnf / my.ini文件,重新启动mysql引擎并重建索引:
除此之外,如果还没有,请将最小单词降低到3(ft_min_word_len = 3),以便能够搜索3个字母的单词。
较短的单词(3,2)会大大增加查询时间,尤其是在全文索引列字段很大的情况下。