Как использовать вложенную агрегацию в Elasticsearch?

#java #elasticsearch #aggregation #facets

#java #elasticsearch #агрегация #фасет

Вопрос:

Я довольно новичок в elasticsearch. Я пишу вложенный dsl с использованием агрегации.

Структура входного документа примерно такая:

    {
        "_source": {
           "id": 1234,
           "oid": 6,

            "education": [
              {
                 "school_name": "Harvard",
                 "city" : "Boston",
                 "year": 1965,
                 "degree": "Undergrad"
              },
              {
                 "school_name": "Harvard",
                 "city" : "Boston",
                 "year": 1975,
                 "degree": "Masters"
              },
              {
                 "school_name": "Harvard",
                 "city" : "Boston",
                 "year": 1958,
                 "degree": "BA"
              }  
           ],
        }
     },
  

—-Другие записи … и так далее

* Приведенный выше документ соответствует одной записи.

Цель: я пытаюсь найти всех тех студентов, которые учились в Бостоне. Так что в идеале, если у меня есть только вышеуказанный документ, я должен получить только 1 запись.

С помощью вложенного запроса агрегации, который я написал ниже, я получаю 3 в качестве подсчета для Бостона

 GET cluster_test/index_test/_search
{
"query": {
 "bool": {
  "must": [
    {
      "term": {
        "oid": {
          "value": "6"
        }
      }
    }
  ]
}
},
 "aggs": {
    "education": {
      "nested": {
        "path": "education"
      },
      "aggs": {
        "edu": {
          "terms": {
            "field": "education.city",
            "size": 0
          }
        }
      }
    }
  }
}         
  

Если кто-нибудь может указать, где я ошибаюсь или что лучше для решения подобных запросов.
Любая помощь приветствуется.

Комментарии:

1. @javanna Можете ли вы дать мне некоторое представление об этом?

Ответ №1:

Вам не следует использовать агрегации, поскольку вы хотите отфильтровать студентов, которые учились в нужном городе. Использование фильтров, подобных приведенным ниже, должно помочь.

 GET cluster_test/index_test/students/_search
{
"filtered" : {
    "query" : { "match_all" : {} },
    "filter" : {
        "nested" : {
            "path" : "education",
            "filter" : {
                "bool" : {
                    "must" : [
                        {
                            "term" : {"education.city" : "Boston"}
                        }
                    ]
                }
            }
        }
    }
}