我正在尝试改进我们的短语搜索能力(在我们的例子中是电影标题),目前正在研究 SQL Server 2008 全文搜索,它提供了一些我们想要的功能:
然而,排名算法似乎有问题,使用
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/