全文搜索与LIKE

pro*_*fvm 21 sql-server full-text-search fulltext-index sql-like

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

SELECT * from customer where name like %username%
Run Code Online (Sandbox Code Playgroud)

如果我使用全文来进行此查询可以ı采取更好的性能?SQL Server是否可以为%username%等查询使用全文索引优势?

Mik*_*ain 36

简短的回答

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

答案很长

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

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

SELECT Name
FROM Production.Product
WHERE CONTAINS(Name, ' "Chain*" ');
Run Code Online (Sandbox Code Playgroud)

将返回名为chainsaw,chainmail等的产品.在功能上,这不会获得任何超过标准LIKE运算符(LIKE 'Chain%'),并且只要列被索引,使用LIKE进行前缀搜索应该提供可接受的性能.

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

使用像,它可以进行高效的后缀通过创建一个新列的搜索,它的值设置为扭转你的目标列和索引它.然后,您可以查询如下:

SELECT Name
FROM Production.Product
WHERE Name_Reversed LIKE 'niahc%'; /* "chain" backwards */
Run Code Online (Sandbox Code Playgroud)

返回名称以"chain"结尾的产品.

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

SELECT Name
FROM Production.Product
WHERE Name LIKE 'chain%'
AND Name_Reversed LIKE 'niahc%';
Run Code Online (Sandbox Code Playgroud)

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

  • 结合前缀和反向后缀 hack 的非常有创意的想法!万万没想到! (2认同)

Ran*_*Zik 5

您必须了解索引是如何工作的。索引就像百科全书的枯木版一样。

如果您使用:

SELECT * from customer where name like username%
Run Code Online (Sandbox Code Playgroud)

全文索引或无全文索引都应该有效。但

SELECT * from customer where name like %username%
Run Code Online (Sandbox Code Playgroud)

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


Ale*_*rMP 0

根据我对全文索引的了解,我将做出以下推断:

  1. 建立索引后,它会解析文本,搜索单词(某些 RDBMS,如 MySQL,只考虑长度超过 3 个字符的单词),并将单词放入索引中。
  2. 当您在全文索引中搜索时,您会搜索单词,然后链接到该行。
  3. 如果我对前两个(对于 MSSQL)的看法是正确的,那么只有当您搜索长度为 4 个或更多字符的 WORDS 时,它才会起作用。如果您寻找“椅子”,它不会找到“扶手椅”。

假设所有这些都是正确的,我将继续做出以下声明:全文索引实际上是一个索引,它使搜索速度更快。它很大,并且搜索的可能性比 LIKE 少,但速度要快得多。

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