2009-01-25 266 views
29

比方说,我有一个相当简单的应用程序,可以让用户在自己的DVD上存储信息(标题,演员,年份,描述等),并且我想让用户搜索他们的收藏通过这些字段中的任何一个(例如“Keanu Reeves”或“The Matrix”将是有效的搜索查询)。SQL全文检索vs“LIKE”

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

回答

27

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

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

+0

我们不能创建一个字符[模式]的索引(https://www.postgresql.org/docs/9.5/static/indexes-opclass.html)吗? – overexchange 2017-08-25 10:26:57

3

它会表现更好,但除非你有很多数据,否则你不会注意到这种差异。 SQL全文搜索索引使您可以使用更高级的操作符,然后执行简单的“LIKE”操作,但如果您只是对全文索引执行LIKE操作,那么结果将是相同的。

0

想象一下,是否允许在DVD上输入注释/说明。 在这种情况下,允许按说明进行搜索将会很好。 在这种情况下的全文搜索将会做得更好。

9

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

准确性是一个不同的问题。全文索引允许您使用LIKE在任何合理的时间范围内执行一些操作(权重,自动匹配吃饭/吃饭/进食等)。真正的问题是你是否需要这些功能。

没有阅读全文文档对这些功能的描述,你实际上并不知道应该如何继续。所以,阅读!另外,一些基本的测试(在表格中插入一堆行,可能带有某种公用字典作为单词来源)将会帮助你做出决定。

0

你可能会得到稍微好一点的结果,或者至少有一个更容易的全文索引实现。但这取决于你想如何工作...

我脑海中想的是,如果你正在搜索两个单词,像LIKE你必须然后手动实现(例如)一个方法来重量与在名单上更高。全文索引应该为你做这件事,并允许你使用相关的语法来影响权重。

7

全文搜索查询速度更快。特别是在处理各种列中的大量数据时。

此外,您将有语言特定的搜索支持。例如。当“uber”存储时,也会找到“über”中的“ü”这样的德语变音符号。您也可以在自动展开搜索查询的位置使用同义词,或者替换或替换特定的短语。

在某些情况下,像会更准确 因为LIKE“%的%”等“%黑客帝国” 将挑选出“黑客帝国”,而不是 “重装上阵”,而全文 搜索将忽略“该“并返回 两者。这表示两者都可能有 是一个更好的结果。

这是不正确的。全文搜索语法可让您指定要搜索的“如何”。例如。通过使用CONTAINS声明,您可以使用精确词语匹配以及模糊匹配,权重等。

因此,如果您有性能问题或希望提供更类似Google的搜索体验,请进行全文搜索发动机。这也很容易配置。

6

就在几个注意事项:

  1. LIKE可以使用索引查找,如果你不以%开始你喜欢的。例如:LIKE'Santa M%'很好! LIKE'%Maria'很糟糕!并可能导致表或索引扫描,因为这不能以标准方式索引。

  2. 这是非常重要的。全文索引更新是异步的。例如,如果您在一个表上执行INSERT,然后在您希望显示新数据的全文本搜索中执行SELECT,则可能无法立即获取数据。根据您的配置,您可能需要等待几秒钟或一天。通常情况下,当您的系统没有太多请求时,填充全文索引。

0

FullTextSearch在SQL Server作为LIKE
首先,你必须创建一个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*"') 
0

如果您不只是搜索英文单词,假设您搜索中文单词,那么您的英文单词如何标记单词使你的搜索有很大的不同,因为我在这里给出了一个例子https://stackoverflow.com/a/31396975/301513。但我不知道sql server如何标记中文单词,它是否做得很好?