java - Lucene 索引器在小型文档集合上出现内存不足问题

标签 java lucene indexing search-engine out-of-memory

我正在尝试为多个文本文档创建索引。

它们的内容只是字段制表符分隔的字符串:

WORD<\t>w1<\t>w2<\t>...<\t>wn

POS<\t>pos1<\t>pos2_a:pos2_b:pos2_c<\t>...<\t>posn_a:posn_b
...

对于 POS 字段,“:”-分隔的标记对应于相同的歧义词。

共有 5 个文档,总大小为 10 MB。 索引时,java 使用大约 2 GB 的 RAM,最终抛出 OOM 错误。

String join_token = tok.nextToken();
// atomic tokens correspond to separate parses
String[] atomic_tokens = StringUtils.split(join_token, ':');
// marking each token with the parse number
for (int token_index = 0; token_index < atomic_tokens.length; ++token_index) {
  atomic_tokens[token_index] += String.format("|%d", token_index);
}
String join_token_with_payloads = StringUtils.join(atomic_tokens, " ");
TokenStream stream = new WhitespaceTokenizer(Version.LUCENE_41, // OOM exception appears here
                                             new StringReader(join_token_with_payloads));
// all these parses belong to the same position in the document
stream = new PositionFilter(stream, 0);
stream = new DelimitedPayloadTokenFilter(stream, '|', new IntegerEncoder());
stream.addAttribute(OffsetAttribute.class);
stream.addAttribute(CharTermAttribute.class);
feature = new Field(name,
                    join_token,
                    attributeFieldType);
feature.setTokenStream(stream);
inDocument.add(feature);

从内存的角度来看,这段代码有什么问题,以及如何使用 RAM 中保存的尽可能少的数据进行索引?

最佳答案

如果我正确理解了问题(我没有尝试过),这就是我的建议

  1. 在代码中使用驼峰式大小写是一种很好的做法,这是 Java 的惯例
  2. 您无需手动生成位置,只需使用 Field.TermVector.WITH_POSITIONS_OFFSETS 创建一个字段,指标就会最终出现在索引中。
  3. 创建如此巨大的字符串数组会导致非常大的内存开销 -> 使用 StringBuilder。
  4. 使用 LetterTokenizer 对流进行标记,或通过扩展 CharTokenizer 编写您自己的标记生成器
  5. 顺便说一句,很棒的书 Lucene in Action

关于java - Lucene 索引器在小型文档集合上出现内存不足问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15471200/

相关文章:

r - 如何计算 r 中的索引?

java - 更新父对象时删除特定子对象

java - Bitcask 可以用于简单和高性能的文件存储吗?

lucene - Elasticsearch使整个索引或类型为not_analyzed

mysql - 在更改 MySQL 列类型之前进行测试

python - 在 Scipy 中切片稀疏矩阵——哪种类型效果最好?

java - iText Flying Saucer pdf标题并忽略html

java - 在solr中添加自定义字段类型

hibernate - Hibernate Search-如果以前未对现有数据建立索引,则重新创建索引

java - 尝试检索特定路径下的文件夹/文件的 CMIS 查询不返回任何文档