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

时间:2010-10-13 13:47:33

标签: java performance 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,但这似乎对我所追求的事情有点过分。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

如果你想从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)

答案 1 :(得分:0)

您可以使用所需值提升的标题字段对标题和正文进行索引。然后,您可以使用MultiFieldQueryParser搜索多个字段。

虽然从技术上讲,搜索多个字段需要更长的时间,通常即使有这种开销,Lucene也会非常快(大约几十或几百毫秒)。