【问题标题】:MySQL fulltext does not search for short emailsMySQL全文不搜索短电子邮件
【发布时间】:2013-04-01 19:57:39
【问题描述】:

我在许多列上有一个全文索引,我正在尝试对这些列执行 MATCH AGAINST IN BOOLEAN MODE,试图找到一个电子邮件地址。结果如下:

  • 如果我搜索“test@email.com”(带引号) - 查询返回正确的结果
  • 如果我搜索“a@b.com”(带引号) - 查询不会返回任何内容

谁能告诉我为什么a@b.com 没有收到简短的电子邮件,我将如何解决这个问题?

这是我正在使用的查询:

SELECT MATCH(email, phone, title, description) AGAINST('"a@b.com"' IN BOOLEAN MODE) AS score 
FROM thetable WHERE MATCH(email, phone, title, description) 
AGAINST('"a@b.com"' IN BOOLEAN MODE) ORDER BY `status` DESC, score DESC

【问题讨论】:

    标签: mysql full-text-search


    【解决方案1】:

    这是两个问题的结合:

    1. @ 不被认为是“单词字符”,- 也不是,所以搜索a@b.com 实际上归结为搜索单词abcom
    2. ab 比 ft_min_word_len 短

    解决方案是将@. 视为单词字符。 http://dev.mysql.com/doc/refman/5.6/en/fulltext-fine-tuning.html上列出了几种方法

    最实用的方法是添加自定义排序规则,如

    中所述

    http://dev.mysql.com/doc/refman/5.6/en/full-text-adding-collation.html

    【讨论】:

      【解决方案2】:

      更新:

      a)你需要在my.cnf中设置ft_min_word_len = 1

      b) 显示变量的输出

      ft_min_word_len                                   | 1 
      

      c) 触发以下查询:

      mysql> SELECT name,email FROM jos_users WHERE MATCH (email) AGAINST ('a@b.com') limit 1;
       +--------+---------+
       | name   | email   |
       +--------+---------+
       | kap | a@b.com |
       +--------+---------+
       1 row in set (0.00 sec)
      

      希望这会有所帮助。

      ~K


      我认为您需要更改 ft_min_word_len

      MySQLdoc fine tuning中指定

      要索引的单词的最小和最大长度由下式定义 ft_min_word_len 和 ft_max_word_len 系统变量。 (看 第 5.1.4 节,“服务器系统变量”。)默认最小值 是四个字符;默认最大值取决于版本。如果你 更改任一值,您必须重建您的 FULLTEXT 索引。为了 例如,如果你想搜索三个字符的词,你可以 通过将以下行放入一个 ft_min_word_len 变量 选项文件:

      [mysqld] ft_min_word_len=3 然后重新启动服务器并重建 FULLTEXT 索引。特别注意说明中有关 myisamchk 的注释 关注此列表。

      【讨论】:

      • 感谢您的回答。我也有同样的怀疑。事实上,我的最小长度设置为 3。如果我搜索“abc@b.com” - 它可以工作。但是我不明白的是:a)abc@b.com 有 9 个字符长,并且在引号中作为短语搜索,那么为什么这个设置有任何影响呢? b) 如果 min word length 确实有效 - 那么单词“b”只有一个字符,这是怎么回事?
      • 它确实有效,谢谢。我只是很难理解 mysql 认为什么是“单词”。
      • @Marius:您能否考虑标记 Hartmut 的答案而不是这个答案,因为它是更好的答案。为了其他来这里学习的人的利益,Hartmuts 的回答描述了这两个问题; MIN_WORD 和 @ 符号被忽略的事实,因为它是为 @distance 运算符保留的。
      猜你喜欢
      • 2018-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-10
      • 1970-01-01
      相关资源
      最近更新 更多