Похожие чаты

Всем привет! Ребят, столкнулся с проблемой в 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 ответов

53 просмотра

Можно 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. Таким образом гарантированно получаю цену и поле обновления из одного конкретного варианта. А проблема в том, что этот вариант некорректный, т.к. в массиве есть другие значения с более молодыми метками времени и нужно брать самый свежий из них.

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
@Benzenoid can you tell me the easiest, and safest way to bu.y HEX now?
Živa Žena
20
This is a question from my wife who make a fortune with memes 😂😂 About the Migration and Tokens: 1. How will the old tokens be migrated to the new $LGCYX network? What is th...
🍿 °anton°
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
What is the Dex situation? Agora team started with the Pnetwork for their dex which helped them both with integration. It’s completed but as you can see from the Pnetwork ann...
Ben
1
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Anyone knows where there are some instructions or discort about failed bridge transactions ?
Jochem
21
@lozuk how do I get my phex copies of my ehex from a atomic wallet, to move to my rabby?
Justfrontin 👀
11
Карта сайта