【问题标题】:*Actual* exact MySQL fulltext search*实际*精确的 MySQL 全文搜索
【发布时间】:2015-08-26 11:18:44
【问题描述】:

所以我在 MySQL 全文中创建精确搜索时遇到了一些困难。

在我的数据库中,我正在尝试查找标题中包含特定关键字的工作。

所以我可以试试

WHERE MATCH(jobTitle) AGAINST ('"fs sales"' IN BOOLEAN MODE)

但是,这会在 "sales" 上找到匹配项,而不是在 "fs sales" 上找到匹配项

如何确保"fs sales" 完全匹配"fs sales" 而不是"sales"

表是 InnoDB 供参考。

【问题讨论】:

    标签: mysql full-text-search innodb


    【解决方案1】:

    “fs”可能因为太短而被排除在搜索之外。

    检查innodb_ft_min_token_size的值和手动:https://dev.mysql.com/doc/refman/5.6/en/fulltext-fine-tuning.html

    您必须在更改该变量后重建索引。

    【讨论】:

    • 标记这是答案,因为它是确切的问题。 innodb_ft_min_token_size 设置为 3,所以“fs”太短了。
    【解决方案2】:

    您的查询应该有效。我的猜测是,您没有更改最小字长,因此“fs”从未被编入索引。有关这方面的信息,请参阅 here

    其他可能是文本中还有其他字符,可能是您看不到的字符。

    你可以试试这个

    select t.*
    from (select . . .
          WHERE MATCH(jobTitle) AGAINST ('+fs +sales' IN BOOLEAN MODE)
         ) t
    where jobTitle like '%fs sales%';
    

    这仅对匹配返回的集合上的like 执行。

    不过,我的最佳猜测是 innodb_ft_min_token_size 设置为其默认值 3,因此“fs”没有被编入索引。

    【讨论】:

    • innodb_ft_min_token_size 设置为 3,因此“fs”太短。 ft_min_word_len 设置为 1,所以我知道这不是问题所在。谢谢!
    • 不需要子查询:SELECT ... WHERE MATCH(...) AGAINST('+sales' ...) AND ... LIKE '%fs sales%';
    • @RickJames。 . .您确定在这种情况下首先执行MATCH() 吗?我的意思不是“哦,它似乎总是先走”。但它保证是第一吗?
    • @GordonLinoff - 很久以前,在一个古老的 MyISAM 世界里,我相信我听说 FT 部分总是排在第一位。如果他们为 InnoDB 改变了这一点,我不知道。 FT 排在第一位是有道理的,因为它通常是非常有选择性的。我不知道它是否可以使用“索引合并”,这可能是一个不错的选择。
    • @RickJames。 . . 完全 match() 排在第一位是有道理的。我从来没有在文档中遇到过保证首先处理它的参考——或者至少在where 子句仅包含anded 条件时建议它。
    【解决方案3】:

    你可以这样做

     select col1, col2 from table_name where text_column like '%fs sales%'
    

    这将返回所有包含 fs 销售额的记录..

    【讨论】:

    • 那不好 - 虽然它会起作用,但它会强制进行全表扫描,这会降低性能(这在这个系统中是不可接受的)
    猜你喜欢
    • 1970-01-01
    • 2011-07-04
    • 2018-12-07
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 2011-08-08
    相关资源
    最近更新 更多