6

我们在一个项目中使用 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,重新生成索引并尝试搜索。

4

3 回答 3

2

这些“小词”被全文索引视为“干扰词”。您可以自定义干扰词列表。此博客文章提供了更多详细信息。当您更改干扰词文件时,您需要重新填充全文索引。

于 2008-09-16T12:11:49.513 回答
0

我知道噪音词文件,但我不是为什么您的“终结者 2”示例仍然给您带来问题。您可能想尝试在MSDN 数据库引擎论坛上问这个问题,专门从事这类事情的人在那里闲逛。

于 2008-09-16T21:51:03.927 回答
0

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

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

当 CONTAINS 找到所有终结者时,哪里会消除“终结者 1”。

当然,引擎足够聪明,可以在 CONTAINS 而不是类似的条件下启动。

于 2008-09-23T23:18:39.450 回答