使SQL Server索引变小
我们在一个项目中使用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(非类似条件)启动。