通过第三个索引从一个索引聚合和过滤到另一个索引

Posted

技术标签:

【中文标题】通过第三个索引从一个索引聚合和过滤到另一个索引【英文标题】: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 并选择一个或其他。祝你好运! 【参考方案1】:

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

【讨论】:

以上是关于通过第三个索引从一个索引聚合和过滤到另一个索引的主要内容,如果未能解决你的问题,请参考以下文章

redis常用方法

如何对聚合进行过滤以有效地使用索引?

ES 聚合索引简介

NumPy 数组切片索引

聚合结果的 Elasticsearch 过滤器(用于搜索和聚合)

基于索引从大熊猫系列列表中提取到另一个大熊猫系列