У меня есть запрос в elasticsearch, который работает просто отлично:Фильтрация по BOOL и has_child с elasticsearch
body =
size: opts.size
query:
fuzzy_like_this:
fields: ['title', 'content']
like_text: opts.search
fuzziness: 1
filter:
has_child:
type: 'sku'
filter:
bool:
must:
range:
regular_price:
gte: opts.min_price
lte: opts.max_price
highlight:
pre_tags: ['<strong>']
post_tags: ['</strong>']
fields:
title:
force_source: true
fragment_size: 150
number_of_fragments: 1
Это получает products
чье название или содержание нечетким матч opts.search
и которые имеют skus
с указанным диапазоном цен. Оно работает.
Я хотел бы дополнительно исключить любые products
, у которых есть hide_from_catalog
boolean, установленный в true
. Однако сделать небольшое изменение не работает, как я ожидал:
body =
size: opts.size
query:
fuzzy_like_this:
fields: ['title', 'content']
like_text: opts.search
fuzziness: 1
filter:
### Adding this causes an error ###
bool:
must_not:
term:
hide_from_catalog: true
has_child:
type: 'sku'
filter:
bool:
must:
range:
regular_price:
gte: opts.min_price
lte: opts.max_price
highlight:
pre_tags: ['<strong>']
post_tags: ['</strong>']
fields:
title:
force_source: true
fragment_size: 150
number_of_fragments: 1
Я играл немного и не могу заставить его работать. Неисправность выглядит так:
SearchPhaseExecutionException[Failed to execute phase [query_fetch],...
ElasticsearchParseException[Expected field name but got START_OBJECT \"has_child\"]
Я предполагаю, что фильтрация отформатирована неправильно.
Каким будет подходящий способ для добавления этого дополнительного фильтра?