【问题标题】:Partial Keyword Searching (MS SQL 2005)部分关键字搜索 (MS SQL 2005)
【发布时间】:2008-11-17 21:29:59
【问题描述】:

目前,我有一个存储过程,其主要目标是通过电影和电视节目的数据库表进行全文搜索。为了让它进行部分关键字搜索,我在 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 专家,我觉得我只是手动处理了上面的代码以使其工作。我感觉有一个更优雅或更强大的解决方案,但我还没有找到。

提前谢谢你

【问题讨论】:

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


    【解决方案1】:

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

    • 蝙蝠侠
    • 蝙蝠侠开始
    • 蝙蝠侠归来
    • 蝙蝠侠与罗宾:蝙蝠侠接管
    • 超越蝙蝠侠:Curaré 的味道
    • 超越蝙蝠侠:通天塔
    • 蝙蝠侠:第 2 季
    • 蝙蝠侠:大乱斗
    • 蝙蝠侠与罗宾:恐怖隧道
    • 超越蝙蝠侠 [动画电视剧]
    • 蝙蝠侠新历险记:诅咒!又上油了!
    • 蝙蝠侠的新冒险:这看起来像是蝙蝠螨的工作!

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 您对 SQL 2008 的看法可能是对的,因为我没有使用过它,但是到目前为止,Lucene 在更短的时间内为我提供了更好的结果和灵活性。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多