查询和过滤的组合(combining queries with filters)
在query context中使用Query,在filter context中使用Filter。通过ES API的参数名称你也能发现是使用的query或者是filter。这些情况是单独的使用query或这filter参数。也就是说他们是建立在query上下文环境中或者是filter上下文环境中的。
Compund query能嵌套另外的query条目,compound filter也能嵌套另外的filter条目。然而,经常用到的是把一个filter嵌套进filter,或者在很少的情况下,把一个full text query当作一个filter。
为了是实现这个要求,ES有专门的嵌套了filter的query,也有嵌套了query的filter,这些允许我们从一个上下文环境中转变为另外的一个上下文环境。选择query和filter的组合方式,以高效的达到你的目的是十分重要的。
filtering a query
假设有下面的查询:
{"match":{"email":"business opportunity"}}
我们要把他和下面的过滤收件箱中的document的filter进行联合:
{"term":{"folder":"inbox"}}
search API仅仅接受了一个单独的query参数,所以我们要吧query和filter的联合包装到另外的一个filtered查询中:
{
"filtered":{
"query": {"match":{"email":"business opportunity"}},
"filter":{"term": {"folder":"inbox"}}
}
}
我们现在把这个查询结合到search API的query参数中:
GET /_search
{
"query":{
"filtered":{
"query": {"match":{"email":"business opportunity"}},
"filter":{"term":{"folder":"inbox"}}
}
}
}
just a filter
在一个查询上下文中,如果你仅仅是使用一个filter而不用query,例如:想过滤收件箱中的邮件,可以进行如下的查询:
GET /_search
{
"query":{
"filtered":{
"filter": {"term":{"folder":"inbox"}}
}
}
}
如果不指定query,默认的是match_all,就像上面的那个查询等同于下面的查询:
GET /_search
{
"query":{
"filtered":{
"query": {"match_all":{}},
"filter": {"term":{"folder":"inbox"}}
}
}
}
偶尔情况下,你或许要在filter上下文中使用query,使用一个嵌套query的query filter就能实现。下面这个例子向我们展示了如何排除垃圾邮件:
GET /_search
{
"query":{
"filtered":{
"filter": {
"bool":{
"must": {"term": {"folder":"inbox"}},
"must_not":{
"query":{
"match":{"email":"urgent business proposal"}
}
}
}
}
}
}
}
标记1出表示在一个bool filter中允许嵌套match查询。
你很少会使用到一个query作为filter,但是为了完整,ES也包含了这个方式。或许唯一的使用时机就是你在filter上下文中使用full text matching。
原文:http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/_combining_queries_with_filters.html

浙公网安备 33010602011771号