1

我有具有“单词”和“词干”特征的文档。一个词可能有多个词干,所以我索引了操纵位置增量的“词干”特征。我这样做如下:

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,一个单词的多个词干出现在连续的(不同的!),而它们应该共享一个位置。出了什么问题?

4

1 回答 1

1

看起来你的问题是你实际上并没有初始化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
于 2013-03-02T20:53:54.553 回答