2010-03-25 89 views
0

我一直在使用NHibernate,NHibernate.Search和Lucene.Net来改进在我开发的网站上使用的搜索引擎。Manipulate在NHibernate的查询结果上的得分/排名。搜索

基本上,我用它来搜索企业规范文档的内容。这不会与Lucene的文档概念相混淆:就我而言,规范文档(我将在后面称为“specdoc”)可以包含很多页面,这些页面的内容实际上是索引的(因此,页面本身就属于Lucene的文档概念)。所以,这些页面属于一个specdoc,而specdoc又属于一个公司(所以,一个公司可以有很多specdocs)。我使用NHibernate.Search“IndexEmbedded”和“ContainedIn”属性将页面与它们的specdoc和specdocs关联到它们的公司,所以我可以在specdoc页面中查询术语并使Lucene/NH.Search自己返回页面,specdocs或符合页面查询的公司。我可以通过这种方式进行查询并获得排名结果,从而根据相关性呈现结果(即公司,specdoc或页面),这非常棒。

但现在我需要更多。特别是在我查询条款并且让NH.Search返回匹配的公司时,我需要手动/人工调整某些结果的分数,因为有些公司想要显示在结果的顶部设置 - 想想“赞助的结果”。

我正在考虑在我的应用程序上这样做,可能是创建一个包含与公司实体关联的实体/数据库表,并提高分数值。但我不知道如何将这些信息提供给Lucene,并在搜索时相应地提高搜索结果。最初,我想过要派生一个相似类来做到这一点,但它看起来并不像相似性可以用来在搜索时修改结果集。根据this page,它看起来像我需要的是混乱的重量或得分。但是文档有点肤浅,因为没有关于如何实现自定义评分的示例,更不用说将它与NH.Search集成。

那么,有没有人知道如何做到这一点,或指向我的一些文件或工作示例如何做类似的事情?

谢谢!

回答

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/

+0

是的,我想调整查询以获得我需要的结果,但我不能这样做,至少我不知道如何。这里的交易是:我的商店/索引,以及specdoc页面的文本内容,specdocs和与内容相关的公司的ID。所以,如果我查询这样的内容: SpecDoc.Pages.content:white AND SpecDoc.CorpID:32 它返回的公司内容中包含“white”的specdoc页面,仅限于ID为32的公司。 – 2010-03-28 22:21:18

+0

Now ,由此推断,这将接近我需要的行为: SpecDoc.Pages.content:white或SpecDoc。公司身份证号码:64^100 - 但这显然不是我所需要的:即使他们的网页不包含“白色”,它也会带来ID 64的公司的业绩,并提升到100。 – 2010-03-28 22:25:10

+0

我需要的是只有当他们的页面包含“白色”时,才能在CorpID上进行分数提升,否则它们不应该显示在结果上。现在,无论我对Lucene查询语法的理解是否缺乏(我的参考文献已经是您发布的页面),或者我需要其他东西。我没有时间仔细阅读你的博客文章,所以稍后我会看看它,看看它是否有用。谢谢! – 2010-03-28 22:26:21