首页 > 代码库 > 一些最重要的查询和过滤(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
}
}
}
这个操作接受的参数如下:
| greater than |
| greater than or equal to |
| less than |
| less than or equal to |
exists
and missing
filters
这个过滤器可以查询指定的若干field中的其中若干值是否存在document中,或者都不存在docudment。这个和SQL中的IS_NULL很类似:
{
"exists": {
"field": "title"
}
}
这个过滤常常用来检测一个filed是否存在,如果不存在就用到不同的场景。
bool
filter
这个过滤常常用来联合一些逻辑判断的过滤条目,他接受三个参数:
| These clauses must match, like |
| These clauses must not match, like |
| At least one of these clauses must match, like |
每个参数能接受一个单独的过滤或者一个过滤条目的数组;
{
"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。
| Clauses which must match for the document to be included. |
| Clauses which must not match for the document to be included. |
| If these clauses match, then they increase the |
下面查找的是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