我有具有“word”和“stem”功能的文档。一个单词可能有多个词干,因此我索引了操纵位置增量的“词干”特征。我这样做如下:
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);
您在代码中看到,我使用固定的字符串值初始化 Field 以供存储,然后将 token 流传递到其中(我在 stackoverflow 的某个地方找到了该解决方案)。 我对每个带有词干的 join_token 执行这些确切的步骤。结果,我在《路加福音》中查看我的单词的 TermVector,发现一个单词的多个词干连续出现(不同!),而它们应该共享一个位置。 出了什么问题?
最佳答案
看起来您的问题是您实际上并未初始化TokenStream
,因此当您执行attr.setPositionIncrement(0);
时,它不会为流中的每个 token 设置它。如果您想手动执行此操作,则必须迭代流中的每个标记,并为每个标记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
关于java - Lucene setPositionIncrement 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15178249/