2015-09-25 81 views
3

我有一个拥有数百万个文档的现有Lucene存储,每个文档都代表一个实体的元数据。我有几个Id字段(Id1,Id2 .. Id5),每个文档可以具有零个或多个此字段的值。索引一次只能由其中一个Ids查询。我已经独立编制了这些领域的索引,这一切都很好。我最初选择使用Lucene,因为它是迄今为止查询如此大量小文档的最快方式,我对我的决定感到满意。如何在Lucene中存储多个不同类型的文档

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

如何通过Id查询Lucene,但仅查询一种类型的文档。我可以考虑一些选项,但我想知道那些知道的人从经验中推荐的内容,以便让Lucene保持可管理性和快速性。

  1. 使用单独的Lucene索引。这将避免这个问题,因为文档类型是正交的。还有能够分别读取和写入索引的好处。
  2. 将新文档的字段Id1..Idn重命名为XId1 ... XIdn。这样,一种类型的文档就不会与另一种类型的文档具有相同的字段名称。这似乎更像是一种避免问题的解决方法,而不是实际的解决方案。
  3. 添加一个数字字段“Type”并将索引号更改为(Type,Idx)。这种方法看起来很浪费,因为每个索引都必须包含该类型。

我能够打破向后兼容性与我现有的设置。如果我添加其他文档类型,如果解决方案可以重复使用,那将是非常好的。

+0

我会做1.但更多只是意见 – Paparazzi

回答

4

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

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

  • 物理位置;
  • 备份策略;
  • 可用性要求;
  • 时间对指数的需求(时间从一个文档在客户端改变,直到可见指数)

否则,我会第一个选择,因为更简单,便于管理去。

+0

事实证明,我选择了第一种方式,后来我发现后来确实需要不同的备份策略和可用性要求。谢谢 – andrewjs

相关问题