ES提供了丰富多彩的查询接口,能够知足各类各样的查询要求。更多内容请参考: ELK修炼之道
举个例子html
GET _search { "query": { "bool": { "must": [ { "match": { "title": "Search" }}, { "match": { "content": "Elasticsearch" }} ], "filter": [ { "term": { "status": "published" }}, { "range": { "publish_date": { "gte": "20150101" }}} ] } } }
查询的分类 json
Leaf query Cluase 叶子查询(简单查询)
这种查询能够单独使用,针对指定的字段查询指定的值。缓存
Compound query clauses 复杂查询
复杂查询能够包含叶子或者其它的复杂查询语句,用于组合成复杂的查询语句,好比not, bool等。安全
查询虽然包含这两种,可是查询的行为还与查询的执行环境有关,不一样的执行环境,查询操做也不同。
查询的行为取决于他们所在的查询上下文,包括Query查询上下文和Filter查询上下文。框架
Query查询上下文
在Query查询上下文中,查询会回答这个问题--"这个文档匹不匹配查询条件,它的相关性高么?"
除了决定文档是够匹配,针对匹配的文档,查询语句还会计算一个_score
相关性分值,分数越高,匹配度越高,默认返回是越靠前。这里关于分值的计算再也不介绍,之后再作介绍。elasticsearch
举个简单的例子:ide
GET _search { "query": { "bool": { "must": [ { "match": { "title": "Search" }}, { "match": { "content": "Elasticsearch" }} ], "filter": [ { "term": { "status": "published" }}, { "range": { "publish_date": { "gte": "2015-01-01" }}} ] } } }
性能差别
使用过滤语句获得的结果集———一个简单的文档列表,快速匹配运算并存入内存是很是方便的,每一个文档仅需1个字节。这些缓存的过滤结果集与后续请求的结合使用时很是高效的。
查询语句不只要查找相匹配的文档,还须要计算每一个文档的相关性,因此通常来讲查询语句要比过滤语句更耗时,而且查询结果也不可缓存。
幸好有了倒排索引,一个只匹配少许文档的简单查询语句在百万级文档中的查询效率会与一条通过缓存的过滤语句旗鼓至关,甚至略占上风。可是通常状况下,一条通过缓存的过滤查询要远胜一条查询语句的执行效率。性能
之后博客中提到的查询就是在Query查询上下文,过滤就是指filter过滤器上下文。
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-filter-context.htmlui