мысль. Почти месяц курю доку с гуглом, толку ноль. Пробовал и вложенные поля, и сортировку с фильтрацией, и аггрегатные функции, и даже скрипт пытался написать, но всё тщетно. Видимо что-то делаю не так.
Ситуация: имеется индекс с вложенным полем в документах (в примере 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 в сортировке, но тогда берёт первое отфильтрованное значение из вложенного объекта, но оно не соответствует нужному.
Подскажите в какую сторону доку курить?
Можно даже договориться о материальном вознаграждении с тем, кто поможет решить проблему.
Можно item с максимальным updated at дублировать в отдельное поле на стадии инджеста. 2 при этом решается автоматически, 3 тривиально. Size можно ровно так же на стадии инджеста проставить, по нестедам бегать вообще не придется
К сожалению, дублировать нельзя, т.к. эти items являются вариантами товара и поле обновления содержит внутреннюю метку из админки на основании которой нужно сортировать элементы. То есть товар, добавленный в карточку вчера, если он по условиям фильтрации является самым свежим, должен стоять после сегодняшнего
Я предлагаю завести новое поле, в которое кидать сам новый айтем и е использовать его никак кроме как непосредственно при поиске
Это сделать можно, но поиск работает, а проблема именно с сортировкой. Вдобавок, если накинуть фильтр по цене, цвету и доступности на складе N, то это значение изменится
Собственно, сейчас в качестве костыля я так и делаю. У нас есть "лицевой вариант товара". При выгрузке данных в эластик сортирую варианты по этому значению и при сортировке вместе с фильтрацией задаю max_children: 1. Таким образом гарантированно получаю цену и поле обновления из одного конкретного варианта. А проблема в том, что этот вариант некорректный, т.к. в массиве есть другие значения с более молодыми метками времени и нужно брать самый свежий из них.
Обсуждают сегодня