Есть ли какое-нибудь решение сasticsearch родитель-дочернее объединение - PullRequest
0 голосов
/ 03 января 2019

У меня есть настройки 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(пул) и страны (пакет), ожидаемый результат, например:

отключен-MER-CN: 3

отключен-MER-US: 3

включен-MR-CN: 1 ... и так далее.Я - новый игрок вasticsearch, и я изучил документ, такой как

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

, но все еще не имею идеи реализовать этот запрос агрегирования, ПОЖАЛУЙСТАдай мне предложение, спасибо!

1 Ответ

0 голосов
/ 03 января 2019

Если бы я следовал вашей структуре документов - у вас есть типы пул и пакет на одном уровне (это братья и сестры) - я не смог достичь именно того, чего вы ожидали Результаты. Я также очень сомневаюсь, что это возможно с этими типами, являющимися родными братьями.

Тем не менее, по-прежнему возможно нарезать по одному полю в вашем документе ( status ), а затем по отдельности срезать как по poolId , так и по странам с помощью запроса типа это:

{
  "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
              }
            ]
          }
        }
      }
    ]
  }
}
...