【问题标题】:Aggregate and filter from one index to another through a third通过第三个索引从一个索引聚合和过滤到另一个索引
【发布时间】:2018-06-22 01:13:33
【问题描述】:

在我的 Elasticsearch 服务器上,我有三个索引:PersonArchiveDocument

  • 每个文档都有一个archive 字段,它是它所在的Archive_id

  • 每个存档都有一个owner,它是Person_id,它是存档的所有者。

通过上面的索引,我可以将文档聚合到档案桶中,并将档案聚合到所有者桶中。

我怎样才能在人员聚合中也包含文档,这样如果我过滤特定的人,我会得到属于该人的档案及其文档,而不仅仅是档案?


这是我目前用来过滤和聚合档案到所有者桶中的内容:

{
  "post_filter": {
    "terms": {
      "owner": [
        "my_owner_id"
      ]
    }
  },
  "aggs": {
    "_filter_archive": {
      "filter": {
        "terms": {
          "owner": [
            "my_owner_id"
          ]
        }
      },
      "aggs": {
        "archive": {
          "terms": {
            "field": "archive"
          }
        }
      }
    }
  }
}

【问题讨论】:

  • 您已经根据关系数据库的思维和方法对 Elasticsearch 索引进行了建模,这在大多数情况下都是错误的。以目前的配置,你无法达到你想要的。
  • @AndreiStefan 你对功能性 Elasticsearch 模型有什么建议吗?
  • 如果可能,将您的数据非规范化并将所有内容都放在一个索引中。你用的是什么ES版本?
  • 我使用的是 ES 6.1
  • 这很难回答,因为您似乎遗漏了一些细节。简单的答案是:使用nested 文档或父子关系。在您的情况下使用哪一个取决于很多因素。我的建议是尝试它们并进行测试。看看他们的表现如何。第三种选择是完全非规范化您的数据。这就是我询问更新的原因,更新的频率,Person 文档有多大,Archive 文档有多大等。如果您不准备回答这些问题,请测试 nested 和 parent-child 并选择一个或其他。祝你好运!

标签: elasticsearch search faceted-search elasticsearch-aggregation


【解决方案1】:

这将很难回答,因为您似乎遗漏了一些细节。简单的答案是:使用嵌套文档或父子关系。在您的情况下使用哪一个取决于很多因素。我的建议是尝试它们并进行测试。看看他们的表现如何。第三种选择是完全非规范化您的数据。这就是我询问更新的原因,更新频率,Person 文档有多大,Archive 文档有多大等。如果您不准备回答这些问题,那么测试嵌套和父子,然后选择一个或其他。祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 1970-01-01
    • 2015-06-30
    • 1970-01-01
    相关资源
    最近更新 更多