java - Lucene setPositionIncrement 不起作用

标签 java indexing search-engine lucene

我有具有“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/

相关文章:

java - Raspberry Pi 上的 RMI 不起作用连接拒绝主机 : 127. 0.0.1

firefox - 用 '+'(破折号)替换 '-'(加号)以替换 OpenSearch 的 URL 中的空格

asp.net - 这种对搜索引擎友好的 URL 是我应该使用的 SEO 优势吗?是不是更专业?

mysql - 搜索有关 Java EE 应用程序和 Alfresco 的信息

java - 扩展 File 类时出现 ClassCastException 问题

java - CSV 文件生成

c# - RavenDB Map Reduce 非重复索引

sql-server - 由于此查询中定义的提示,查询处理器无法生成查询计划。重新提交查询并且不使用 SET FORCEPLAN

python - 如何使用 .loc 对 DF 进行切片,列表中可能包含在索引/列中找不到的元素

java - 如何删除最后一个新行 (\n)