#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"}
}
]
}
}
}
}
}