2011-04-07 77 views
1

我最近正在做一些字符串搜索从一个约50k字符串的表中,我相当大,但不是那么大。我正在做一些“搜索结果内”的嵌套查询。我使用LIKE语句来获得搜索关键字的匹配。MySQL全文搜索,但使用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列中添加了查询的结果是104ms,这很快(我认为?)。

我的问题很简单,就是它有效使用LIKE或者是一个很好的做法,在一个表中都使用它全文加入时,我们通常会使用MATCH反对报表?

谢谢!

+0

您可以在nester SQL的**最内层**查询中始终使用全文索引。当然,这取决于你是否在寻找** wole words **的事实。 – vbence 2011-04-07 11:00:58

+0

@vbence真棒,我只是试图在最内层的查询结果是在15ms完成。这是在我的本地主机顺便说一句,但它更快地替换WHERE MATCH(str)AGAINST('term')WHERE str LIKE'%term%':) – tradyblix 2011-04-07 11:08:31

+0

大问题是,你只搜索完整的单词吗? – vbence 2011-04-07 11:23:33

回答

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开始,它将消除大部分记录,然后在几行上执行addtitional比较。 - 与此相反,如果你从term开始,你可能会得到很多可能的记录,然后你必须将它们与条款的st进行比较。

有趣的部分是,您可以使用原始的子选项示例强制进行比较的顺序。这给了机会,做决定这个术语是最严格的基于多韩刚的长度,但例如:

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

...等等。根据您正在处理的文本信息的类型,您也可以应用启发式

编辑:

这仅仅是一种预感,但它可能是可能的LIKE适用于words在全文indexitself。然后将这些行与索引进行匹配,就好像您已经为整个单词拼版一样。

我不确定这是否实际完成,但这将是一个聪明的事情,由MySQL人拉下来。还要注意,只有在全文搜索中实际发生的所有事件才能使用该理论。为此,您需要:

  • 您的搜索模式必须至少为最小字长的大小。 (如果您重新搜索示例%id%,则它也可以是3个字母的单词的一部分,默认形式为FULLTEXT索引)。
  • 您的搜索模式不得是任何列出的排除字词的子字符串,例如:and,of等
  • 您的模式不得包含任何特殊字符。
+0

有趣的是,我想我通过一个查询可以实现的子选择让它变得复杂,并且通过拥有它而达到标记,它会以严格的方式强制比较顺序。我尝试过,并且在速度方面没有太大区别。现在的问题是,当一个表与Fulltext索引一起应用时,是否正在使用** LIKE **有效和**正确**,就像该表刚刚索引以使其更快一样? – tradyblix 2011-04-07 12:14:23

+0

@tradyblix我在“LIKE”和“FULLTEXT”的答案中加入了一个新思想。 – vbence 2011-04-07 12:28:20

+0

明白了,所以在理论上它是可能的,但显然有些事情需要记住,可能会影响搜索。感谢您指出这一点,您提到的3件事是我从来没有想过的事情,如果是FULLTEXT索引,并且使用LIKE。很可能如果我想使用LIKE,我想我需要确保首先考虑一些事情。我很满意。 – tradyblix 2011-04-07 12:35:56