"id": 1,
"items": [
{"city": 1, "size": 1},
{"city": 2, "size": 2}
]
},
{
"id": 2,
"items": [
{"city": 2, "size": 3},
{"city": 3, "size": 2}
]
}
В ответ на запрос нужно получить только те документы, в объекте вложенного поля которых реализуется условие city = 2 AND size = 2.
Текущий запрос выглядит так:
{
"query": {
"bool": {
"must": [
{
"nested": {
"path": "items",
"query": {
"bool": {
"must": [
{"term": {"items.city": 2}},
{"term": {"items.size": 2}}
]
}
}
}
]
}
}
}
Проблема заключается в том что на выходе получаю обе записи несмотря на то, что соответствие условию лишь в первом документе.
Подскажите какой раздел документации читать. Возможно что-то пропустил в разделах аггрегатных функций и фильтров.
Как заставить фильтр проверять условия в рамках одного конкретного объекта внутри вложенного поля?
Либо, если это возможно, т.к. сам не смог найти информацию, как использовать группировку в запросах на случай возможности раскладывания вложенных полей.
Суть в том, что текущий документ - это карточка товара внутри которой вложенные объекты - её варианты. На стороне SQL можно легко идти от таблицы вариантов получая при помощи функции GROUP BY уникальные значения карточек для реализации пагинации. Но я не нашёл как можно такое реализовать в эластике. И можно ли?..
В подборке товаров может быть сколько угодно карточек. Уже весь мозг сломал :(
Если вдруг поможет, SQL версия того что нужно выглядит так:
SELECT cards.id
FROM cards
WHERE EXISTS(
SELECT 1
FROM items
WHERE
items.card_id = cards.id
AND items.city = 2
AND items.size = 2
)
В данный момент остановился на параметре "collapse". Пытаюсь понять нужен он здесь или нет.
Покажите маппинг. Отсюда запрос выглядит ровно как он должен и поведение выглядит как если бы нестеда там не было.
Маппинг простой: PUT http://127.0.0.1:9200/cards { "mappings": { "properties": { "id": { "type": "long" }, "items": { "type": "nested", "properties": { "city": { "type": "long" }, "size": { "type": "long" } } } } } } Проблема в том, что при фильтрации значение "city = 2" проверяется в одном вложенном элементе, а "size = 2" - в другом. Нужно чтобы они проверялись в одном элементе. Для показа разницы могу написать SQL запросы: Сейчас: SELECT cards.id FROM cards WHERE EXISTS( SELECT 1 FROM items WHERE items.card_id = cards.id AND ( items.city = 2 OR items.size = 2 ) ) Надо так: SELECT cards.id FROM cards WHERE EXISTS( SELECT 1 FROM items WHERE items.card_id = cards.id AND items.city = 2 AND items.size = 2 )
Курю доку по вложенным полям и думаю помогут ли опции "include_in_parent" и/или "include_in_root" в решении вопроса?.. Допустим, заюзать опцию "include_in_root" мы получим "плоскую" версию, но вопрос как потом собирать данные обратно. "collapse" берёт первый элемент, но не знаю берёт ли до фильтрации или после... https://www.elastic.co/guide/en/elasticsearch/reference/current/nested.html#nested-params
Я скормил напрямую пример: "hits": { "total": { "value": 1, "relation": "eq" }, Ничего сверх просто нестеда не должно быть нужно. Вы уверены, что вам возвращается что-то неправильное?
Да. Возвращается две записи, а должна одна
Обсуждают сегодня