因此,我需要了解如何在MySQL数据库上进行全文布尔搜索,以返回包含术语“C ++”的记录。
我的SQL搜索字符串为:
SELECT *
FROM mytable
WHERE MATCH (field1, field2, field3)
AGAINST ("C++" IN BOOLEAN MODE)
虽然我的所有字段都包含字符串C ++,但它永远不会在搜索结果中返回。
如何修改MySQL以适应这种情况?可能吗?
我找到的唯一解决方案是在输入数据的过程中转义+字符,如“__plus”,然后修改我的搜索以适应,但这似乎很麻烦,必须有更好的方法。
答案 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
文件中对某个会话进行更改。?