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 может быть какой-то другой тип запроса, очевидно.

Другие вопросы по тегам