首页 > 代码库 > 一些最重要的查询和过滤(most important queries and filters)

一些最重要的查询和过滤(most important queries and filters)

ES有很多不同的请求和过滤方式,然而常用的不多。我们将会在Search in depth 中更详细的讲解,此处,就把最重要的一些查询和过滤做一个快速的介绍。

term filter

term filter被用来过滤确切的值,可以是数字,日期,boolean,或者not_analyzed的字符串:

{"term":{"age":    26           }}
{"term":{"date":   "2014-09-01"}}
{"term":{"public":true         }}
{"term":{"tag":    "full_text"  }}

terms filter

terms filter和term filter类似,但是允许你指定更多的匹配值。如果document的任意filed匹配查询中的任意term,这个document就是匹配的:

{"terms":{"tag":["search","full_text","nosql"]}}

range filter

这个范围过滤器允许指定数字和日期,以查询之间的数字或日期:

{
   
"range":{
       
"age":{
           
"gte":  20,
           
"lt":   30
       
}
   
}
}

这个操作接受的参数如下:

gt

greater than

gte

greater than or equal to

lt

less than

lte

less than or equal to

 

exists and missing filters

 这个过滤器可以查询指定的若干field中的其中若干值是否存在document中,或者都不存在docudment。这个和SQL中的IS_NULL很类似:

{
   
"exists":   {
       
"field":    "title"
   
}
}

这个过滤常常用来检测一个filed是否存在,如果不存在就用到不同的场景。

bool filter

这个过滤常常用来联合一些逻辑判断的过滤条目,他接受三个参数:

must

These clauses must match, like and

must_not

These clauses must not match, like not

should

At least one of these clauses must match, like or

每个参数能接受一个单独的过滤或者一个过滤条目的数组;

{
   
"bool":{
       
"must":     {"term":{"folder":"inbox"}},
       
"must_not":{"term":{"tag":    "spam"  }},
       
"should":[
                   
{"term":{"starred":true   }},
                   
{"term":{"unread":  true   }}
       
]
   
}
}

match_all query

这个查询就是简单的匹配所有的document,如果没有指定任何的查询条件这个就是默认的查询:

{"match_all":{}}

这个查询常常用来组合一些过滤器,例如,在收件箱中检索所有的邮件,每个都是一样的相关度,因此他们的_score都是1。

match query

几乎在任何field中,当你想检索一个full text或者精确值检索时候,这个match应该成为你的标准查询。如果你对一个full text使用match,在执行search之前,ES就会使用正确的analyzer分词这个查询字符串:

{"match":{"tweet":"About Search"}}

如果你对一个确切的field使用这个查询,例如,数字,日期,boolean,或者not_analyzed字符串,ES会进行精确的查找:

{"match":{"age":    26           }}
{"match":{"date":   "2014-09-01"}}
{"match":{"public":true         }}
{"match":{"tag":    "full_text"  }}

对于确切值的查找,或许你更喜欢使用filter而不是query,因为filter能缓存。

不像是在 Search Lite中我们介绍的query string查询,match query不再使用类似"+user_id:2 +tweet:search"的语法。match query就是查找指定的词。这意味着把一个可以搜索的field暴露给用户是安全的,因为用户可以查询,并且不会轻易的抛出语法异常。

multi_match query

这个查询把如果match一起查询:

{
   
"multi_match":{
       
"query":    "full text search",
       
"fields":   ["title","body"]
   
}
}

bool query

这个查询和bool filter很相似,是用来组合多个查询条目。然而,有一些不同。记住,当filter做出yes|no的回答的时候,query是计算相关度。这个bool query组合来自must或者should条目的_score。

must

Clauses which must match for the document to be included.

must_not

Clauses which must not match for the document to be included.

should

If these clauses match, then they increase the _score, otherwise they have no effect. They are simply used to refine the relevance score for each document.

下面查找的是title匹配“how_to_make millions”并且tag不能是“spam”。如果document的tag是“starred”或者是2014年以来的那么_score就会比较高:

{
   
"bool":{
       
"must":     {"match":{"title":"how to make millions"}},
       
"must_not":{"match":{"tag":   "spam"}},
       
"should":[
           
{"match":{"tag":"starred"}},
           
{"range":{"date":{"gte":"2014-01-01"}}}
       
]
   
}
}

如果,没有must条目,那么至少要一个should条目需要匹配,但是如果有must条目,should中的任意一个不匹配也是可以的。

 

原文:http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/_most_important_queries_and_filters.html