我一直在使用NHibernate,NHibernate.Search和Lucene.Net来改进我开发的网站上使用的搜索引擎。
基本上,我用它来搜索公司规范文档的内容。这不要与Lucene的文档概念混淆:在我的情况下,规范文档(我以后称之为“specdoc”)可以包含许多页面,这些页面的内容实际上是索引的(因此,页面本身就属于Lucene的文档概念。因此,页面属于specdoc,而specdoc又属于公司(因此,公司可以拥有许多specdoc)。我正在使用NHibernate.Search“IndexEmbedded”和“ContainedIn”属性将页面与他们的specdoc和specdocs关联到他们的公司,所以我可以查询specdoc页面中的术语并让Lucene / NH.Search返回页面本身,specdocs,或与页面上的查询匹配的公司。我可以通过这种方式查询并获得排名结果,从而通过相关性呈现结果(即公司,专业人士或页面),这很棒。
但现在我需要更多东西。特别是在我查询条款并让NH.Search返回匹配的公司的情况下,我需要手动/人工调整某些结果的得分,因为有些公司我想要显示在结果的顶部设置 - 想想“赞助结果”。
我正在考虑在我的应用程序上执行此操作,可能会创建一个实体/数据库表,其中包含与公司实体的关联,以及分数提升值。但是我不知道如何将它提供给Lucene并在搜索时相应地提高结果。最初我想到派生一个Similarity类来做这件事,但看起来不像Similarity可以用来在搜索时修改结果集。根据{{3}},看起来我需要的是重量或得分。但是文档有点肤浅,因为没有关于如何实现自定义评分的例子,更不用说将它与NH.Search集成。
那么,有没有人知道如何做到这一点,或者指出一些关于如何做类似事情的文档或工作示例?
谢谢!
答案 0 :(得分:0)
据我所知,您只希望能够在查询时设置提升,而不是索引时间。这可以很容易地完成。在构建查询时,可以设置提升。 Query对象包含一个SetBoost属性,允许您提升与整个查询匹配的文档。当您使用两个术语查询并希望其中一个被提升时,这非常有用。但是,如果您使用QueryParser之类的东西来构建查询,则查询解析器有一种语法来设置条件的提升。关于这一点的更多信息http://lucene.apache.org/java/2_9_0/queryparsersyntax.html#Boosting%20a%20Term。现在,如果您正在使用查询解析器,您可以使用一些正则表达式或调整查询解析器字符串以添加附加符号以增加术语,或者您可以考虑创建自己的查询解析器,这将在它决定时添加提升必须加上。我创建了自己的查询解析器,因为它并不困难。以下是有关http://openedu.ossreleasefeed.com/tutorials/apache-lucene-extending-the-queryparser/
的一些信息