1

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

"batman*" ~ "be*"

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

以下是我的查询示例。@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

我对查询的问题是排名似乎并不完全符合我的预期。如果我只搜索“蝙蝠侠”,人们会认为所有以“蝙蝠侠”开头或仅包含“蝙蝠侠”一词的电影标题都会首先出现。但他们没有。
以下是仅搜索“batman”时发生的情况的示例结果:

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

更靠后的是我正在寻找的电影——“蝙蝠侠开始”,甚至只是“蝙蝠侠”。

我正在寻找有关如何调整此查询的建议——我绝对不是 SQL 专家,我觉得我只是手动处理了上面的代码以使其工作。我觉得有一个更优雅或更强大的解决方案,但我还没有找到它。

先感谢您

4

2 回答 2

1

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

  • 蝙蝠侠
  • 蝙蝠侠侠影之谜
  • 蝙蝠侠归来
  • 蝙蝠侠与罗宾:蝙蝠侠接管
  • 超越蝙蝠侠:Curaré
  • 超越蝙蝠侠:通天塔
  • 蝙蝠侠:第 2 季
  • 蝙蝠侠:颠倒黑白
  • 蝙蝠侠与罗宾:恐怖隧道
  • 超越蝙蝠侠 [动画电视剧]
  • 蝙蝠侠的新冒险:诅咒!又上油了!
  • 蝙蝠侠的新冒险:这看起来像是蝙蝠螨的工作!
于 2008-11-18T15:00:26.370 回答
0

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

于 2008-12-02T20:52:45.470 回答