【问题标题】:Mysql search for string and number using MATCH() AGAINST()Mysql 使用 MATCH() AGAINST() 搜索字符串和数字
【发布时间】:2013-01-12 09:38:40
【问题描述】:

我对 MATCH AGAINST 函数有疑问。

下面的查询给了我同样的结果:

SELECT * FROM models MATCH(name) AGAINST('Fiat 500')
SELECT * FROM models MATCH(name) AGAINST('Fiat')

如何在 FULL TEXT 表的列中同时搜索字符串和数字?

谢谢

【问题讨论】:

    标签: mysql search numbers match-against


    【解决方案1】:

    以防万一它对其他人有所帮助,如果您使用的是 InnoDB,则需要使用一组不同的 mysql.cnf 属性

    例如

    show variables like 'innodb_ft%';
    

    并在 my.cnf 中设置以下值而不是 ft_min_word_len

    innodb_ft_min_token_size=1
    

    【讨论】:

      【解决方案2】:

      如果您需要Fiat500 任何顺序无关紧要的地方,那么

      SELECT * FROM models MATCH(name) AGAINST('+Fiat +500');
      

      如果你需要Fiat 500一起,那么

      SELECT * FROM models MATCH(name) AGAINST('+"Fiat 500"');
      

      如果你需要Fiat 和零个或多个500,那么

      SELECT * FROM models MATCH(name) AGAINST('+Fiat 500');
      

      如果你需要500 和零个或多个Fiat,那么

      SELECT * FROM models MATCH(name) AGAINST('Fiat +500');
      

      试试看!!!

      更新 2013-01-28 18:28 EDT

      这里是全文搜索的默认设置

      mysql> show variables like 'ft%';
      +--------------------------+----------------+
      | Variable_name            | Value          |
      +--------------------------+----------------+
      | ft_boolean_syntax        | + -><()~*:""&| |
      | ft_max_word_len          | 84             |
      | ft_min_word_len          | 4              |
      | ft_query_expansion_limit | 20             |
      | ft_stopword_file         | (built-in)     |
      +--------------------------+----------------+
      5 rows in set (0.00 sec)
      
      mysql>
      

      请注意,ft_min_word_len 默认为 4。令牌 500 的长度为 3。因此它根本不会被索引。您将不得不做三 (3) 件事:

      步骤 01:配置较小的字符串标记

      将此添加到/etc/my.cnf

      [mysqld]
      ft_min_word_len = 1
      

      步骤 02:重启 mysql

      service mysql restart
      

      步骤 03:重新索引models 表中的所有索引

      您可以直接删除并添加 FULLTEXT 索引

      或者分阶段做,提前看看能有多大

      CREATE TABLE models_new LIKE models;
      ALTER TABLE models_new DROP INDEX name;
      ALTER TABLE models_new ADD FULLTEXT name (name);
      ALTER TABLE models_new DISABLE KEYS;
      INSERT INTO models_new SELECT * FROM models;
      ALTER TABLE models_new ENABLE KEYS;
      ALTER TABLE models RENAME models_old;
      ALTER TABLE models_new RENAME models;
      

      当你对它的工作感到满意时,然后运行

      DROP TABLE models_old;
      

      试试看!!!

      【讨论】:

      • 如果我只搜索“500”给我没有结果...为什么?
      • 不是试图劫持,而是@RolandoMySQLDBA 在使用 php var 时,你在哪里放置 + 号? "+'FIAT 500'"
      • @DannyG 你把引号倒过来了。使用('+"FAIT 500"')
      • @RolandoMySQLDBA 我已经尝试了上述所有步骤,但仍然遇到 2 个字符单词的问题。我在stackoverflow.com/questions/28278288/… 发布了一个问题
      • 是否可以为 against() 提供更多参数,例如: AGAINST('Fiat', 'Benz') ?
      猜你喜欢
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多