Агрегация эластичного поиска на вложенных объектах - PullRequest
0 голосов
/ 18 января 2019

У меня есть документ со следующими сопоставлениями:

{
  "some_doc_name": {
    "mappings": {
      "_doc": {
        "properties": {
          "stages": {
            "properties": {
              "name": {
               "type": "text"
              },
              "durationMillis": {
                "type": "long"
              }
            }
          }
        }
      }
    }
  }
}

И я хотел бы иметь агрегацию, например: «Средняя продолжительность этапов, имя которых содержит токен SCM»

Я пробовал что-то вроде:

{
  "aggs": {
    "scm_stage": {
      "filter": {
        "bool": {
          "should": [{
            "match_phrase": {
              "stages.name": "SCM"
            }
          }]
        }  
      },
      "aggs" : {
        "avg_duration": { 
          "avg": { 
            "field": "stages.durationMillis"
          }
        }
      }
    }
  }
}

Но это дает мне среднее значение всех этапов для всех документов, которые содержат хотя бы один этап с токеном SCM. Любой совет о том, как получить эту агрегацию правильно?

1 Ответ

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

Отвечая на мой вопрос благодаря помощи val

В моем файле сопоставлений отсутствует "type": "nested", что-то вроде:

...
"stages": {
  "type": "nested",
  "properties": {
    "id": {
    "type": "keyword",
    "ignore_above": 256
  },
  ...

Тогда я могу заставить свою агрегацию работать с чем-то вроде этого:

{
  "size": 0,
  "query": {
    "nested": {
      "path": "stages",
      "query": {
        "match": {
          "stages.name": "scm"
        }
      }
    }
  },
  "aggs": {
    "stages": {
      "nested": {
        "path": "stages"
      },
      "aggs": {
        "stages-filter": {
          "filter": {
            "terms": {
              "stages.name": [
                "scm"
              ]
            }
          },
          "aggs": {
            "avg_duration": {
              "avg": {
                "field": "stages.durationMillis"
              }
            }
          }
        }
      }
    }
  }
}
...