【问题标题】:How do you get your Fulltext boolean search to pick up the term C++?你如何让你的全文布尔搜索来选择术语 C++?
【发布时间】:2010-10-09 18:09:45
【问题描述】:

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

我的 SQL 搜索字符串为:

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

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

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

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

【问题讨论】:

  • 什么是全文布尔搜索?听起来很像你编造的那个词。另外,你的问题很模糊。您需要更好地描述您的问题,您正在尝试做什么。否则我们帮不了你。
  • @John:你太苛刻了。我不得不避免链接到 lmgtfy,所以这里是 MySQL 的解释:dev.mysql.com/doc/refman/5.1/en/fulltext-boolean.html
  • @A.雷克斯 - 我是邪恶的(在某种意义上)我的观点我觉得很苛刻,但问题是缺乏关于你如何表达一个好问题的问题。因此,我们(堆栈溢出的人)无法根据信息不足提供好的答案。
  • 这个词对于有足够知识来回答这个问题的 MySQL 用户来说是众所周知的。
  • @John Fulltext boolean 很好地描述了一种众所周知的 MySQl 搜索类型。

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


【解决方案1】:

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

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

首先,默认的最小字长为 4。这意味着不会匹配仅包含 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 设置为空字符串来删除停止列表,因为将其中的所有内容也都视为特殊是不切实际的。

【讨论】:

  • @bobince:(重新讨论上面 cmets 中的讨论,感谢您以清晰的方式回答这个易于理解的问题。)出于好奇,您将如何使用这种方法进行词干处理?用词干替换辅助表中的每个单词?
  • 基本上是的(当然以相同的方式处理搜索查询中的单词)。通常,您会为您的首选语言使用现有的后缀去除词干分析器库。 (对于“语言”的两个值;参见例如 Porter's algorithm for English in many programming languages。)
【解决方案2】:

来自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】:

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

    【讨论】:

      【解决方案4】:

      解决方案::

      更改 my.ini 文件

      这两行

      ft_min_word_len = "1"
      ft_stopword_file =""
      

      下面

      [mysqld]
      

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

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

      【讨论】:

        猜你喜欢
        • 2010-09-11
        • 2013-07-15
        • 2017-03-23
        • 2011-10-04
        • 1970-01-01
        • 1970-01-01
        • 2010-11-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多