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

Gre*_*ech 6 full-text-search sql-server-2008

我正在努力提高短语的搜索功能(在我们的案例中是电影标题),目前正在查看SQL Server 2008全文搜索,它提供了我们想要的一些功能:

  • 词干(例如"锯"也意味着"看","看"等)
  • 同义词(例如"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
Run Code Online (Sandbox Code Playgroud)

所有这些都具有相同的等级,即使一个人清楚地知道第二和第三个条目是比其他词干术语更好的匹配.

同样输入"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
Run Code Online (Sandbox Code Playgroud)

虽然这里没有词干匹配,但对于一个人而言,"月亮"的最佳匹配是"月亮",而不是仅包含它作为标题的一部分的更长的标题,而FTS将它们排在同一位置.

我猜测它可能与SQL Server排序结果的方式有关,它将词干和同义词视为与原始术语具有相同权重,并且考虑到排名的词密度,这对于文本的长段落是好的,但并不适用于像这样的短语.不幸的是,我开始认为FTS不适合这项工作.

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

Jus*_*ant 7

听起来像SQL FTS的排名很接近,但不完全是,你正在寻找什么,并且你已经将"不完全"的情况缩小到三:

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

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

如果我在你的鞋子,因为你已经有了FTS的东西,我会尝试上面的后处理黑客,看看它是否"足够好"以满足你的需求,因为它可能是最简单的事情去做.

如果它不够好,我首先看看Lucene.NET(免费),Solr(免费)和dtSearch($$$).请注意,没有一个像FTS一样简单 - 尤其是Lucene.NET,它是最受欢迎的AFAIK,功能非常全,但需要大量的编码,配置,维护等等.你可以看到这个SO线程对于其他一些观点,如果你想要更多的意见,可以在SO和其他地方有更多这样的线索.

如果你正在寻找一个"你的意思是......"拼写建议功能.在SQL Server 2008中的Pro全文搜索中,有一个在FTS之上构建此类功能的示例(链接包含Google Books的一些摘录).这会满足您的需求吗?如果没有,还有很多其他选择,包括免费和非免费.