Похожие чаты

Всем привет! Ситуация: Есть документы с вложенным массивом объектов. Например: {

"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". Пытаюсь понять нужен он здесь или нет.

5 ответов

18 просмотров

Покажите маппинг. Отсюда запрос выглядит ровно как он должен и поведение выглядит как если бы нестеда там не было.

Andrey-Helldar Автор вопроса
Etki
Покажите маппинг. Отсюда запрос выглядит ровно как...

Маппинг простой: 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 )

Andrey-Helldar Автор вопроса
Andrey Helldar
Маппинг простой: PUT http://127.0.0.1:9200/cards ...

Курю доку по вложенным полям и думаю помогут ли опции "include_in_parent" и/или "include_in_root" в решении вопроса?.. Допустим, заюзать опцию "include_in_root" мы получим "плоскую" версию, но вопрос как потом собирать данные обратно. "collapse" берёт первый элемент, но не знаю берёт ли до фильтрации или после... https://www.elastic.co/guide/en/elasticsearch/reference/current/nested.html#nested-params

Andrey Helldar
Курю доку по вложенным полям и думаю помогут ли оп...

Я скормил напрямую пример: "hits": { "total": { "value": 1, "relation": "eq" }, Ничего сверх просто нестеда не должно быть нужно. Вы уверены, что вам возвращается что-то неправильное?

Andrey-Helldar Автор вопроса
Etki
Я скормил напрямую пример: "hits": { ...

Да. Возвращается две записи, а должна одна

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

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

я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Is it a good price to buy hex now on 0,0019?
Patrick
29
короче сгенерила мне эта штука код на ассемблере: 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
Помогите, пожалуйста, делаю программу для для подсчёта корней квадратного уравнения, знаю, что есть куча недочётов, недоработок, но основная проблема в том, что почему-то при ...
NYC
13
Hey folks, If I buy XMR via p2p or atomic swaps, does that impact on its price? Or is that equivalent to transferring from one wallet to another with no impact on price?
𐌊aD𐌍€Z̷̷zꍏ☈ 𝟛
13
#include <stdio.h> int main(void) { int n; scanf("%d", &n); int digits1[n] = {0}; int digits2[n] = {0}; я не могу таким образом заранее массив нулями заполнить?
Linus
12
в сях есть множество как в питоне? для удаление дубликатов
Linus
25
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
Карта сайта