В Elasticsearch, как выполнить запрос вложенной суммы с фильтром? - PullRequest
0 голосов
/ 25 марта 2019

Я создал отображение следующим образом:

PUT cars
{  
   "mappings":{  
      "_doc":{  
         "properties":{  
            "metadata":{  
               "type":"nested"
            }
         }
      }
   }
}

Затем я вставляю документ:

PUT /cars/_doc/1
{  
   "metadata":[  
      {  
         "key":"price",
         "value":20000
      },
      {  
         "key":"miles",
         "value":1000
      }
   ]
}

Теперь я хочу получить сумму всех цен (здесь есть только один документ, но я все еще думаю, что этого достаточно, чтобы показать смысл).

Я пробовал:

GET cars/_doc/_search

{
  "aggs": {
    "metadata": {
      "nested": {
        "path": "metadata"
      },
      "aggs": {
        "prices": {
          "sum": {
            "field": "metadata.value"
          }
        }
      }
    }
  }
}

Но это включает в себя miles, который я не хочу.

Как добавить фильтр, чтобы в мой запрос входил только price, то есть, как получить запрос, возвращающий 20 000, а не 21 000?

1 Ответ

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

Поскольку вы хотите учитывать только цену, все, что вам нужно сделать, это отфильтровать вложенные документы, где key равно price.Для этого вам нужно добавить фильтр агрегации , как показано ниже:

{
  "aggs": {
    "metadata": {
      "nested": {
        "path": "metadata"
      },
      "aggs": {
        "price": {
          "filter": {
            "term": {
              "metadata.key": "price"
            }
          },
          "aggs": {
            "prices": {
              "sum": {
                "field": "metadata.value"
              }
            }
          }
        }
      }
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...