Доступ к значению из первого элемента массива - отфильтрованный - PullRequest
0 голосов
/ 17 декабря 2018

После проведенных выходных в поисках ответа я решил попросить вас о помощи.У меня есть индекс с продуктами.Варианты - это вложенный список объектов в продуктах, и я сортирую их по количеству запаса и некоторым другим условиям во время подачи индекса.Я пытаюсь отсортировать товары по значению первого варианта в эластичном Resposne (включая фильтры, переданные в запросе).Вот пример того, что я ищу.Укороченная эластичная структура ответа:

{
    "id": 6346,
    "name": "name",
    "variants": [
        {
            "variant_id": 1,
            "stock_quantity": 20,
            "price": 9.9
        },
        {
            "variant_id": 2,
            "stock_quantity": 15,
            "price": 20.9
        },
        {
            "variant_id": 3,
            "stock_quantity": 0,
            "price": 16.9
        }
    ]
}

Давайте отфильтруем список по цене gte 15:

{
    "id": 6346,
    "name": "name",
    "variants": [
        {
            "variant_id": 2,
            "stock_quantity": 15,
            "price": 20.9
        },
        {
            "variant_id": 3,
            "stock_quantity": 0,
            "price": 16.9
        }
    ]
}

Теперь я пытаюсь отсортировать товары по цене первого варианта из ответа.Что я пытался сделать до сих пор?

Сортировка по сценарию

"sort": 
     {
       "_script": {
         "order": "desc",
         "type": "number",
         "script": {
          "source": "return params['_source']['variants'][0].gross_price"
         }
       }
     }

Это работало, пока я не начал фильтровать список.В случае вариантов.gross_price gte 15 скрипт возвращает значение из исходного документа: 9,9, а не 20,9, как я ожидал.Я пропускаю тот факт, что ссылка на источник не рекомендуется из соображений производительности.

Сортировка по полю

"sort": 
{
      "variants.gross_price": {
        "nested": {
          "path": "variants",
          "filter": {
            "bool": {
              "filter": [               
                {
                  "range": {
                    "variants.gross_price": {
                      "gt": "15"
}
[...]

Не знаю почему, но таким образом я не получаю цену первойвариант из ответа, но цена самого дешевого варианта в продукте - 16,9 в данном случае.

Я также добавил флаг 'include_in_parent' к вариантам и попытался получить значение с помощью 'doc [' варианты.gross_price ']. значения."в сценарии, но тот же эффект, что и первый.

Итак. Что еще я могу попытаться сделать?

ОБНОВЛЕНИЕ Макс_человек с версии 6.5 - это то, что яищу.

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Вот, пожалуйста, используйте значение java max вместо 999, и вы должны быть в порядке;).Вы должны зацикливаться на id, чтобы найти минимальную цену брутто> 15.И вернуть цену брутто, связанную.Пожалуйста, сообщите нам, если это работает, я проверил свои данные и, кажется, все в порядке.

{
  "query": {
    "nested": {
      "path": "variants",
      "query": {
        "range": {
          "variants.gross_price": {
            "gt": "15"
          }
        }
      }
    }
  },
  "sort": [
    {
      "_script": {
        "script": {
          "inline": " int minima = 999; long result = -1; if (doc['variants.gross_price'].value > 15) { if (doc['variants.variant_id'].value < minima) minima = doc['variants.variant_id'].value; result = doc['variants.gross_price'].value;} \n return result",
          "lang": "painless"
        },
        "order": "desc",
        "nested_path": "variants",
        "type": "number"
      }
    }
  ],
  "from": 0,
  "size": 10
}
0 голосов
/ 17 декабря 2018

Вы можете попробовать приведенный ниже скрипт.

"sort": {
        "_script": {
            "type": "number",
            "script": {
                "inline": "if(doc['variants.gross_price'].value > 15) {max = doc['variants.gross_price'].value;}, abs(max)",
            "order" : asc
            }
       }
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...