我通过以下方式将文档存储在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);
我不需要将全文存储在索引中,我唯一需要的是能够对文档执行搜索。
问题是我得到的索引大小与原始文档集的大小几乎相同。这对我来说似乎很奇怪,因为它应该只存储单词频率。为什么会这样?
答案 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);