После проведенных выходных в поисках ответа я решил попросить вас о помощи.У меня есть индекс с продуктами.Варианты - это вложенный список объектов в продуктах, и я сортирую их по количеству запаса и некоторым другим условиям во время подачи индекса.Я пытаюсь отсортировать товары по значению первого варианта в эластичном 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 - это то, что яищу.