Поиск по агрегированному списку целых чисел Elasticsearch - PullRequest
0 голосов
/ 28 марта 2019

Я разрабатываю новый индекс и имею в своих данных некоторые структуры, которые могут вызвать проблемы при поиске.

Имеется тип документа "каталог" (для его переноса в более общие настройки)

со следующей структурой данных,

{
  "_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 по категориям-категориям) составляет> 10, но nb_items в категории bbbb равно> 4получить только первый документ?

Было бы проще с двумя независимыми категориями списков и nb_items или с такими вложенными документами?

1 Ответ

0 голосов
/ 28 марта 2019

Это должно работать. Вы можете выполнить общее условие 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"
                }
              }
            }
          }
        }
      }
    }
...