繁体   English   中英

Lucene setPositionIncrement不起作用

[英]Lucene setPositionIncrement doesn't work

我有带有“单词”和“词干”功能的文档。 一个词可能有多个词干,因此我为“词干”索引功能操纵位置增量。 我这样做如下:

FieldType type = new FieldType();
type.setIndexed(true);
type.setStored(true);
type.setOmitNorms(true);
type.setTokenized(true);
type.setStoreTermVectorOffsets(true);
type.setStoreTermVectorPositions(true);
type.setStoreTermVectors(true);

String join_token = tok.nextToken(); // token is like "stem1 stem2 stem3"
TokenStream stream = new WhitespaceTokenizer(Version.LUCENE_41, new StringReader(join_token));
PositionIncrementAttribute attr = stream.addAttribute(PositionIncrementAttribute.class);
attr.setPositionIncrement(0);
stream.addAttribute(OffsetAttribute.class);
stream.addAttribute(CharTermAttribute.class);
feature = new Field(name,
                    join_token,
                    type);
feature.setTokenStream(stream);
doc.add(feature);

您在代码中看到,我使用固定的String值初始化Field以便存储它,然后将令牌流传递给它(我在stackoverflow的某个地方找到了该解决方案)。 我对每个带有词干的join_token执行这些确切步骤。 结果,我在Luke中看着我的单词的TermVector,一个单词的多个词干出现在连续的位置(不同!),而它们应该共享一个位置。 怎么了?

看来您的问题是您实际上没有初始化TokenStream ,所以当您执行attr.setPositionIncrement(0); 它不是为流中的每个令牌设置它。 如果要手动执行此操作,则必须迭代流中的每个令牌,并为每个令牌设置setPositionIncrement(0)

但是,您可能需要考虑使用PositionFilter 随着流的使用,它将为您处理位置增量的设置为0。

如下所示:

String join_token = tok.nextToken(); // token is like "stem1 stem2 stem3"
TokenStream stream = new WhitespaceTokenizer(Version.LUCENE_41, new StringReader(join_token));
stream = new PositionFilter(stream, 0); // 0 also happens to be the default

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM