【问题标题】:Questions about fulltext-index performance关于全文索引性能的问题
【发布时间】:2022-11-17 04:13:46
【问题描述】:

我搜索了一个搜索引擎,但是价格昂贵或者构建起来似乎需要很多时间,所以我想通过'歌手名称音乐名称'将其保存并用作fullText-index。

然而,即使我不停地寻找,它也不断地与like进行比较,介绍的也只是功能的优点,缺点即使再找也很难看出。

目前除了创建30000左右数据时索引会增长外没有什么大问题,所以我打算使用它,但我想知道fulltext-index的缺点是什么!

如果你另外搜索,他们说最好安装一个词素分析器,但我打算使用 ngram=1 的 ngram 分析器。

另外)如果索引太大可能是个问题,我想知道如何增加 ngram 大小并搜索 2 个或更少的字母。

【问题讨论】:

    标签: mysql full-text-search


    【解决方案1】:

    FULLTEXT 的缺点。请注意,许多问题都可以解决,但需要额外的代码。

    • “字母”的定义。也就是说,某些标点符号被视为分词。您可能能够忍受它,或者您可以清理输入(见下文)。
    • 最小字长 -- 默认值为 3。您可以将其降低到 2 甚至 1,但这是要付出代价的。避免在“消毒”中使用短词是一种解决方案。
    • 不能强制出现短词和停用词。 (我认为这是一个错误。)AGAINST ("+john +q +smith" IN BOOLEAN MODE) 总是会失败。另一方面,这会成功,尽管它可能会提供太多行:AGAINST ("+john q +smith" IN BOOLEAN MODE)。也就是说,“John W Smith”将会成功。参见下面的“微调”。
    • 当单词的顺序很重要时(你想要“foo bar”,而不是“bar foo”或“foo blah blah bar”),你可以在 FT 中使用一些引号来强制这样做。 (注意短词。)
    • “停用词”——有一个不索引的词列表(例如,“the”)。您可以指向不同的列表。 (我没有想到细节。)
    • 全有或全无——我在这里提到的许多可调项适用于全部系统中的 FT 索引。您可能需要找到一种解决方法来获得不同表中不同设置的效果。

    消毒输入。由于制造商的自由,零件号和型号是一件令人讨厌的事情。示例:“模型 3”——“模型”是一个很好的全文“词”,但“3”不是。您可以 [也许] 调整输入 (插入时) 说“Model3”。另一个例子“xyz-123”。另一个:“约翰·Q·史密斯”

    合并列。将可能的 FT 字符串(来自许多列)放在一起并将它们放入一个纯粹用于搜索的列中可能是有益的。在插入数据时进行清理。

    微调。这是一种解决方法一些打嗝:

    WHERE MATCH(texts) AGAINST ("+john q +smith" IN BOOLEAN MODE)
      AND texts LIKE "%John Q. Smith%"
    

    说明... FT 测试将首先进行并且速度很快。然后是 LIKE(或 REGEXP),速度慢得多,但不是问题,因为它仅应用于通过 FT 测试的那些行。示例:“John Jones and Phil Smith”将通过MATCH,但随后被LIKE 过滤掉。

    更多注意事项:http://mysql.rjweb.org/doc.php/myisam2innodb#fulltext

    您的问题开始暗示“单词”,然后偏离到“ngram”可能更好的情况。如果是“名字”(歌手、音乐标题等),那么 ngram 可能不值得考虑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-31
      • 2018-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多