【问题标题】:MySQL Fulltext search but using LIKEMySQL全文搜索但使用LIKE
【发布时间】:2011-04-07 10:56:29
【问题描述】:

我最近正在从一个包含大约 50k 个字符串的表中进行一些字符串搜索,我会说相当大,但没有那么大。我正在为“在结果中搜索”做一些嵌套查询。我正在使用 LIKE 语句来获得搜索关键字的匹配。

我遇到了我尝试过的 MySQL 全文搜索,因此我在我的 str 列中添加了全文索引。我知道全文搜索不适用于虚拟创建的表,甚至不适用于Views,因此不适合带有子选择的查询。我提到我在做一个嵌套查询,例子是:

SELECT s2.id, s2.str 
FROM 
    (
    SELECT s1.id, s1.str 
    FROM 
        (
         SELECT id, str 
         FROM strings 
         WHERE str LIKE '%term%'
         ) AS s1 
    WHERE s1.str LIKE '%another_term%'
    ) AS s2 
WHERE s2.str LIKE '%a_much_deeper_term%';

这实际上还没有应用于任何代码,我只是在做一些测试。此外,使用 Sphinx(性能方面)可以轻松实现这样的搜索字符串,但让我们考虑 Sphinx 不可用,我想知道这将如何在纯 SQL 查询中正常工作。在未添加全文的表上运行此查询大约需要 2.97 secs。 (取决于搜索词)。但是,在将全文添加到str 列的表上运行此查询在 104 毫秒内完成,这很快(我认为?)。

我的问题很简单,使用 LIKE 是否有效,或者在通常我们使用 MATCH 和 AGAINST 陈述?

谢谢!

【问题讨论】:

  • 您始终可以在嵌套 SQL 的 innermost 查询中使用全文索引。当然,这取决于您是否在搜索 wole words
  • @vbence 太棒了,我刚刚尝试在最里面的查询中,结果在 15 毫秒内完成。顺便说一句,这是在我的本地主机中,但是将 WHERE str LIKE '%term%' 替换为 WHERE MATCH(str) AGAINST('term') 会更快:)
  • 最大的问题是,您只搜索完整的单词吗?
  • @vbence 不,字符串出现在字符串中。但是你是对的,如果它是一个完整的单词搜索,最好在最里面使用 fullindex。谢谢提醒

标签: mysql sql


【解决方案1】:

在这种情况下,您不一定需要子选择。你可以简单地使用:

SELECT id, str
FROM item_strings
WHERE str LIKE '%term%'
   AND str LIKE '%another_term%'
   AND str LIKE '%a_much_deeper_term%'

...但也提出了一个很好的问题:您排除行的顺序。我猜 MySQL 足够聪明,可以假设最长的期限是最严格的,所以从 a_much_deeper_term 开始,它将消除大部分记录,然后只对几行执行额外的比较。 - 与此相反,如果您以 term 开头,您可能会得到许多可能的记录,那么您必须将它们与术语的 st 进行比较。

有趣的是,您可以使用原始的 subselect 示例强制进行比较的顺序。这使您有机会根据更多的长度来决定哪个术语的限制最大,但例如:

  • 辅音和元音的比例
  • 单词中最长的辅音链
  • 单词中最常用的元音

...等等。您还可以根据您正在处理的文本信息的类型应用一些启发式方法

编辑:

这只是一种预感,但可以将LIKE 应用于全文索引本身中的words。然后将行与索引匹配,就好像您已经搜索了完整的单词一样。

我不确定这是否真的完成了,但由 MySQL 人员完成将是一件聪明的事情。另请注意,只有当所有可能的出现实际上都在全文搜索中时,才能使用该理论。为此,您需要:

  • 您的搜索模式必须至少是最小字长的大小。 (如果您正在搜索例如 %id%,那么它也可以是 3 个字母单词的一部分,默认情况下会从 FULLTEXT 索引中排除)。
  • 您的搜索模式不能是任何列出的排除词的子字符串,例如:and、of 等。
  • 您的模式不得包含任何特殊字符。

【讨论】:

  • 有趣,我想当我可以通过单个查询实现它并且您通过它达到目标时,我的子选择使它变得复杂,它强制比较顺序严格的方式。我试过了,在速度方面并没有太大的区别。现在的问题是,当使用全文索引应用表时,是否使用 LIKE 有效且 proper 就好像该表只是被索引以使其快速?
  • @tradyblix 我在关于LIKEFULLTEXT 的回答中添加了一个新想法。
  • 知道了,所以理论上这是可能的,但显然有一些事情需要记住,这可能会影响搜索。感谢您指出这一点,您提到的那 3 件事是我从未想过的事情,如果是 FULLTEXT 索引并使用 LIKE 的话。很可能如果我想使用 LIKE,我想我需要确保首先考虑一些事情。我很满意。
猜你喜欢
  • 2011-08-03
  • 1970-01-01
  • 2013-04-21
  • 1970-01-01
  • 2010-10-03
  • 1970-01-01
  • 2011-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多