使SQL Server索引变小

时间:2020-03-05 18:55:44  来源:igfitidea点击:

我们在一个项目中使用SQL Server 2005. 系统的用户可以使用"关键字"搜索某些对象。我们实现此方法的方式是,为每个表中可能包含这些"关键字"的重要列创建一个全文目录,然后使用CONTAINS搜索用户在该索引的搜索框中输入的关键字。

因此,例如,假设我们拥有Movie对象,并且想要让用户在文章的标题和正文中搜索关键字,然后我们将同时在Title和Plot列中建立索引,然后执行以下操作:

SELECT * FROM Movies WHERE CONTAINS(Title, keywords) OR CONTAINS(Plot, keywords)

(实际上比这要先进一些,但没有什么非常复杂的)

一些用户在搜索中添加数字,例如,他们想找到"终结者2"。据我所知,这里的问题是,根据我所知,默认情况下,SQL Server不会索引短单词,因此进行如下搜索:

SELECT * FROM Movies WHERE CONTAINS(Title, '"Terminator 2"')

实际上等效于执行此操作:

SELECT * FROM Movies WHERE CONTAINS(Title, '"Terminator"') <-- notice the missing '2'

我们得到了很多虚假的结果。

有没有一种方法可以强制SQL Server为小单词建立索引?最好是,我宁愿只索引数字(例如1、2、21等)。我不知道在哪里定义索引标准,或者甚至可能如此具体。

好吧,我做到了,从列表中删除了"噪音词",现在的行为有所不同,但仍然不是我们期望的。

搜索不会找到"终结者2"(我只是在编造这个词,如果我透露自己在做什么,我的老板可能不会很高兴……无论如何,术语有些不同,但原理相同) ,我什么也没得到,但是我知道有些对象包含两个单词。

也许我做错了什么?我从ENG,ENU和NEU(中性)的噪声配置中删除了所有数字1 ... 9,重新生成了索引,然后尝试了搜索。

解决方案

回答

这些"小词"在全文索引中被认为是"杂音词"。我们可以自定义干扰词列表。这篇博客文章提供了更多细节。更改干扰词文件时,需要重新填充全文本索引。

回答

我知道干扰词文件,但我不知道为什么"终结者2"示例仍然给我们带来问题。我们可能想尝试在MSDN数据库引擎论坛上询问此问题,专门从事这种事情的人们在哪里闲逛。

回答

我们可以将CONTAINS(或者CONTAINSTABLE)与简单的where条件结合使用:

从电影的内容中选择*(标题,""终结者2"")和标题,例如'%Terminator 2%'

当CONTAINS找到所有终结者时,哪里将消除"终结者1"。

当然,发动机足够聪明,可以以CONTAINS(非类似条件)启动。