Задать вопрос
Davidaa_WoW
@Davidaa_WoW

Как в elasticsearch итерироваться по вложенным параметрам в фильтре?

Это мой маппинг документа
"_source": {
                    "id": 60,
                    "price": 60,
                    "locations": [
                      {
                         "id": 1
                         "price": 70
                      },
                      {
                         "id": 5,
                         "price": 80
                      }
                    ]
                }


Параметр `price` может быть как в корне, так и вложенным в массиве объектов `locations`. Мне нужно фильтровать цену по обоим параметрам - если на вход подаётся значение `locationId`, то фильтровать по цене в этой локации, если нет, то по корневой.
Был написан painless скрипт:
if(params['locationId'] != null){
				for (def location : doc['locations']) {
					if (location.id == params['locationId']) {
						if ((params['lte'] != null || location.price <= params['lte']) && (params['gte'] != null || location.price >= params['gte'])) {
							return true;
						} else {
							return false;
						}
					}
				}
			}
			return (params['lte'] != null || params._source.price <= params['lte']) && (params['gte'] != null || params._source.price >= params['gte']);


Пытаюсь его использовать:

"query": {
                "bool": {
                    "filter": [
                        {
                            "script": {
                                "script": {
                                    "source": "my_script",
                                    "params": {
                                        "locationId": "2"
                                    }
                                }
                            }
                        }
                    ]
                }
            }


Однако, получаю ошибку на второй строчке кода:
`No field found for [locations] in mapping with types []`
Как в данном случае получить доступ к вложенному полю `locations`? Я пытался обратиться к ним как: `params._source.locations`, так я уже делал в скрипте сортировки. Но видимо поле `params` не доступно из запроса на фильтрацию.
  • Вопрос задан
  • 32 просмотра
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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