#elasticsearch #nested #aggregation
#elasticsearch #вложенный #агрегирование
Вопрос:
Я разрабатываю новый индекс, и в моих данных есть некоторые структуры, которые могут вызвать некоторые проблемы при поиске.
Задан тип документа ‘каталог’ (для переноса его в более общую настройку)
со следующей структурой данных,
{
"_id": 1,
"categories": [
{
"category_name": "aaaa",
"nb_items": 6
},
{
"category_name": "bbbb",
"nb_items": 5
}
]
},
{
"_id": 2,
"categories": [
{
"category_name": "cccc",
"nb_items": 9
},
{
"category_name": "bbbb",
"nb_items": 2
}
]
}
Как запросить документ, количество элементов которого по всей категории (сумма nb_items по category_names) равно > 10, но nb_items в категории bbbb равно > 4, чтобы получить только первый документ?
Было бы проще с двумя независимыми списками categories и nb_items или с такими вложенными документами?
Комментарии:
1. Пожалуйста, поясните: Как запросить документ, количество элементов которого по всей категории (сумма nb_items по category_names) равно > 10, но nb_items в категории bbbb равно > 4, чтобы получить только первый документ? используя, например
2. документ 1 выбран потому, что (6 5> 10 и 5> 4), а документ 2 не выбран потому, что (9 2> 10, но 2 < 4) Моя основная проблема здесь для моего запроса заключается в том, как выполнить условие для суммы «nb_items» в массиве
Ответ №1:
Это должно сработать. Вы могли бы выполнить условие total nb с помощью скрипта в части фильтра, но это было бы действительно медленно.
{
"size": 0,
"query" : {
"nested" : {
"path" : "categories",
"query" : {
"bool" : {
"must" : [
{
"term" : {"categories.origin" : "bbbb"}
},
{
"range" : {"categories.nb_items" : {"gt" : 4}}
}
]}
}
}
},
"aggregations": {
"totalnbbydoc": {
"terms": {
"field": "youriddoc",
"size": 10000
},
"aggregations": {
"totalByNested": {
"nested": {
"path": "categories"
},
"aggregations": {
"nbtotal": {
"sum": {
"field": "categories.nb_items"
}
}
}
},
"paidAmount_filter": {
"bucket_selector": {
"script": {
"inline": "params.totalnbbydoc > 10"
},
"buckets_path": {
"totalnbbydoc": "totalByNested>nbtotal"
}
}
}
}
}
}
}