Я пытаюсь написать регулярное выражение elasticsearch, исключающее элементы, у которых есть ключ, содержащий подстроку, скажем, в названии книг.
elasticsearch документы предполагает, что подстроку можно исключить с помощью следующего фрагмента:
@&~(foo.+) # anything except string beginning with "foo"
Однако в моем случае я попытался создать такой фильтр и потерпел неудачу.
{
query: {
constant_score: {
filter: {
bool: {
filter: query_filters,
},
},
},
},
size: 1_000,
}
def query_filters
[
{ regexp: { title: "@&~(red)" } },
# goal: exclude titles that start with "Red"
]
end
Я использовал другое регулярное выражение в том же фильтре запроса, который работал, поэтому я не думаю, что есть ошибка в способе передачи регулярного выражения в ES.
Любые идеи? Заранее спасибо!
я думаю, что вы написали ". *" из регулярного выражения ...
Обновлять:
Я нашел обходной путь: я могу добавить в фильтр предложение must_not
.
{
query: {
constant_score: {
filter: {
bool: {
filter: query_filters,
must_not: must_not_filters,
},
},
},
},
size: 1_000,
}
def must_not_filters
[ { regexp: { title: "red.*" } } ]
end
Тем не менее любопытно, есть ли еще одна идея для исходного регулярного выражения
Обновление: я нашел обходной путь: