MySQL全文搜索使用匹配返回错误的结果集

时间:2014-09-18 11:07:12

标签: mysql match-against

我有以下查询:

SELECT * FROM products WHERE is_active = 1 AND MATCH (full_text) AGAINST ('М 1050' IN BOOLEAN MODE)

此查询返回两条记录,这是两条记录的full_index列内容:

  

013 001 106; ЪглошлайфSPARKY M 1050 HD; 1050W,10000об,ф125мм   ;活泼的 ; 69; ; 040 070 1050 ; Вложкадванадесетограмудължена;   1/4“5ммFORSE/ 5295005 /; FORCE; 77;

但我只想要第一行,我不需要第二行。怎么了?

3 个答案:

答案 0 :(得分:2)

除了用户144590提供的答案;默认情况下,M不会被视为单词。

来自the docs

  

任何太短的单词都会被忽略。通过全文搜索找到的单词的默认最小长度是InnoDB搜索索引的三个字符,或MyISAM的四个字符。您可以在创建索引之前通过设置配置选项来控制截止:InnoDB搜索索引的innodb_ft_min_token_size配置选项或MyISAM的ft_min_word_len。

<强>更新

在不更改最小长度的情况下,我猜您必须将文本'M 1050'中的空格替换为'_'中的其他单词字符,并与'M_1050'匹配(在查询中),或运行慢得多的LIKE '%M 1050%'条件。

答案 1 :(得分:1)

基于http://dev.mysql.com/doc/refman/5.5/en/fulltext-boolean.html

  

请注意   在实现此功能时,MySQL使用有时被称为隐含布尔逻辑的内容,其中

     

加号(+)代表AND

     

减号( - )代表NOT

     

[no operator]暗示OR

所以基本上你正在做一个OR,如果你需要两个术语使用+这样

SELECT * FROM products WHERE is_active = 1 AND MATCH (full_text) AGAINST ('+М +1050' IN BOOLEAN MODE)

答案 2 :(得分:0)

如果要精确匹配某些单词,请使用双引号(例如'“М1050”')

SELECT * FROM products WHERE is_active = 1 AND MATCH (full_text) AGAINST ('"М 1050"' IN BOOLEAN MODE)