2008-11-17 79 views
1

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

'“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专家,我觉得我只是人为地处理了上面的代码以使其工作。我有一种感觉,有一个更优雅或强大的解决方案,我还没有找到它。

预先感谢您

回答

1

一些经过研究,我将尝试使用Lucene.Net我的电影片尾字幕搜索引擎,而不是依靠全文在SQL Server 2005年初搜索测试表明,结果与Lucene更好,更相关。一种“蝙蝠侠”的搜索将返回下面的部分结果集:

  • 蝙蝠侠
  • 蝙蝠侠
  • 蝙蝠侠归来
  • 蝙蝠侠与罗宾:蝙蝠侠接管
  • 以远蝙蝠侠:淡淡箭毒
  • 以远蝙蝠侠:巴贝尔
  • 蝙蝠侠:赛季02
  • 蝙蝠侠:乱七八糟的
  • 蝙蝠侠与罗宾:恐怖
  • 的隧道
  • 以远蝙蝠侠[动画电视连续剧]
  • 蝙蝠侠新的冒险:诅咒!再次上油!
  • 蝙蝠侠新冒险:这看起来像蝙蝠螨的工作!
0

我想你会发现SQL Server Full Text的工作原理一样好,但你必须了解如何构建关键字。它与Lucene不一样,特别是在索引方面。我想你会发现SQL Server在可伸缩性和功能方面会更好 - 尤其是SQL 2008现在它是引擎的一部分。

+0

您可能对SQL 2008有所了解,因为我还没有使用它,但到目前为止,Lucene已经给我提供了更好的结果和灵活性,而且时间更少。 – Carl 2008-12-03 14:51:13