假设我有一个相当简单的应用程序,它允许用户在他们拥有的 DVD 上存储信息(标题、演员、年份、描述等),我希望允许用户通过这些字段中的任何一个搜索他们的收藏(例如“Keanu Reeves”或“矩阵”将是有效的搜索查询)。
使用 SQL 全文搜索与简单地将查询按空格分开并在 SQL 语句中执行一些“LIKE”子句有什么优势?它只是表现得更好,还是实际上会返回更准确的结果?
假设我有一个相当简单的应用程序,它允许用户在他们拥有的 DVD 上存储信息(标题、演员、年份、描述等),我希望允许用户通过这些字段中的任何一个搜索他们的收藏(例如“Keanu Reeves”或“矩阵”将是有效的搜索查询)。
使用 SQL 全文搜索与简单地将查询按空格分开并在 SQL 语句中执行一些“LIKE”子句有什么优势?它只是表现得更好,还是实际上会返回更准确的结果?
全文搜索可能会更快,因为它将受益于用于查找记录的单词索引,而使用 LIKE 则需要进行全表扫描。
在某些情况下,LIKE 会更准确,因为 LIKE "%The%" AND LIKE "%Matrix" 会选择 "The Matrix" 而不是 "Matrix Reloaded",而全文搜索将忽略 "The" 并返回两者。也就是说,两者都可能是一个更好的结果。
全文索引(即索引)比使用 LIKE(基本上每次都检查每一行)要快得多。但是,如果您知道数据库会很小,则可能没有性能需要使用全文索引。确定这一点的唯一方法是进行一些智能平均和基于该信息的一些测试。
准确性是一个不同的问题。全文索引允许你做几件事(加权、自动匹配吃/吃/吃等),你不可能在任何合理的时间范围内使用 LIKE 实现它。真正的问题是您是否需要这些功能。
如果不阅读全文文档对这些功能的描述,您真的不知道应该如何进行。所以,请阅读!
此外,一些基本测试(在表中插入一堆行,可能使用某种公共字典作为单词来源)将大大有助于您做出决定。
全文搜索查询要快得多。特别是在处理不同列中的大量数据时。
此外,您将获得特定语言的搜索支持。例如,当存储为“ueber”时,也会发现像“über”中的“ü”这样的德语变音符号。您还可以使用同义词来自动扩展搜索查询,或者替换或替换特定短语。
在某些情况下,LIKE 会更准确,因为 LIKE "%The%" AND LIKE "%Matrix" 会选择 "The Matrix" 而不是 "Matrix Reloaded",而全文搜索将忽略 "The" 并返回两者。也就是说,两者都可能是一个更好的结果。
这是不正确的。全文搜索语法允许您指定搜索的“方式”。例如,通过使用CONTAINS语句,您可以使用精确术语匹配以及模糊匹配、权重等。
因此,如果您有性能问题或想提供更“类似于 Google”的搜索体验,请选择全文搜索引擎。它也很容易配置。
只是一些注意事项:
如果您的 LIKE 不以 % 开头,LIKE 可以使用 Index Seek。示例:LIKE 'Santa M%' 很好!LIKE '%Maria' 不好!并且可能导致表或索引扫描,因为这不能以标准方式索引。
这个非常重要。全文索引更新是异步的。例如,如果您在一个表上执行 INSERT,然后执行带有全文搜索的 SELECT,您希望新数据出现在该处,您可能不会立即获得数据。根据您的配置,您可能需要等待几秒钟或一天。通常,当您的系统没有很多请求时,会填充全文索引。
它会表现得更好,但除非你有很多数据,否则你不会注意到这种差异。SQL 全文搜索索引允许您使用比简单的“LIKE”操作更高级的运算符,但如果您所做的只是对全文索引执行 LIKE 操作,那么您的结果将是相同的。
想象一下,如果您允许在 DVD 上输入注释/描述。在这种情况下,最好允许按描述进行搜索。在这种情况下,全文搜索会做得更好。
您可能会得到稍微好一点的结果,或者至少可以更轻松地实现全文索引。但这取决于您希望它如何工作...
我想到的是,如果您正在搜索两个单词,那么您必须使用 LIKE 手动实现(例如)一种方法来加权列表中较高的单词。全文索引应该为您执行此操作,并允许您使用相关语法来影响权重。
首先,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*"')
If you do not just search English word, say you search a Chinese word, then how your fts tokenizes words will make your search a big different, as I gave an example here https://stackoverflow.com/a/31396975/301513. But I don't know how sql server tokenizes Chinese words, does it do a good job for that?