Агрегация многозначных вложенных полей в эластичном поиске
Я сталкиваюсь с совершенно особой проблемой при использовании агрегации с несколькими значениями и вложенными полями в asticsearch 5.6, и мое отображение индекса приведено ниже:
{
"my_index": {
"mappings": {
"my_type": {
"properties": {
"my_field": {
"type": "nested",
"properties": {
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"country": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
}
}
}
}
}
}
и мои данные таковы:
"my_field": [
{"name": "apple", "country": "USA"},
{"name": "alibaba", "country": "CHINA"}
]
требование заключается в следующем: я получаю слово запроса, например, apple, и использую это слово запроса для поиска по имени файла, и, наконец, я хочу выполнить агрегирование по стране, именем которой является слово запроса apple. мой запрос показывает ниже:
{"query": {
"nested": {"path": "my_field", "query": {"bool": {"should": [{"match": {"my_field.name.keyword": "apple"}}]}}}},
"aggs": {"m_agg": {"nested": {"path": "my_field"},
"aggs": {"m1_agg": {"terms": {"field": "my_field.country.keyword"}}}}}}
поэтому входной сигнал Apple, и ожидаемый результат
"aggregations" : {
"m_agg" : {
"doc_count" : 1,
"m1_agg" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : "USA",
"doc_count" : 1
}
]
}
}
}
но эластичный поиск возвращает результат:
"aggregations" : {
"m_agg" : {
"doc_count" : 2,
"m1_agg" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : "USA",
"doc_count" : 1
},
{
"key" : "CHINA",
"doc_count" : 1
}
]
}
}
}
Как изменить запрос DSL, чтобы получить ожидаемый результат?
2 ответа
В случае вложенных полей раздел запроса не повлияет на раздел агрегации.
Чтобы решить это, попробуйте это:
{
"size": 0,
"aggregations": {
"nested_agg": {
"nested": {
"path": "name"
},
"aggregations": {
"bool_agg": {
"filter": {
"bool": {
"must": [
{
"term": {
"my_field.name.keyword": "apple"
}
}
]
}
},
"aggregations": {
"m_agg": {
"nested": {
"path": "my_field"
},
"aggregations": {
"m1_agg": {
"terms": {
"field": "my_field.country.keyword"
}
}
}
}
}
}
}
}
}
}
Если вам нужно применить агрегацию к конкретным отфильтрованным значениям. Вы должны использовать фильтры внутри агрегации.
В Elastic запрос / фильтры и агрегация, написанные отдельно, будут приводиться отдельно, независимо друг от друга.