【问题标题】:Lucene setPositionIncrement doesn't workLucene setPositionIncrement 不起作用
【发布时间】:2013-03-02 19:07:49
【问题描述】:

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

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

【问题讨论】:

  • 它们在“位置”值或“偏移”值方面是连续的吗?

标签: java indexing search-engine lucene


【解决方案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

【讨论】:

    猜你喜欢
    • 2011-03-02
    • 1970-01-01
    • 2016-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-01
    • 2011-11-16
    相关资源
    最近更新 更多