SQL Server全文搜索困境

时间:2011-07-08 20:31:02

标签: sql-server sql-server-2008 full-text-search

我有一个表(目录),有一列(标题)。此列存储有关歌曲(艺术家,标题,混音)的信息。我有一种情况需要从搜索词中找到匹配项。

我启用了SQL Server FTS并使用Title列创建了一个FTS目录。我开始使用FREETEXTTABLE进行测试,然后传入搜索词。

我发现这会返回许多不相关的结果,尽管排名最高的结果通常是正确的,如果标题存在于目录表中。我的一种方法是将RANK转换为百分比,仅显示百分比大于90的结果。问题是如果目录表中不存在标题,查询仍会返回不相关的结果。

另一种方法是使用CONTAINSTABLE。这里的问题是我必须在代码中动态生成查询(分解单词),创建类似的东西:

SELECT DISTINCT ft.[rank], [Id]
FROM CONTAINSTABLE(Catalogs, Title, '"artist" AND "title" AND "remix"') AS ft
JOIN [Catalogs] ON [Catalogs].[Id] = ft.[KEY]

困境是搜索词中没有分隔符。这意味着我无法在逻辑上将字符串分解为艺术家和标题,而只是单词。有时包含其他术语,如标签,这将导致上述查询失败。

我有点卡住了。有没有人使用SQL Server FTS处理类似的问题?在CONTAINSTABLE和FREETEXTTABLE之间是否存在方法?

1 个答案:

答案 0 :(得分:3)

我们遇到了类似的问题,允许用户输入免费的查询搜索字符串,但我们不得不使用CONTAINS,因为FREETEXT返回了太多的误报。我们最终在业务层上编写了我们自己的搜索项解析例程,用于擦除字符串并用AND替换任何空格。当然,这必须足够聪明,以适应逻辑分组(当人们使用括号时)和多个空格。它似乎对我们有用。

我对您的专栏中的数据结构有点好奇。如果艺术家,标题和混音真的是独立的信息位,那么将它们保存为不同的列并单独查询它们是否有意义?