Агрегация Elasticsearch с параметром пути reverse_nested

Может ли кто-нибудь подробнее рассказать о параметре "путь" в теге reverse_nested при агрегации asticsearch? Я пытаюсь объединить вложенные корзины, используя ключи на разных уровнях вложенности. Вот подробности:

Создание индекса с последующим отображением

PUT agg
{
  "mappings": {
    "sample": {
      "properties": {
        "product": {
          "type": "object",
          "properties": {
            "name": {
              "type": "keyword"
            },
            "category": {
              "type": "keyword"
            }
          }
        },
        "features": {
          "type": "nested",
          "properties": {
            "color": {
              "type": "keyword"
            },
            "details": {
              "type": "text"
            },
            "finish": {
              "type": "keyword"
            }
          }
        }
      }
    }
  }
}

Индексирование некоторых документов в индексе "agg":

POST _bulk
{ "index" : { "_index" : "agg", "_type" : "sample", "_id" : "1" } }
{"product":{"name":"tv","category":"electronics"},"features":[{"color":"black","details":"jet black in color"},{"finish":"matte"}]}
{ "index" : { "_index" : "agg", "_type" : "sample", "_id" : "2" } }
{"product":{"name":"tv","category":"electronics"},"features":[{"color":"black","details":"jet black in color"},{"finish":"glossy"}]}
{ "index" : { "_index" : "agg", "_type" : "sample", "_id" : "3" } }
{"product":{"name":"tv","category":"electronics"},"features":[{"color":"red","details":"apple red in color"},{"finish":"matte"}]}
{ "index" : { "_index" : "agg", "_type" : "sample", "_id" : "4" } }
{"product":{"name":"tv","category":"electronics"},"features":[{"color":"red","details":"blood red in color"},{"finish":"matte"}]}

Следующая агрегация работает, как и ожидалось: (Ведра цветов содержат ведро отделки):

GET agg/_search
{
  "size": 0,
  "aggs": {
    "root": {
      "nested": {
        "path": "features"
      },
      "aggs": {
        "colors": {
          "terms": {
            "field": "features.color",
            "size": 10
          },
          "aggs": {
            "colorToFinish": {
              "reverse_nested": {},
              "aggs": {
                "root": {
                  "nested": {
                    "path": "features"
                  },
                  "aggs": {
                    "finishes": {
                      "terms": {
                        "field": "features.finish",
                        "size": 10
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

Тем не менее, следующее не работает должным образом:

GET agg/_search
{
  "size": 0,
  "aggs": {
    "root": {
      "nested": {
        "path": "features"
      },
      "aggs": {
        "colors": {
          "terms": {
            "field": "features.color",
            "size": 10
          },
          "aggs": {
            "colorToFinish": {
              "reverse_nested": {
                "path": "features"
              },
              "aggs": {
                "finishes": {
                  "terms": {
                    "field": "features.finish",
                    "size": 10
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

В нерабочем DSL я пытаюсь выйти из "вложенности" в "особенности" и снова углубиться, чтобы получить финиш. Кажется, это не собирает ведра для "финиша".

Однако подход, при котором мы находимся на уровне корневого документа и извлекаем поле из первого принципа, кажется, работает. Таким образом, может показаться, что я не использую параметр "path" в reverse_nested правильно и, возможно, не приземляюсь в правильной вложенности. Кто-нибудь знает, почему второй запрос не работает?

1 ответ

nested запрос / агрегация позволяет запрашивать / агрегировать вложенные объекты. Вы должны указать path в который входит запрос / агрегация. reverse_nestedс другой стороны, позволяет вам выпрыгнуть из текущего вложенного запроса / агрегации. когда reverse_nested используется, он уже знает, из какого вложенного объекта он должен выпрыгнуть, поэтому нет path требуется внутри reverse_nested,

Так что в вашем первом запросе, когда reverse_nested будет представлена ​​следующая агрегация на объекте верхнего уровня, таком как "продукт" и "функции". Теперь вы хотите агрегировать на вложенном поле features.finish, поэтому вам нужно снова войти во вложенный объект, дав nested срок с path, И тогда вы делаете обычную агг на вложенном поле features.finish.

Второй запрос не работает по двум причинам: 1. reverse_nested не поддерживается path и это не нужно. 2. После reverse_nested срок, nested все еще требуется при запросе / агрегировании во вложенном поле.

Другие вопросы по тегам