2014-02-13 286 views
3

我们在弹性搜索中有多个索引并希望在所有索引中搜索数据,但我们希望对不同的索引应用不同的过滤器。Elasticsearch全局搜索多个索引上的不同过滤器

例如:

  • 几个指标取决于client_id,因此一个client_id过滤器需要
  • 我们is_deleted标志几个指标,因此is_deleted过滤器需要

应该怎样一个在弹性搜索?

此外,我们正在使用高亮功能,这应该给用户提供建议。但是我们想忽略突出显示的结果中的某些字段。是否有可能在全球范围内排除某些领域?

回答

3

这是可能的,使用过滤查询,嵌套在布尔查询

这个例子说明了基本设置(注意不同的过滤器是如何被使用):

@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-客户端的工作,但它应该给一个相当不错的主意这个概念。

请注意,查询“meow”会出现两次,您可能想要使用一个变量来搜索两个索引中的同一事物。另外,multi_match显然可以是其他类型的查询。

+0

谢谢!它帮助! –