0

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)?

4

1 回答 1

2

Lucene 内存中的表示被定义为RAMDirectory类。这基本上HashMapString(键)和(RAMFiles)中的一个。RAMFile依次是表示文件字节的字节缓冲区列表。您将存储在FSDirectory.

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

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

DirectoryReaderSegmentReaders 处理索引的内部结构。

在我使用 Lucene 的那段时间里,我从未见过像“术语 ID”这样的东西。然而,“文档 ID”是一个常见的概念。

于 2013-03-09T18:04:00.093 回答