8

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

我的 SQL 搜索字符串为:

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

尽管我的所有字段都包含字符串 C++,但它从未在搜索结果中返回。

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

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

4

4 回答 4

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 或破解现有的字符集。请参阅文档第 11.8.6 节中以“如果要更改被视为单词字符的字符集...”开头的部分。

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

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

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

于 2009-02-25T07:38:18.323 回答
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)
于 2009-08-14T08:03:02.697 回答
0

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

于 2009-02-25T06:51:04.100 回答
0

解决方案::

更改 my.ini 文件

把这两行

ft_min_word_len = "1"
ft_stopword_file =""

以下

[mysqld]

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

my.ini文件将被所有人共享。那么我们可以my.ini只为某些会话更改文件吗?

于 2010-12-06T06:45:27.267 回答