gpt4 book ai didi

MySQL MATCH() AGAINST() FULLTEXT 索引 - 实现部分字符串匹配结合短语匹配

转载 作者:行者123 更新时间:2023-12-03 21:51:56 25 4
gpt4 key购买 nike

我有一个带有列 的表内容 有一个 全文索引 .
我要利用的速度匹配() 在大文本上。
我希望搜索尽可能准确。
当我以这种方式搜索短语字符串“ large truck ”时:

SELECT * FROM MyTable WHERE MATCH(content) AGAINST('"large truck"' IN BOOLEAN MODE);
遗漏了一些实例。
我的表:
|   content    |
----------------
|Large \n truck| FOUND ✓
----------------
|large truck | FOUND ✓
----------------
|large trucks | *PLURAL MISSED!
----------------
|large truckl | *TYPE-O MISSED!
如果我使用标准 喜欢 / 通配符方法:
SELECT * FROM  `MyTable` WHERE  `content` LIKE  '%large truck%'
我的表:
|   content    |
----------------
|Large \n truck| *MISSED!
----------------
|large truck | FOUND ✓
----------------
|large trucks | FOUND ✓
----------------
|large truckl | FOUND ✓
似乎我也不能将 PHRASE 搜索与通配符一起使用:
SELECT * FROM MyTable WHERE MATCH(content) AGAINST('"large truck*"' IN BOOLEAN MODE); **DOES NOT WORK**
或者
SELECT * FROM MyTable WHERE MATCH(content) AGAINST('"large truck"*' IN BOOLEAN MODE); **DOES NOT WORK**
所以...
如何成功使用 MATCH() AGAINST() 搜索短语并返回所有实例 - 甚至 不区分大小写的部分字符串匹配?

最佳答案

我经常与 FT 一起使用的技巧是分两步完成:

  • 做一个 MATCH ,希望得到所有想要的文本,但可能会有一些额外的结果。
  • AND有另一个条件 -- LIKE (更快)或 REGEXP (更有力)。
  • MATCH因为 FT 会很快;另一部分将第二次执行,所以它会很快,因为要检查的行不多。
    这符合您的标准:
    SELECT * FROM MyTable
    WHERE MATCH(content) AGAINST('+large +truck*' IN BOOLEAN MODE)
    AND content REGEXP "large[[:space:]]+truck";
    换句话说,查询将运行如下:
  • 假设该表有 10K 行。
  • 将评估 FT 表达式。 MATCH将非常快(因为它的设计方式)。它将在 content 中的任何位置找到同时包含“large”和“truck*”的所有行.现在,假设有 30 行满足该条件。
  • 其余的WHERE被评估。但它只针对那 30 行。所以,即使 REGEXP成本高昂,但并不经常这样做。
  • 然后可能返回 14 行。

  • 最终效果是整个查询“快速”运行,这是您的要求之一。
    注意:我需要第二部分来防止这些
    large green truck
    the truck is large
    根据版本,您可能需要这个 REGEXP: "large\\s+truck" .

    关于MySQL MATCH() AGAINST() FULLTEXT 索引 - 实现部分字符串匹配结合短语匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62843239/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com