如何使用Lucene.NET帮助在Stack Overflow等网站上实现搜索?

时间:2010-02-19 16:20:31

标签: sql-server-2008 search lucene lucene.net

5 个答案:

答案 0 :(得分:10)

单独使用lucene无法找到您正在寻找的答案。您需要排名和分组算法来过滤和理解数据及其相关性。 Lucene可以帮助您获得标准化数据,但之后您需要正确的算法。

我建议您查看以下一本或所有书籍,他们会帮助您进行数学计算并让您指出正确的方向:

Algorithms of the Intelligent Web

Collective Intelligence in Action

Programming Collective Intelligence

答案 1 :(得分:4)

lucene索引将包含以下字段:

  • 标题
  • 问题
  • 接受的答案(如果没有接受的答案,则为高度投票的答案)
  • 所有答案合并

所有这些字段都是分析的。禁用长度标准化以更好地控制评分。

上述字段顺序也反映了它们按降序排列的重要性。也就是说,如果标题中的查询匹配比接受的答案更重要,则其他所有内容保持不变。

upvotes的#是针对这个问题的,并且可以通过提升这些字段来捕获最佳答案。但是,原始的upvote计数不能用作提升值,因为它可能会显着地扭曲结果。 (有4个upvotes的问题会得到两个得分的两倍,有2个upvotes。)这些值需要在它们被用作增强因子之前积极地减弱。使用自然对数(对于upvotes> 3)看起来很好。

标题可以通过略高于问题的值来提升。

虽然问题之间的相互关联并不常见,但对某个问题有一个基本的类似页面的重量可能会产生一些有趣的结果。

我不认为问题的标签是搜索的非常有价值的信息。当您只想浏览问题时,标签很不错。大多数情况下,标签是文本的一部分,因此搜索标签将与问题相匹配。不过,这可以讨论。

将对所有四个字段执行典型的搜索查询。

+(title:query question:query accepted_answer:query all_combined:query)

这是一个广泛的草图,如果需要,将需要进行大量调整以获得正确的增强值和正确的查询权重。实验将为质量的两个维度 - 相关性和重要性 - 显示正确的权重。通过将新近度作为aranking参数引入,可以使事情变得复杂。这里的想法是,如果产品的特定版本出现问题并在以后的版本中修复,则新问题可能对用户更有用。

可以添加一些有趣的搜索曲目。如果只找到“少数”匹配结果,某种形式的基本同义词搜索可能会有所帮助。例如,“减少Java堆大小”与“减少Java堆大小”相同。但是,那么,它也意味着“地图减少”将开始匹配“地图减少”。 (拼写检查很明显,但我想,程序员会正确拼写他们的查询。)

答案 2 :(得分:2)

你可能比大多数尝试回答你的人做了更多关于这个问题的思考(部分原因是为什么它是一天,我是你的第一个回应,我想象)。我只是想尝试解决你最后的三个问题,b / c那里有很多我没时间进入的问题,而且我认为这三个问题最有意思(实际问题可能是实际问题)结束'挑选一些东西,然后在你了解更多时调整它')。

投票数据不确定投票是否与搜索更相关,坦率地说,只是让它们更受欢迎。如果这是有道理的,我试图说一个特定的帖子是否与你的问题相关,大多数是独立于它是否与其他人相关。也就是说,有趣的问题与人们想要找到的问题之间至少存在微弱的相关性。投票数据在完全基于数据进行搜索时可能是最有用的,例如, “最受欢迎”的类型搜索。在通用的基于文本的搜索中,我可能最初没有为投票提供任何权重,但会考虑使用一种算法,该算法可能对排序有轻微的影响(因此,不是返回的结果,而是对订购的轻微推动他们)。

回复我同意您的方法,但需经过一些测试;请记住,这必须是基于用户反馈的迭代过程(因此您需要收集有关搜索是否为搜索者返回成功结果的指标)

其他也不要忘记用户的分数。因此,用户也可以在SO上获得积分,并且这会影响他们在回答每个问题的答案中的默认排名(看起来主要是因为对具有相同数量的碰撞的回复进行抢占)

答案 3 :(得分:2)

确定相关性总是很棘手。你需要弄清楚你想要完成什么。您的搜索是否尝试为某人可能遇到的问题提供完全匹配,或者是否尝试提供某个主题的近期项目列表?

一旦你想出了想要返回的内容,你就可以看看你正在编制索引的每个特征的相对效果。那将是一个粗略的搜索。从那里你根据用户反馈调整(我建议使用隐式反馈而不是显式,否则你会惹恼用户)。

对于索引,您应该尝试将数据放入,以便每个项目都具有对其进行排名所需的所有信息。这意味着您需要从多个位置获取数据以进行构建。一些索引系统能够为现有项目添加值,这样可以在后续答案进入时轻松地将问题添加到问题中。简单性只会让您经常重建问题。

答案 4 :(得分:2)

我认为Lucene不适合这份工作。 你需要一些非常快速且具有高可用性的东西......比如SQL 但是你想要开源吗?

我建议您使用Sphinx - http://www.sphinxsearch.com/ 它好多了,我说的是经验,我用它们两个。

狮身人面像很神奇。真的是。