sql-server-2008 - 搜索和排名短语(例如电影标题)

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

我正在尝试改进我们的短语搜索能力(在我们的例子中是电影标题),目前正在研究 SQL Server 2008 全文搜索,它提供了一些我们想要的功能:

  • 词干(例如“saw”也表示“see”、“seen”等)
  • 同义词(例如“6”与“VI”同义)

  • 然而,排名算法似乎有问题,使用 FREETEXTTABLE使用搜索词并提取 RANK field 。例如,当用户输入“saw”时,我们在没有目录的情况下得到的结果是:
    RANK | Title
    ---------------------------------------------------------------------
    180  | The Exorcist: The version you've never seen
    180  | Saw IV
    180  | Saw V
    180  | Anybody Here Seen Jeannie?
    180  | Seeing Red
    

    所有这些都具有相同的排名,尽管人们很清楚第二个和第三个条目比其他词干更匹配。

    同样输入“moon”会得到以下结果:
    RANK | Title
    ---------------------------------------------------------------------
    144  | Pink Floyd - The Dark Side of the Moon
    144  | Fly Me To The Moon 3D
    144  | Twilight: New Moon
    144  | Moon
    

    在这里,虽然没有词干匹配,但人们很清楚“月亮”的最佳匹配是“月亮”,而不是仅包含它作为标题一部分的较长标题,但 FTS 对它们进行平等排名。

    我猜这可能与 SQL Server 对结果进行排序的方式有关,它将词干词和同义词与原始术语同等权重,并考虑了用于排名的词密度,这对于长段文本来说会很好,但并不真正适用于像这样的短语。因此,不幸的是,我开始认为 FTS 不适合这份工作。

    我真的不想重新发明轮子,那么是否有任何现有的搜索解决方案适用于标题并提供良好的排名以及词干/词库功能?如果它有一个拼写检查器来实现像谷歌这样的“你的意思是......”功能也会很好,所以“saww”会被更正为“saw”,“mon”会被更正为“moon”等。

    最佳答案

    听起来 SQL FTS 的排名很接近,但不完全是您正在寻找的内容,并且您已将“不完全”的情况缩小到三个:

  • 屈折形式与非屈折形式的排名相同
  • 单词的排名与其同义词相同
  • 完全匹配(或短标题)与长标题中的单字匹配排名相同

  • 这三者的共同点是,一个非常简单的自动结果后处理器可以使用这些规则来打破排名相同的结果之间的联系:如果存在完全匹配,则将其排在非完全匹配之上,然后排名较短的标题先于较长的标题。您可能需要考虑保留 FTS,并简单地将一些代码(在存储过程中或在您的应用程序中)放在 FTS 之上,根据您提到的标准对绑定(bind)结果组进行排序。这可能比切换到 Lucene 或其他非 Microsoft 全文搜索实现更容易。

    如果我站在你的立场上,因为你已经有了 FTS 的工作,我会尝试上面的后处理黑客,看看它是否“足够好”来满足你的需求,因为它可能是最简单的事情去做。

    如果还不够好,我先看看Lucene.NET (免费),Solr (免费)和dtSearch ($$$)。但请注意,没有一个会像 FTS 那样简单——尤其是 Lucene.NET,它是 AFAIK 最流行的并且功能非常齐全,但需要大量的编码、配置、维护等。你可以看到 this SO thread对于其他一些意见,如果您想要更多意见,那么在 SO 和其他地方可能会有更多这样的线程。

    如果您正在寻找“您的意思是……”拼写建议功能。 Pro Full-Text Search in SQL Server 2008 中有一个在 FTS 之上构建此类功能的示例(链接包含谷歌图书的一些摘录)。这能满足您的需求吗?如果没有,有lots of other options免费和不免费。

    关于sql-server-2008 - 搜索和排名短语(例如电影标题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1757462/

    相关文章:

    sql-server - SQL Server 2008 备份失败 : BACKUP DATABASE is terminating abnormally

    sql-server - 聚集索引默认排序顺序

    sql - 如何合并结果中的两行而不是所有结果?

    sql-server-2008 - Visual Studio 2010 数据库项目 : Are there any videos/tutorials or comments about the new Database Project Types?

    php - 使用 "LIKE"匹配mysql查询中的多个单词

    php - 更新主表内第二个表中的相似关键字

    .net - SQLite:没有这样的模块:System.Data.SQLite.dll 1.0.101.0 的 fts5 错误

    sql - 内连接表但仅从一张表中选择

    MySQL 全文搜索 boolean 模式部分匹配

    java - Lucene 和访问控制(评论的可见性)