目前,我有一个存储过程,其主要目标是通过电影和电视节目的数据库表进行全文搜索。为了让它进行部分关键字搜索,我在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
我对查询的问题是排名似乎并不完全符合我的预期。如果我只是寻找“蝙蝠侠”,人们会相信所有电影片头,首先或仅包含“蝙蝠侠”这个词,都会首先出现。但他们没有。
当人们搜索“蝙蝠侠”时会发生什么样的结果如下:
列表中更多的是我正在寻找的电影 - “蝙蝠侠开始”,甚至只是“蝙蝠侠”。
我正在寻找有关如何调整此查询的建议 - 我绝对不是SQL专家,我觉得我只是通过人工处理上面的代码来实现它。我觉得有一个更优雅或更强大的解决方案,我还没有找到它。
提前谢谢
答案 0 :(得分:1)
经过一些研究,我将尝试使用Lucene.Net作为我的电影标题搜索引擎,而不是依赖于SQL Server 2005中的全文搜索。早期的测试表明结果更好,与Lucene更相关。搜索“batman”将返回以下部分结果集:
答案 1 :(得分:0)
我认为您发现SQL Server全文的效果一样好,但您必须了解如何构建关键字。它与Lucene不同,特别是在索引方面。我认为你会发现SQL Server在可扩展性和功能方面会更好 - 特别是SQL 2008现在它是引擎的一部分。