“提升”lucene文档中相同字段的不同实例

问题描述:

我想使用单个字段来索引文档的标题和正文,以提高性能。“提升”lucene文档中相同字段的不同实例

当时的想法是做这样的事情:

Field title = new Field("text", "alpha bravo charlie", Field.Store.NO, Field.Index.ANALYZED); 
title.setBoost(3) 
Field body = new Field("text", "delta echo foxtrot", Field.Store.NO, Field.Index.ANALYZED); 
Document doc = new Document(); 
doc.add(title); 
doc.add(body); 

然后我可以做一个单一的TermQuery代替BooleanQuery两个不同的领域。

但是,事实证明,字段提升是文档中同名字段的所有提升的multiple。在我的情况下,这意味着这两个领域的推动力为3.

有没有一种方法可以得到我想要的而不诉诸于使用两个不同的领域?一种方法是将title字段多次添加到文档中,这会增加术语频率。这很有效,但似乎令人难以置信的脑死亡。

我也知道关于payloads,但这似乎对我以后的事情有点矫枉过正。

任何想法?

+0

你可以进入的一些细节你试图克服的性能问题?我从来没有遇到在两个单独字段上使用BooleanQuery的问题。 – Snekse 2010-10-13 15:15:31

+0

我还没有测试过它,但我很确定搜索'(title:bravo OR body:bravo)'比'text:bravo'需要更长的时间 – itsadok 2010-10-14 08:03:29

如果您想从Google书籍(至少是他们的旧书)中取出一个页面,那么您可能需要创建单独的索引:一个用于文档主体,另一个用于标题。我假设有一个存储的字段指向每个实际文档的真实UID。

另一个答案是编写[Similarity] [1]的自定义实现来获得你想要的行为。不幸的是,我发现Lucene经常需要这种定制的独特问题出现。

[1]:http://lucene.apache.org/java/3_0_2/api/all/org/apache/lucene/search/Similarity.html#lengthNorm(java.lang.String,INT)

+0

想想你可能想要保留这些的另一个原因数据元素在单独的字段或单独的索引中:如果它们在同一索引中共享相同的字段名称,Body中的大量内容可能会破坏Title的词频。如菜单,表格或家庭(如果您使用的是基本网页)这样的字词会更频繁地出现在标题中,从而减少这些字词的重量。 – Snekse 2010-10-13 15:20:02

您可以与通过所期望的值升压标题字段索引标题和主体分开。然后,您可以使用MultiFieldQueryParser来搜索多个字段。

虽然从技术上讲,搜索多个领域需要较长的时间,通常即使有这方面的开销,Lucene的往往是非常快(的几十或几百毫秒的量级)。