全文搜索与LIKE

时间:2010-11-16 13:14:23

标签: sql-server full-text-search sql-like fulltext-index

我的问题是关于使用全文。我知道像以%开头的查询从不使用索引:

SELECT * from customer where name like %username%

如果我使用全文来进行此查询,可以采取更好的性能吗? SQL Server是否可以为%username%?

等查询使用全文索引优势

6 个答案:

答案 0 :(得分:35)

简短回答

在SQL Server中执行中缀搜索没有有效的方法,既不在索引列上使用LIKE,也不使用全文索引。

答案很长

在一般情况下,没有与LIKE运算符等效的全文。虽然LIKE可以处理一串字符,并且可以对目标内的任何内容执行任意通配符匹配,但是设计全文仅对整个单词/术语进行操作。 (这是一个轻微的简化,但它的目的是为了这个答案。)

SQL Server全文支持带有前缀term运算符的LIKE子集。来自文档(http://msdn.microsoft.com/en-us/library/ms187787.aspx):

SELECT Name
FROM Production.Product
WHERE CONTAINS(Name, ' "Chain*" ');

将返回名为chainsaw,chainmail等的产品。从功能上讲,这不会超过标准LIKE运算符(LIKE 'Chain%'),只要列被索引,使用LIKE对于带前缀的搜索应该提供可接受的性能。

LIKE运算符允许您将通配符放在任何位置,例如LIKE '%chain',如您所述,这可以防止使用索引。但是使用全文,星号只能出现在查询词的末尾,所以这对你没有帮助。

使用LIKE, 可以通过创建新列,将其值设置为与目标列相反并对其编制索引来执行高效后缀搜索。然后,您可以按如下方式进行查询:

SELECT Name
FROM Production.Product
WHERE Name_Reversed LIKE 'niahc%'; /* "chain" backwards */

返回名称以“chain”结尾的产品。

我想你可以将前缀和反向后缀黑客结合起来:

SELECT Name
FROM Production.Product
WHERE Name LIKE 'chain%'
AND Name_Reversed LIKE 'niahc%';

实现(可能)索引的中缀搜索,但它并不是特别漂亮(我从未测试过这个以查看查询优化器是否会在其计划中使用这两个索引)。

答案 1 :(得分:3)

您必须了解索引的工作原理。索引就像百科全书的死木版一样。

如果您使用:

SELECT * from customer where name like username%

索引,全文或没有全文应该有效。但是

SELECT * from customer where name like %username%

永远不会与索引一起使用。这将是一个耗时的查询。

答案 2 :(得分:0)

在我对全文索引的了解中,我将进行以下推断:

  1. 在索引时,它解析文本,搜索单词(某些RDBMS,如MySQL,只考虑长于3个字符的单词),并将单词放在索引中。
  2. 在全文索引中搜索时,搜索单词,然后链接到该行。
  3. 如果我对前两个(对于MSSQL)是正确的,那么它只有在你搜索长度为4或更多字符的WORDS时才有效。如果你找'椅子',它将找不到'扶手椅'。
  4. 假设所有这些都是正确的,我将继续并发表以下声明:全文索引实际上是一个索引,它使搜索更快。它很大,搜索能力比LIKE少,但速度更快。

    更多信息:
    http://www.developer.com/db/article.php/3446891
    http://en.wikipedia.org/wiki/Full_text_search

答案 3 :(得分:0)

喜欢和包含非常不同 -

获取以下数据值

'约翰史密斯' 'sam smith' 'john fuller'

像's%'一样 'sam smith'

喜欢'%s%' '约翰·史密斯' 'sam smith'

包含's'

包含'john' '约翰·史密斯' 'john fuller'

包含's *' '约翰·史密斯' 'sam smith'

包含 s 返回与包含s *相同的内容 - 忽略初始星号,这有点痛苦但是索引是单词 - 而不是字符

答案 4 :(得分:0)

您可以使用:

SELECT * from customer where CONTAINS(name, 'username')

OR

SELECT * from customer where FREETEXT(name, 'username')

答案 5 :(得分:-2)

https://stackoverflow.com/users/289319/mike-chamberlain,你是对的,因为你认为它不足以搜索''WHERE Name LIKE'chain%' AND Name_Reversed LIKE 'niahc%'不等于喜欢'%chain%'****