代码之家  ›  专栏  ›  技术社区  ›  Ry-

如何让你的全文布尔搜索找到C++这个词?

  •  8
  • Ry-  · 技术社区  · 17 年前

    我的SQL搜索字符串为:

    SELECT * 
    FROM mytable 
    WHERE MATCH (field1, field2, field3) 
    AGAINST ("C++" IN BOOLEAN MODE) 
    

    我如何修改MySQL以适应这种情况?有可能吗?

    我找到的唯一解决方案是在输入数据时将+字符转义为“__plus”,然后修改搜索以适应,但这似乎很麻烦,必须有更好的方法。

    4 回复  |  直到 12 年前
        1
  •  8
  •   bobince    17 年前

    我如何修改MySQL以适应这种情况?

    首先,默认的最小字长为4。这意味着没有搜索词只包含<4个字母将永远匹配,无论是C++还是cpp。您可以使用配置 ft_min_word_len 配置选项,例如在my.cfg中:

    [mysqld]
    ft_min_word_len=3
    

    (然后停止/启动MySQLd并重建全文索引。)

    其次,MySQL不认为+是一个字母。你可以把它做成一个字母,但这意味着你将无法在字符串fish+chips中搜索单词fish,所以需要小心。这并非易事:它需要重新编译MySQL或破解现有的字符集。如果要更改被视为单词字符的字符集,请参阅开头的部分。..in section 11.8.6 医生。

    是的,这样的东西是一种常见的解决方案:您可以将真实数据(无需转义)保存在一个主要的、明确的表中,通常使用InnoDB来实现ACID合规性。然后可以添加一个辅助的MyISAM表,仅包含全文搜索诱饵的损坏单词。您还可以使用这种方法进行有限形式的词干提取。

    另一种可能性是检测MySQL无法进行的搜索,例如只有短单词或不寻常字符的搜索,并仅对这些搜索进行简单但缓慢的LIKE或REGEXP搜索。在这种情况下,您可能还希望通过设置来删除停止列表 ft_stopword_file 将字符串转换为空字符串,因为将其中的所有内容都视为特殊字符串是不切实际的。

        2
  •  1
  •   zessx    12 年前

    http://dev.mysql.com/doc/refman/5.0/en/fulltext-boolean.html :

    括在双引号(“)字符内的短语仅与键入时包含该短语的行匹配。

    这意味着您可以使用以下查询搜索“C++”:

    SELECT * 
    FROM mytable 
    WHERE MATCH (field1, field2, field3) 
    AGAINST ('"C++"' IN BOOLEAN MODE)
    
        3
  •  0
  •   Paxic    17 年前

    通常转义字符用于查询,而不是数据库数据。尝试在查询中转义每个“+”。

        4
  •  0
  •   zessx    12 年前

    解决方案:

    更改my.ini文件

    放这两行

    ft_min_word_len = "1"
    ft_stopword_file =""
    

    在......下面

    [mysqld]
    

    然后保存文件并重新启动mysql服务器。

    my.ini 文件将被所有人共享。那么,我们可以在 my.ini 文件仅适用于某些会话。?