如何在Lucene中存储多种不同类型的文档

时间:2015-09-25 13:40:41

标签: lucene lucene.net

我有一个拥有数百万个文档的Lucene商店,每个文档代表一个实体的元数据。我有几个Id字段(Id1,Id2 .. Id5),每个文档可以有这个字段的零或多个值。索引只能由其中一个ID一次查询。我已经将这些字段独立编入索引,并且它们都运行良好。我最初选择使用Lucene,因为它是迄今为止查询大量小文档的最快方式,我很满意我的决定。

但是现在我必须存储另一种类型的文档,它也代表实体的不同类型的元数据,并具有(Id1,Id2 ... Id5)的值,并且还将分别由其中一个ID查询。现有元数据和这组新数据将相互独立地存储和查询。

如何通过Id查询Lucene,但仅查询一种类型的文档。我可以想到几个选项,但我想知道知识中的人会从经验中推荐什么才能让Lucene保持可管理和快速。

  1. 使用单独的Lucene索引。这将避免该问题,因为文档类型是正交的。还有一个好处是能够分别从索引中读取和写入。
  2. 将新文档的字段Id1..Idn重命名为XId1 ... XIdn。这样,一种类型的文档与另一种类型的文档不具有相同的字段名称。这似乎是一种避免问题的解决方法而不是实际解决方案。
  3. 添加数字字段"输入"并将索引更改为(Type,Idx)。这种方法似乎很浪费,因为每个索引都必须包含类型。
  4. 我能够打破与现有设置的向后兼容性。如果我来添加另一种文档类型,可以重复使用该解决方案。

1 个答案:

答案 0 :(得分:4)

由于type索引的选择性低,我肯定会拒绝第三种选择。 type字段中只有2个不同的值,每个值包含数百万个文档。 Lucene需要将这个巨大的发布列表与来自idN索引的短发布列表合并,这仍然可以非常快,但确实很浪费。

在查询阶段,前两种方式实际上是相同的,因为您对独立类型的文档有不同的术语和发布列表。差异将在索引阶段。管理多个独立索引需要更多协调,使代码更难一点。但是,如果您计划在不同的环境中使用索引,那么这可能是一个好主意。例如:

  • 物理位置;
  • 备份策略;
  • 可用性要求;
  • 索引时间要求(从客户端更改文档到索引中可见的时间)

否则,我会选择第一个选项,因为它更简单易懂。