Elasticsearch глобальный поиск другой фильтр по нескольким индексам
У нас есть несколько индексов в Elastic Search, и мы хотели бы искать данные по всем индексам, но мы хотим применить разные фильтры к различным индексам.
Например:
- мало показателей зависит от
client_id
отсюдаclient_id
требуется фильтр - у нас есть
is_deleted
флаг в нескольких индексах, следовательноis_deleted
требуется фильтр
Как подходить к этому в Elastic Search?
Также мы используем функцию выделения, которая должна давать пользователям рекомендации. Но мы бы хотели игнорировать определенные поля в выделенных результатах. Можно ли исключить определенные поля на глобальном уровне?
1 ответ
Это возможно, используя отфильтрованные запросы, вложенные в логический запрос.
Этот пример иллюстрирует базовую настройку (обратите внимание, как используются разные фильтры):
@results = elastic_client.search([:dogs, :cats], {
:bool => {
:should => [
# cats
{
:filtered => {
:query => {
:multi_match => {
:query => 'meow', # repeated, replace with a variable
:type => 'phrase_prefix',
:fields => ['name', 'age']
}
},
:filter => {
:and => [
{ :term => { :owner_id => '123' } },
{ :type => { :value => 'cat' } }
]
}
}
},
# dogs
{
:filtered => {
:query => {
:multi_match => {
:query => 'meow', # repeated, replace with a variable
:type => 'phrase_prefix',
:fields => ['name', 'color']
}
},
:filter => {
:and => [
{ :term => { :kennel_id => '456' } },
{ :type => { :value => 'dog' } }
]
}
}
}
]
}
})
Этот конкретный код может работать или не работать с вашим ES-клиентом, но он должен дать довольно хорошее представление о концепции.
Обратите внимание, что запрос "мяу" происходит дважды, и вы можете вместо этого использовать переменную для поиска одного и того же в двух индексах. Также, multi_match
может быть какой-то другой тип запроса, очевидно.