为什么Lucene指数如此之大?

时间:2017-02-17 22:42:17

标签: java lucene full-text-indexing

我通过以下方式将文档存储在Lucene实例中:

Document doc = new Document();
doc.add(new StringField("title", processor.title, Field.Store.YES));
doc.add(new StringField("annotation", processor.annotation, Field.Store.YES));
doc.add(new TextField("text", processor.text, Field.Store.NO));
w.addDocument(doc);

我不需要将全文存储在索引中,我唯一需要的是能够对文档执行搜索。

问题是我得到的索引大小与原始文档集的大小几乎相同。这对我来说似乎很奇怪,因为它应该只存储单词频率。为什么会这样?

2 个答案:

答案 0 :(得分:2)

  

对我来说这似乎很奇怪,因为它应该只存储单词频率。

我认为您误解了存储的内容及其存储方式。索引文件格式的Lucene documentation详细说明。引自概述部分:

  

每个段索引都保留以下内容:

     
      
  • 字段名称。它包含索引中使用的字段名称集。

  •   
  • 存储的字段值。对于每个文档,这包含属性 - 值对的列表,其中属性是字段名称。这些是   用于存储有关文档的辅助信息,例如它   title,url或访问数据库的标识符。存储的集合   字段是搜索时为每个匹配返回的字段。这是关键   按文件编号。

  •   
  • 术语词典。包含所有文档的所有索引字段中使用的所有术语的字典。字典也   包含包含术语和指针的文档数   术语的频率和接近度数据。

  •   
  • 术语频率数据。对于词典中的每个术语,包含该术语的所有文档的编号以及该术语的频率   如果omitTf为false,则该文件中的术语。

  •   
  • 术语接近数据。对于词典中的每个术语,术语在每个文档中出现的位置。请注意,这不存在   如果所有文档中的所有字段都将omitTf设置为true。

  •   
  • 归一化因素。对于每个文档中的每个字段,存储一个值,该值乘以该字段上的匹配得分。

  •   
  • 术语向量。对于每个文档中的每个字段,可以存储术语向量(有时称为文档向量)。术语向量   由术语文本和术语频率组成。添加术语向量到您的   index参见Field构造函数

  •   
  • 已删除的文件。一个可选文件,指示删除哪些文档。

  •   

以上某些内容是可选的,可能不会出现在您的索引中。但是,最小索引将具有"字段名称","存储字段值","术语字典"和"术语频率数据"

其中一些数据结构根据语料库中不同单词的数量进行缩放。其他人根据文档数量或每个文档的唯一单词数量进行缩放。

如果使用单个(相对)小文档填充索引,则某些缩放因子将对您起作用。

最后,将设计和优化索引段的物理表示主要,以便快速搜索,而不是减少存储空间。这将影响信息密度" ......以及实践中使用的存储空间。

答案 1 :(得分:1)

分析器(标记器和过滤器)应与您的文本匹配。对于英语,StandardAnalyzer应该是一个好的开始。

Analyzer analyzer = new StandardAnalyzer(Version.LATEST);
Directory index = FSDirectory.open(new File("index"));
IndexWriterConfig config = new IndexWriterConfig(Version.LATEST, analyzer);
IndexWriter writer = new IndexWriter(index, config);