代码之家  ›  专栏  ›  技术社区  ›  Greg Beech

搜索和排列短短语(例如电影标题)

  •  6
  • Greg Beech  · 技术社区  · 16 年前

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

    然而,排名算法似乎证明是有问题的,使用 FREETEXTTABLE RANK 领域例如,当用户输入“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对结果进行排序的方式有关,SQL Server将词干词和同义词与原始词同等对待,并在排序时考虑到词密度,这对长段文本很好,但对这样的短短语并不适用。不幸的是,我开始觉得FTS不适合这份工作。

    3 回复  |  直到 16 年前
        1
  •  7
  •   Community Mohan Dere    9 年前

    听起来SQL FTS的排名很接近,但并不完全符合您的要求,您已经将“不完全”的情况缩小到三个:

    • 屈折形式与非屈折形式的排名相同
    • 单词的排序与其同义词相同
    • 精确匹配(或短标题)的排名与长标题中的一词匹配相同

    这三种方法的共同点是,一个非常简单的、自动的结果后处理程序可以使用这些规则来打破排名相同的结果之间的联系:如果存在精确匹配,则将其排名在非精确匹配之上,并将较短的标题排在较长的标题之前。您可能想考虑保持FTS,并简单地将一些代码(在存储的PROC或应用程序)放在FTS的上面,根据您所提到的标准,对成组的绑定结果进行排序。这可能比切换到Lucene或其他非Microsoft全文搜索实现更容易。

    如果我站在你的立场上,既然你已经在FTS上做了一些工作,我会尝试上面的后处理技术,看看它是否“足够好”来满足你的需求,因为这可能是最容易做到的事情。

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

    Pro Full-Text Search in SQL Server 2008 (该链接包含谷歌图书的一些摘录)。这能满足你的需要吗?如果没有,则有 lots of other options 既免费也不免费。

        2
  •  2
  •   carbocation    16 年前

    我知道你对重新发明轮子不感兴趣,但我想贡献一些东西,至少可以让你的轮子转动起来。

    How to Strike a Match 是我最喜欢的关于这个话题的帖子之一。在这本书中,作者根据单词之间顺序双元组的相似性来匹配字符串。

    这会惩罚长的、不相关的字符串,因为它们增加分母而不增加分子。

    我没有考虑过如何在SQL应用程序中直接实现这一点。

        3
  •  0
  •   Jaguar    16 年前

    在生产环境中使用SQL Server(2005)全文版和Lucene(.NET)后,我真的认为Lucene是更好的选择:

    Lucene in Action Luke (3). 它同样适用于Java&&。净额(5)。此外,如果这让你感到兴奋,还有冬眠&&NHibernate实现( Hibernate Search

    推荐文章