Похожие чаты

Всем привет! Ребят, столкнулся с проблемой в Elastic 8.8, натолкните на

мысль. Почти месяц курю доку с гуглом, толку ноль. Пробовал и вложенные поля, и сортировку с фильтрацией, и аггрегатные функции, и даже скрипт пытался написать, но всё тщетно. Видимо что-то делаю не так.

Ситуация: имеется индекс с вложенным полем в документах (в примере 2 дока):

[
{
"id": 1,
"title": "Foo 1",
"items": [
{
"id": 10,
"size": 1,
"prices": [
{ "level": 0, "sum": 100 },
{ "level": 1, "sum": 101 }
],
"updated_at": "2023-07-27 01:00:00"
},
{
"id": 11,
"size": 2,
"prices": [
{ "level": 0, "sum": 200 },
{ "level": 1, "sum": 201 }
],
"updated_at": "2023-07-27 02:00:00"
},
{
"id": 12,
"size": 2,
"prices": [
{ "level": 0, "sum": 300 },
{ "level": 1, "sum": 301 }
],
"updated_at": "2023-07-27 03:00:00"
}
]
},
{
"id": 2,
"title": "Foo 2",
"items": [
{
"id": 20,
"size": 2,
"prices": [
{ "level": 0, "sum": 400 },
{ "level": 1, "sum": 401 }
],
"updated_at": "2023-07-27 04:00:00"
},
{
"id": 21,
"size": 2,
"prices": [
{ "level": 0, "sum": 500 },
{ "level": 1, "sum": 501 }
],
"updated_at": "2023-07-27 05:00:00"
},
{
"id": 22,
"size": 3,
"prices": [
{ "level": 0, "sum": 600 },
{ "level": 1, "sum": 601 }
],
"updated_at": "2023-07-27 06:00:00"
}
]
}
]

При сортировке нужно учесть несколько условий:

1. Найти те документы, у которых вложенные записи имеют значение поля size равным 2;
2. Найти из этих документов объект внутри nested поля items c максимальным значением updated_at (desc);
3. Отсортировать документы на основании значения цены по возрастанию (asc) для уровня 0 элемента с максимальным значением updated_at.

То есть на выходе должен получиться следующий порядок:

[
{"id": 2, "title": "Foo 2", "sort": ["2023-07-27 05:00:00", "500"]},
{"id": 1, "title": "Foo 1", "sort": ["2023-07-27 03:00:00", "300"]}
]

Но сейчас я получаю документы в неправильном порядке потому что используя блок "sort" он определяет минимальное и максимальное значение независимо от соседней выборки.

То есть, на выходе получаются такие данные:

[
{"id": 2, "title": "Foo 2", "sort": ["2023-07-27 05:00:00", "400"]},
{"id": 1, "title": "Foo 1", "sort": ["2023-07-27 03:00:00", "200"]}
]

Здесь значение поля updated_at взято из одного объекта, а цена - из другого. И это неправильно.

Также пробовал задавать max_children: 1 в сортировке, но тогда берёт первое отфильтрованное значение из вложенного объекта, но оно не соответствует нужному.

Подскажите в какую сторону доку курить?

Можно даже договориться о материальном вознаграждении с тем, кто поможет решить проблему.

5 ответов

17 просмотров

Можно item с максимальным updated at дублировать в отдельное поле на стадии инджеста. 2 при этом решается автоматически, 3 тривиально. Size можно ровно так же на стадии инджеста проставить, по нестедам бегать вообще не придется

Andrey-Helldar Автор вопроса
Etki
Можно item с максимальным updated at дублировать в...

К сожалению, дублировать нельзя, т.к. эти items являются вариантами товара и поле обновления содержит внутреннюю метку из админки на основании которой нужно сортировать элементы. То есть товар, добавленный в карточку вчера, если он по условиям фильтрации является самым свежим, должен стоять после сегодняшнего

Andrey Helldar
К сожалению, дублировать нельзя, т.к. эти items яв...

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

Andrey-Helldar Автор вопроса
Etki
Я предлагаю завести новое поле, в которое кидать с...

Это сделать можно, но поиск работает, а проблема именно с сортировкой. Вдобавок, если накинуть фильтр по цене, цвету и доступности на складе N, то это значение изменится

Andrey-Helldar Автор вопроса
Etki
Я предлагаю завести новое поле, в которое кидать с...

Собственно, сейчас в качестве костыля я так и делаю. У нас есть "лицевой вариант товара". При выгрузке данных в эластик сортирую варианты по этому значению и при сортировке вместе с фильтрацией задаю max_children: 1. Таким образом гарантированно получаю цену и поле обновления из одного конкретного варианта. А проблема в том, что этот вариант некорректный, т.к. в массиве есть другие значения с более молодыми метками времени и нужно брать самый свежий из них.

Похожие вопросы

Обсуждают сегодня

я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Is it a good price to buy hex now on 0,0019?
Patrick
28
короче сгенерила мне эта штука код на ассемблере: struc string val { common local .value dq .value .value: if ~val eq db val end if db 0 } fo...
Vi Chapmann Chapmann
12
Ребят такой вопрос я хочу пранк сделать в колледже и убрать все права установить 000 рекурсивно у домашней директории юзера, установить переменную окружения PATH в "" и сделат...
Super Sigma
21
Всем привет! Массив вводится с клавиатуры, кол-во элементов неизвестно, поэтому я указал arr db 100 dup(?) С нахождением максимума проблем нет, а вот минимум почему-то всегд...
En Vind Av Sorg
11
#include <stdio.h> int main(void) { int n; scanf("%d", &n); int digits1[n] = {0}; int digits2[n] = {0}; я не могу таким образом заранее массив нулями заполнить?
Linus
12
hi, just reinstalled komodo wallet, and can't find ARRR on there? tried to search ARRR and pirate and nothing came up... is arrr still supported on komodo wallet. it's been ...
Pilner
10
в сях есть множество как в питоне? для удаление дубликатов
Linus
25
я про форму записи. смысл указывать что 8 байтный регистр 8 байт?
Aiwan \ (•◡•) / _bot
10
Hi everyone, long time no see! 🐼 recently i want to update our Ergo Eco-System map, can everyone help to find out, which to delete and other new to add in? list it, that i can...
HEROKOO
14
Карта сайта