【问题标题】:MySQL full-text search using match against return wrong result setMySQL全文搜索使用匹配返回错误的结果集
【发布时间】:2014-11-12 16:43:35
【问题描述】:

我有以下疑问:

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 ;

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

【问题讨论】:

    标签: mysql match-against


    【解决方案1】:

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

    注意 在实现这个特性时,MySQL 使用了有时被称为隐含布尔逻辑的东西,其中

    加号(+)代表与

    减号(-)代表NOT

    [无运算符]暗示或

    所以本质上你是在做一个 OR,如果你需要这两个术语,那么就使用 +

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

    【讨论】:

      【解决方案2】:

      除了user144590提供的答案; M 默认情况下不被视为一个单词。

      来自the docs

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

      更新

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

      【讨论】:

      • 也许这就是关键。当我使用+ 时,会返回相同的结果集。有没有办法在不更改最小单词长度的情况下忽略М 字母,因为我无权访问配置文件?
      • @KristianVitozev 没有忽略M 到底是什么问题?
      • 好吧,М 似乎被忽略了,这就是为什么我有两个结果。但我只想匹配第一个结果(字母 M 实际存在的地方)
      • 谢谢,但是使用M_1050 我们没有任何结果。 ://
      • @MatejSvajger,是的,但是它在内部将该短语拆分为单词以执行搜索,并且仍然会忽略“M”,因为它不是单词。 See Docs
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2015-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-18
        相关资源
        最近更新 更多