部分关键字搜索(MS SQL 2005)

时间:2008-11-17 21:29:59

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

目前,我有一个存储过程,其主要目标是通过电影和电视节目的数据库表进行全文搜索。为了让它进行部分关键字搜索,我在SQL中添加了一些代码,用空格分割搜索查询,并输出如下语句:

"batman*" ~ "be*"

例如,原始字符串“batman be”可以在用户输入时从页面上的文本框生成,并且在每个javascript keyup事件中,我将该文本框中的任何内容发送到存储的proc以获得结果在我输入时获得结果(如自动完成)。在这种情况下,用户可能一直在寻找“蝙蝠侠开始”,或“蝙蝠侠:蝙蝠女开始”(电视节目集),他们都应该出现在结果中。

以下是我的查询示例。在上面的示例中,@ partialKeywordString是"batman*" ~ "be*"

SELECT f.title
FROM Films f INNER JOIN
    CONTAINSTABLE(Films, Title, @partialKeywordString) f_key ON f.filmid = f_key.[key]
ORDER BY f_key.Rank DESC

我对查询的问题是排名似乎并不完全符合我的预期。如果我只是寻找“蝙蝠侠”,人们会相信所有电影片头,首先或仅包含“蝙蝠侠”这个词,都会首先出现。但他们没有。
当人们搜索“蝙蝠侠”时会发生什么样的结果如下:

<蝙蝠侠:动画系列 - 第114集“
“蝙蝠侠和罗宾历险记 - 第218集”
“蝙蝠侠和罗宾 - 第101集” “蝙蝠侠 - 第101集”
“蝙蝠侠和罗宾 - 第204集”

列表中更多的是我正在寻找的电影 - “蝙蝠侠开始”,甚至只是“蝙蝠侠”。

我正在寻找有关如何调整此查询的建议 - 我绝对不是SQL专家,我觉得我只是通过人工处理上面的代码来实现它。我觉得有一个更优雅或更强大的解决方案,我还没有找到它。

提前谢谢

2 个答案:

答案 0 :(得分:1)

经过一些研究,我将尝试使用Lucene.Net作为我的电影标题搜索引擎,而不是依赖于SQL Server 2005中的全文搜索。早期的测试表明结果更好,与Lucene更相关。搜索“batman”将返回以下部分结果集:

  • 蝙蝠侠
  • 蝙蝠侠开始
  • 蝙蝠侠归来
  • 蝙蝠侠和罗宾:蝙蝠侠接管
  • 蝙蝠侠超越:Curaré的触摸
  • 蝙蝠侠超越:巴贝尔
  • 蝙蝠侠:第02季
  • 蝙蝠侠:Topsy Turvy
  • 蝙蝠侠和罗宾:恐怖隧道
  • 蝙蝠侠超越[动画电视剧]
  • 蝙蝠侠的新冒险:诅咒!再次涂油!
  • 蝙蝠侠的新冒险:这看起来像蝙蝠螨的工作!

答案 1 :(得分:0)

我认为您发现SQL Server全文的效果一样好,但您必须了解如何构建关键字。它与Lucene不同,特别是在索引方面。我认为你会发现SQL Server在可扩展性和功能方面会更好 - 特别是SQL 2008现在它是引擎的一部分。