2008-09-16 65 views
5

我们在项目中使用SQL Server 2005。系统的用户可以使用“关键字”搜索某些对象。我们实现这一目标的方式是为每个表中可能包含这些'关键字'的重要列创建一个全文目录,然后使用CONTAINS搜索用户在该索引中的搜索框中输入的关键字。例如,假设你有电影对象,并且你想让用户在文章的标题和正文中搜索关键词,那么我们将索引标题和剧情栏目,然后这样做:使SQL Server索引为小数字

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

这些“小词”被认为是“噪音词”的全文索引。您可以自定义噪音词汇列表。这blog post提供了更多的细节。当您更改干扰词文件时,您需要重新填充全文索引。

0

我知道噪音的话文件,但我不为什么你的“终结者2”的例子仍然是给你的问题。你可能想试着在MSDN Database Engine forum上问这个专门研究这类事情的人。

0

您可以组合CONTAINS(或CONTAINSTABLE)用简单的有条件的地方:

SELECT * FROM电影WHERE CONTAINS(标题, ' “终结者2”')和标题LIKE '%终结者2%'

当CONTAINS找到所有终结者时,将会消除'终结者1'。

当然,引擎足够聪明,以CONTAINS开始而不是类似的条件。