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

标签 lucene lucene.net

我有一个现有的 Lucene 存储,其中包含数百万个文档,每个文档都代表一个实体的元数据。我有几个 Id 字段(Id1、Id2 .. Id5),每个文档可以有零个或多个此字段的值。该索引一次仅由这些 Id 之一查询。我已经独立地为这些字段编制了索引,并且一切正常。我最初选择使用 Lucene,因为它是迄今为止查询如此大量小文档的最快方式,我对我的决定感到满意。

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

如何通过 Id 查询 Lucene 但仅查询一种类型的文档。我可以想到一些选择,但我想知道那些知情人士从经验中推荐什么,以保持 Lucene 的可管理性和快速性。

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

  • 我能够打破与现有设置的向后兼容性。如果我来添加另一种文档类型,如果该解决方案可以重复使用,那就太好了。

    最佳答案

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

    前两种方式在查询阶段实际上是相同的,因为对于独立类型的文档,您有不同的术语和发布列表。不同之处在于索引阶段。管理多个独立的索引需要更多的协调,并且会使代码变得更加困难。然而,如果您计划在不同的上下文中使用索引,这可能是一个好主意。例如:

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

  • 否则,我会选择第一个选项,因为它更简单和易于管理。

    关于lucene - 如何在 Lucene 中存储多种不同类型的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32783552/

    相关文章:

    lucene - 提升多值字段

    lucene - 使用 Lucene 的 MultiSearcher 类的利弊

    php - 为什么 Zend Lucene 找不到结果,而 Luke 却能找到相同的模糊查询

    elasticsearch - Ngram的 Elasticsearch 索引?

    git - git 文件日志内部是如何工作的?

    lucene.net - 为什么这个 Lucene 查询是 "contains"而不是 "startsWith"?

    c# - 如何在 Lucene.NET 中删除复数?

    elasticsearch - 基于现有doc值的elasticsearch脚本更新

    lucene - Sitecore Lucene 从索引中排除项目

    c# - 避免在重建期间删除当前的 Lucene.NET 索引