Как отсортировать результирующий набор на основе минимального значения вложенного поля в elasticsearch?

#elasticsearch

#elasticsearch

Вопрос:

Я хотел бы отсортировать результирующий набор на основе минимального значения «priceWithPartialDiscount», которое представляет собой поле внутри вложенного поля.

Рассмотрим вложенное поле:

 "children": [
{
    "partialDiscountPercent": 0.0,
    "productId": 497071,
    "price": 200.0,
    "priceWithPartialDiscount": 200.0,
    "partialDiscountAmount": 0.0
},
{
    "partialDiscountPercent": 0.0,
    "productId": 497072,
    "price": 100.0,
    "priceWithPartialDiscount": 100.0,
    "partialDiscountAmount": 0.0
}
],
 

Я написал код для сортировки:

 "sort":[{
   "children.priceWithPartialDiscount":{
      "missing":"_last",
      "mode":"min",
      "nested":{
         "filter":{
            "nested":{
               "path":"children",
               "query":{
                  "range":{
                     "children.price":{
                        "gte":0.0
                     }
                  }
               }
            }
         },
         "path":"children"
      },
      "order":"asc"
   }
}]
 

, и я ожидаю

 "sort": [100.0]
 

Но, к моему удивлению, я вижу:

 "sort": [200.0]
 

Я допустил ошибку?

Ответ №1:

Удалите вложенность 2-го уровня внутри filter , потому path что он уже определен во вложенном контексте родителя:

 {
  "sort": [
    {
      "children.priceWithPartialDiscount": {
        "missing":"_last",
        "mode": "min",
        "nested": {
          "filter": {
            "range": {
              "children.price": {
                "gte": 0
              }
            }
          },
          "path": "children"
        },
        "order": "asc"
      }
    }
  ]
}
 

Я думаю, что вложенный запрос 2-го уровня неочевидным образом искажал ваши значения сортировки.

Комментарии:

1. 💪🏻 Приятно. Привет, бесстыдный плагин — я пишу руководство по elasticsearch, в котором я более подробно обсуждаю использование вложенных полей. Я был бы признателен, если вы найдете 2 минуты, чтобы сообщить мне конкретно, о чем вы хотели бы узнать больше. Приветствия