Поиск по агрегированному списку целых чисел Elasticsearch

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