【问题标题】:How MySQL will use FT index when searching is performed with an asterisk (wildcard) operator?使用星号(通配符)运算符执行搜索时,MySQL 将如何使用 FT 索引?
【发布时间】:2018-09-19 05:13:36
【问题描述】:

基本上,我有一个巨大的表(约 30m 条记录),其中一列有一个 fulltext 索引。

搜索查询如下所示:

... WHERE MATCH(body) AGAINST('+Hello +my*' IN BOOLEAN MODE) ...

我的存储引擎是 InnoDB,所以我们有一些限制:

  • 最小字长为 3 个字符。

但是,文档是这样说的:

如果一个词是用截断运算符指定的,它不是 从布尔查询中剥离,即使它太短(如确定 来自 ft_min_word_len 设置)或停用词。发生这种情况是因为 该词不会被视为太短或停用词,而是作为前缀 必须以开头的单词的形式出现在文档中 前缀。假设 ft_min_word_len=4。

问题是: MySQL 在这种情况下如何使用 FT 索引? bae 这个词不应该出现在任何索引中,因为它不符合最小字长的要求。也许这样的查询会慢一些?

【问题讨论】:

    标签: mysql innodb full-text-indexing


    【解决方案1】:

    查询可能会稍微慢一些,但不是因为您的推理。

    创建索引的时候也会用到最小字长设置,所以innodb不会索引小于最小字长的词。

    在执行全文搜索期间,innodb 会再次根据最小字长限制检查正在搜索的单词的长度,并消除比限制短的单词,因为它们在索引中找不到。因此,如果您的搜索条件为 'my'(注意没有星号),innodb 将忽略它。

    但是,当您使用通配符运算符时,字符数少于限制(例如您的 my*,它只有两个字符),这些仍然包含在搜索中,因为 innodb 会查看模式,而不仅仅是单词。

    显然,仅检查完全匹配比检查完全匹配和单词的开头要快,但速度上不会有显着差异。

    【讨论】:

    • 此外...'+my' 将找不到任何行,因为最小行长度。大概my* 不会找到任何 3 个字母的单词,但会找到 4 个字母的单词(当 min_len=4 时)。
    猜你喜欢
    • 2017-05-08
    • 2012-10-11
    • 2014-06-11
    • 2021-05-10
    • 1970-01-01
    • 1970-01-01
    • 2022-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多