数据库搜索引擎 - 根据特定的相关规则按相关性排序

时间:2010-10-19 07:57:07

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

我刚刚获得了针对我们网站的新搜索功能的要求列表。他们是图书出版商的网站,所以这是我们在这里运营的基本领域。数据存储在启用了全文的Microsoft SQL 2005数据库服务器(SP3)中。

现在,要求声明可以在三个方面进行搜索:书名,作者姓名和书籍文本。这本身很容易做到三个单独的查询。但是,还有更多。要求声明搜索结果应按以下顺序返回:

  • 完整标题匹配
  • 完整作者姓名匹配
  • 部分标题匹配
  • 完整作者姓氏匹配
  • 部分作者姓氏匹配
  • 部分作者姓名匹配
  • 书籍文字匹配

此外,还有次要要求:

  • 来自出版商本身的标题应该高于相邻出版商的标题(来自同一数据库中十几个出版商的书籍)
  • 当找到完全匹配的标题时,应显示来自同一作者的其他书籍(同一出版商的标题再次优先于另一个 - 作者可以与多个出版商一起发布)

很多类似的规则。

所以,说你有一本约翰逊书,由作家皮特约翰逊(或其他人)撰写。搜索查询'john'应该返回以下(ish):

  • 约翰逊(书)(部分冠军赛)
  • Pete Johnson(部分姓氏比赛)

搜索查询'Johnson':

  • 约翰逊(书)(完整标题匹配)
  • 约翰逊(书)(部分标题匹配)(已省略,已在结果中)
  • Pete Johnson(作者)(完整作者姓氏匹配)
  • Pete Johnson(作者)(部分作者姓氏匹配)(略)
  • Pete Johnson(作者)(部分作者全名匹配)(略)
  • 约翰逊(书)(书籍文本匹配)(略)

...反正。这基本上是要求,我只是想打出来。现在,提出几个问题:

  • 您可以指点我这个特定主题的书籍或文章吗?
  • 如何最好地实施?这可以在一组基本查询中完成(针对每个搜索需求单独查询,后处理以删除重复项并合并结果),还是可以在单个查询中完成?
  • 或者我是否需要编写一个索引表并创建自己的索引等的应用程序,然后搜索查询?

我在这里有点想法和建议。

1 个答案:

答案 0 :(得分:1)

CONTAINSTABLEFREETEXTTABLE个函数 - 它们返回RANK列,即“相关性排名”。可能这些功能加上非文本列的一些复杂排序将起到作用。

如果您决定在应用中实施FTS,请查看第三方解决方案。 Lucene(或Lucene.NET)可能很适合开始。