Похожие чаты

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

49 просмотров

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

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

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

30500 за редактор? )
Владимир
47
any reference of this implementation?
BitBuddha
29
Ⓐrtto, [4/23/24 7:02 PM] Please explain more fully how it is not working exactly, and what are the steps you are taking, and what error messages come or what happens. Ⓐrtto, ...
Ezza Kezza
2
sounds like people have lost their kaspa on tradeogre... does this mean tradeogre not trustworthy?
Ezza Kezza
15
Страшнейшая правда про списки ЦБ. С первых дней жизни P2P сферы, молодые человеки, начитавшись законодательной базы и "внутренних" документов, решили, что им противостоит сер...
Foxcool
3
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
So much speculation in the last week. So much volatility in price. This is because Hedera has a GC that isn't using the network it's governing. Why aren't people asking why a...
Summit Seeker R
9
Anyone else having this error when trying to make transactions?
Datzel
11
Question: How viable is it to use Anvil as the backend infrastructure for managing a TradFi portfolio, while integrating Flexa for instant liquidity and payment solutions? Cou...
Kevin
2
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Карта сайта