我们在 Elastic Search 中有多个索引,想搜索所有索引中的数据,但我们想对不同的索引应用不同的过滤器。
例如:
- 很少有索引依赖于
client_id
,因此需要一个client_id
过滤器 - 我们在少数索引中有
is_deleted
标志,因此需要is_deleted
过滤器
在 Elastic Search 中应该如何处理这个问题?
此外,我们正在使用突出显示功能,该功能旨在向用户提供建议。但是我们想忽略突出显示结果中的某些字段。是否可以在全局级别排除某些字段?
最佳答案
这是可能的,使用嵌套在 boolean 查询中的过滤查询。
此示例说明了基本设置(注意如何使用不同的过滤器):
@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 客户端,也可能不适用于您的 ES 客户端,但它应该能很好地理解这个概念。
请注意,查询“meow”出现了两次,您可能希望使用变量来在两个索引中搜索相同的内容。此外,multi_match
显然可以是某种其他类型的查询。
关于java - Elasticsearch 全局搜索对多个索引的不同过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21753021/