SQL全文搜索vs“LIKE”

时间:2009-01-25 22:57:00

标签: sql database full-text-search

假设我有一个相当简单的应用程序,允许用户在他们拥有的DVD上存储信息(标题,演员,年份,描述等),我希望允许用户通过任何这些字段搜索他们的收藏(例如“ Keanu Reeves“或”The Matrix“将是有效的搜索查询。)

使用SQL全文搜索与简单地用空格分割查询并在SQL语句中执行一些“LIKE”子句有什么好处?它只是表现更好还是实际上会返回更准确的结果?

9 个答案:

答案 0 :(得分:27)

全文搜索可能会更快,因为它将从用于查找记录的单词索引中受益,而使用LIKE则需要进行全表扫描。

在某些情况下,LIKE将更准确,因为LIKE“%The%”和LIKE“%Matrix”将选择“The Matrix”而不是“Matrix Reloaded”,而全文搜索将忽略“The”并返回两者。这说两者都可能是一个更好的结果。

答案 1 :(得分:9)

全文索引(索引)比使用LIKE(每次基本检查每一行)要快得多。但是,如果您知道数据库很小,则可能不需要使用全文索引。确定这一点的唯一方法是通过一些智能平均和基于该信息的一些测试。

准确性是一个不同的问题。全文索引允许您做几件事(加权,自动匹配吃/吃/吃等),你不可能在任何合理的时间范围内使用LIKE实现它。真正的问题是你是否需要这些功能。

如果不阅读全文档文档对这些功能的描述,您真的不知道应该如何继续。所以,请阅读!

此外,一些基本测试(在表格中插入一堆行,可能带有某种公共字典作为单词的来源)将大大有助于您做出决定。

答案 2 :(得分:7)

全文搜索查询要快得多。特别是在各个栏目中处理大量数据时。

此外,您将获得特定于语言的搜索支持。例如。当存储为“ueber”时,也会发现像“über”中的“ü”这样的德语变音符号。您还可以使用同义词来自动扩展搜索查询,或替换或替换特定短语。

  

在某些情况下,LIKE会更准确   因为LIKE“%The%”和LIKE“%Matrix”   将挑选出“黑客帝国”,但不是   “Matrix Reloaded”而全文   搜索将忽略“The”并返回   都。这说两者都可能有   是一个更好的结果。

这是不正确的。全文搜索语法允许您指定要搜索的“方式”。例如。通过使用CONTAINS语句,您可以使用精确的术语匹配以及模糊匹配,权重等。

因此,如果您遇到性能问题或希望提供更“类似Google”的搜索体验,请选择全文搜索引擎。它也很容易配置。

答案 3 :(得分:6)

只是几点说明:

  1. 如果您不使用%启动LIKE,LIKE可以使用索引查找。示例:LIKE'Santa M%'很好!像'%Maria'一样糟糕!并且可能导致表或索引扫描,因为无法以标准方式对其进行索引。

  2. 这非常重要。全文索引更新是异步的。例如,如果您对表执行INSERT,然后执行带有全文搜索的SELECT,而您希望新数据出现,则可能无法立即获取数据。根据您的配置,您可能需要等待几秒钟或一天。通常,当您的系统没有很多请求时,将填充全文索引。

答案 4 :(得分:3)

它会表现得更好,但除非您有大量数据,否则您不会注意到这种差异。 SQL全文搜索索引允许您使用比简单的“LIKE”操作更高级的运算符,但如果您所做的只是针对全文索引的LIKE操作,则结果将是相同的。

答案 5 :(得分:0)

想象一下,如果您允许在DVD上输入注释/描述。 在这种情况下,允许按描述进行搜索会很好。 在这种情况下,全文搜索会做得更好。

答案 6 :(得分:0)

您可能会获得更好的结果,或者至少使用全文索引更容易实现。但这取决于你希望它如何工作......

我想到的是,如果你要搜索两个单词,那么你必须手动实现(例如)一种方法来对列表中较高的那些进行加权。全文索引应该为您执行此操作,并允许您使用相关语法来影响权重。

答案 7 :(得分:0)

FullTextSearch作为LIKE添加到SQL Server中{。}} 首先,您必须创建一个StopList并将其分配给您的表

CREATE FULLTEXT STOPLIST [MyStopList];
GO
ALTER FULLTEXT INDEX ON dbo.[MyTableName] SET STOPLIST [MyStopList]
GO

其次,使用以下tSql脚本:

SELECT * FROM dbo.[MyTableName] AS mt
WHERE CONTAINS((mt.ColumnName1,mt.ColumnName2,mt.ColumnName3), N'"*search text s*"')

答案 8 :(得分:0)

如果你不只是搜索英文单词,说你搜索一个中文单词,那么你的fts如何标记单词将使你的搜索大不相同,就像我在这里举例https://stackoverflow.com/a/31396975/301513。但是我不知道sql server如何对中文单词进行标记,它是否做得很好?