所以,我需要找出如何在MySQL数据库上进行全文布尔搜索,以返回包含术语"C++"的记录.
我有我的SQL搜索字符串:
SELECT * FROM mytable WHERE MATCH (field1, field2, field3) AGAINST ("C++" IN BOOLEAN MODE)
虽然我的所有字段都包含字符串C++,但它永远不会在搜索结果中返回.
如何修改MySQL以适应这种情况?可能吗?
我找到的唯一解决方案是在输入我的数据的过程中转义+字符,如"__plus",然后修改我的搜索以适应,但这似乎很麻烦,必须有一个更好的方法.
如何修改MySQL以适应这种情况?
你必须改变MySQL对单词的看法.
首先,默认的最小字长为4.这意味着不包含仅包含<4个字母的单词的搜索词将匹配,无论是"C++"还是"cpp".您可以使用ft_min_word_len配置选项配置它,例如.在你的my.cfg中:
[mysqld] ft_min_word_len=3
(然后停止/启动MySQLd并重建全文索引.)
其次,'+'不被MySQL视为一封信.你可以把它写成一个字母,但那意味着你将无法在字符串'fish + chips'中搜索"fish"这个词,所以需要一些小心.并且它不是微不足道的:它需要重新编译MySQL或者破解现有的字符集.请参阅文档的第11.8.6节中的"如果要更改被视为单词字符的字符集..." 部分.
在输入我的数据的过程中转义+字符,如"__plus",然后修改我的搜索以适应
是的,类似的东西是一种常见的解决方案:您可以将您的"真实"数据(无需转义)保存在主要的权威表中 - 通常使用InnoDB进行ACID合规.然后可以添加辅助MyISAM表,其中仅包含全文搜索诱饵的错位字.您也可以使用此方法进行有限形式的词干.
另一种可能性是检测MySQL无法执行的搜索,例如只有短字或不常见字符的搜索,并回退到仅针对这些搜索的简单但缓慢的LIKE或REGEXP搜索.在这种情况下,您可能还希望通过将ft_stopword_file设置为空字符串来删除停止列表,因为在此处拾取所有内容也是不切实际的.