查询和过滤的组合(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

posted @ 2014-06-09 14:09  QQ1350995917  Views(613)  Comments(0)    收藏  举报