你如何得到你的全文布尔搜索来获取术语C ++?

时间:2009-02-25 06:45:03

标签: mysql search escaping full-text-search boolean

因此,我需要了解如何在MySQL数据库上进行全文布尔搜索,以返回包含术语“C ++”的记录。

我的SQL搜索字符串为:

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

虽然我的所有字段都包含字符串C ++,但它永远不会在搜索结果中返回。

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

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

4 个答案:

答案 0 :(得分:8)

  

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

你必须改变MySQL对单词的看法。

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

[mysqld]
ft_min_word_len=3

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

其次,'+'不被MySQL视为一封信。你可以把它写成一个字母,但那意味着你将无法在字符串'fish + chips'中搜索“fish”这个词,所以需要一些小心。并且它不是微不足道的:它需要重新编译MySQL或者破解现有的字符集。请参阅文档的section 11.8.6中的“如果要更改被视为单词字符的字符集...”部分。

  

在输入数据的过程中转义+字符,如“__plus”,然后修改我的搜索以适应

是的,类似的东西是一种常见的解决方案:您可以将您的“真实”数据(无需转义)保存在主要的权威表中 - 通常使用InnoDB进行ACID合规性。然后可以添加辅助MyISAM表,其中仅包含全文搜索诱饵的错位字。您也可以使用这种方法进行有限形式的词干化。

另一种可能性是检测MySQL无法执行的搜索,例如仅包含短字或不常见字符的搜索,并回退到仅针对这些搜索的简单但缓慢的LIKE或REGEXP搜索。在这种情况下,您可能还希望通过将ft_stopword_file设置为空字符串来删除停止列表,因为在此处拾取所有内容也是不切实际的。

答案 1 :(得分:1)

来自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)

答案 2 :(得分:0)

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

答案 3 :(得分:0)

溶液::

更改my.ini文件

把这两行

ft_min_word_len = "1"
ft_stopword_file =""

以下

[mysqld]

比savve文件重新启动mysql服务器。

my.ini文件将被所有人所愚弄。那么我们是否可以在my.ini文件中对某个会话进行更改。?