Lucene在索引中的内存表示是什么样的?

时间:2013-03-09 17:23:57

标签: lucene

Lucene索引的内存表示(与文件格式相反)是什么样的?是否将整个反向索引加载到内存中,例如作为一系列发布列表(每个发布列表包含文档ID,文档中的术语频率和位置)?像

这样的东西
class Posting {
  private int docID;
  private int termFreq;
  private int[] termPositions;
}

class PostingList {
  private Posting[] postings;
}

public class SomeClassThatHoldsTheIndexInMemory {
  private PostingList[] index;  // Indexed by some internal term ID?
}

我理解构成索引的所有内容(包括有关术语的辅助信息)可能都不会保留在内存中,但肯定会有什么?

哪些类定义了索引的内存中表示?如果索引看起来像上面那样,Lucene如何从一个术语(一个字符串)转到一个术语ID(一个int)?

1 个答案:

答案 0 :(得分:2)

Lucene内存中表示被定义为RAMDirectory类。基本上,HashMap String(键)和(RAMFile s)。反过来,RAMFile是表示文件字节的字节缓冲区列表。您将存储在FSDirectory中的相同信息。

Lucene存储倒排索引。索引被组织为一组增量(可能是未合并的)段。每个段属于“索引提交”,并且每个段或多或少是另一个倒排索引。您甚至可以找到仅包含一个文档的倒排索引的“段”。

“发布”或Document原始结构在您将其添加到索引后就会丢失。而且,你不能迭代整个文档集合(据我所知)。无论如何,没有什么能阻止你将你的帖子/文档存储在二级结构中,或者在索引中存储它的序列化版本,或者将它的对象属性逐个存储为StoredField;也不在字段中定义自己的“可迭代”文档ID。

DirectoryReaderSegmentReader处理索引的内部结构。

在我使用Lucene的时候,我从未见过像“术语ID”这样的东西。但是,“文档ID”是一个常见的概念。