Elasticsearch亲子联接有什么解决方案

时间:2019-01-02 23:25:26

标签: elasticsearch parent-child aggregation

我有如下的es设置:

PUT /test
        {
        "mappings": {
         "doc": {
          "properties": {
            "status": {
              "type": "keyword"
            },
            "counting": {
              "type": "integer"
            },
            "join": {
              "type": "join",
              "relations": {
                "vsim": ["pool", "package"]
              }
            },
            "poolId": {
              "type": "keyword"
            },
            "packageId": {
              "type": "keyword"
            },
            "countries": {
              "type": "keyword"
            },
            "vId": {
              "type": "keyword"
            }
          }
        }
    }}

然后添加数据:

// add vsim
PUT /test/doc/doc1
{"counting":6, "join": {"name": "vsim"}, "content": "1", "status": "disabled"}

PUT /test/doc/doc2
{"counting":5,"join": {"name": "vsim"}, "content": "2", "status": "disabled"}

PUT /test/doc/doc3
{"counting":5,"join": {"name": "vsim"}, "content": "2", "status": "enabled"}

// add package
PUT /test/doc/ner2?routing=doc2
{"join": {"name": "package", "parent": "doc2"}, "countries":["CN", "UK"]}

PUT test/doc/ner12?routing=doc1
{"join": {"name": "package", "parent": "doc1"}, "countries":["CN", "US"]}

PUT /test/doc/ner11?routing=doc1
{"join":{"name": "package", "parent": "doc1"}, "countries":["US", "KR"]}

PUT /test/doc/ner13?routing=doc3
{"join":{"name": "package", "parent": "doc3"}, "countries":["UK", "AU"]}


// add pool
PUT /test/doc/ner21?routing=doc1
{"join": {"name": "pool", "parent": "doc1"}, "poolId": "MER"}

PUT /test/doc/ner22?routing=doc2
{"join": {"name": "pool", "parent": "doc2"}, "poolId": "MER"}

PUT /test/doc/ner23?routing=doc2
{"join": {"name": "pool", "parent": "doc2"}, "poolId": "NER"}

然后我要通过状态(vsim),poolId(池)和国家(包)来计数计数组,期望结果如下:

disabled-MER-CN:3

disabled-MER-US:3

enabled-MR-CN:1 ... 等等。 我是Elasticsearch的新手,我已经学会了类似

的文档

https://www.elastic.co/guide/en/elasticsearch/reference/current/joining-queries.htmlhttps://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-children-aggregation.html

但仍然不知道如何实现此聚合查询,请给我一些建议,谢谢!

1 个答案:

答案 0 :(得分:0)

如果我按照文档的结构进行操作-您在同一级别上具有 pool package 类型(它们是同级的)-我无法完全实现您的预期结果。我也非常怀疑这些类型是否可能是兄弟姐妹。

但是,仍然可以对文档中的每个字段进行切片(状态),然后通过 poolId countries 分别对它们进行切片这样的查询:

{
  "aggs": {
    "status-aggs": {
      "terms": {
        "field": "status",
        "size": 10
      },
      "aggs": {
        "to-pool": {
          "children": {
            "type": "pool"
          },
          "aggs": {
            "top-poolid": {
              "terms": {
                "field": "poolId",
                "size": 10
              }
            }
          }
        },
        "to-package": {
          "children": {
            "type": "package"
          },
          "aggs": {
            "top-countries": {
              "terms": {
                "field": "countries",
                "size": 10
              }
            }
          }
        }
      }
    }
  }
}

具有类似这样的Elasticsearch响应(为了便于阅读,我省略了json的一部分):

{
  "status-aggs": {
    "buckets": [
      {
        "key": "disabled",
        "doc_count": 2,
        "to-pool": {
          "doc_count": 3,
          "top-poolid": {
            "buckets": [
              {
                "key": "MER",
                "doc_count": 2
              },
              {
                "key": "NER",
                "doc_count": 1
              }
            ]
          }
        },
        "to-package": {
          "doc_count": 3,
          "top-countries": {
            "buckets": [
              {
                "key": "CN",
                "doc_count": 2
              },
              {
                "key": "US",
                "doc_count": 2
              },
              {
                "key": "KR",
                "doc_count": 1
              },
              {
                "key": "UK",
                "doc_count": 1
              }
            ]
          }
        }
      },
      {
        "key": "enabled",
        "doc_count": 1,
        "to-pool": {
          "doc_count": 0,
          "top-poolid": {
            "buckets": []
          }
        },
        "to-package": {
          "doc_count": 1,
          "top-countries": {
            "buckets": [
              {
                "key": "AU",
                "doc_count": 1
              },
              {
                "key": "UK",
                "doc_count": 1
              }
            ]
          }
        }
      }
    ]
  }
}