这篇博客主要分为 :Query查询Filter查询。有关复合查询聚合查询也会单独写篇博客。

一、概念

1、概念

一个查询语句究竟具有什么样的行为和得到什么结果,主要取决于它到底是处Query还是Filter。两者有很大区别,我们来看下:

Query context 查询上下文 这种语句在执行时既要计算文档是否匹配,还要计算文档相对于其他文档的匹配度有多高,匹配度越高,_score 分数就越高

Filter context 过滤上下文 过滤上下文中的语句在执行时只关心文档是否和查询匹配,不会计算匹配度,也就是得分

看下官方的例子

GET /_search {   "query": {     "bool": {       "must": [         { "match": { "title":   "Search"        }},         { "match": { "content": "Elasticsearch" }}       ],       "filter": [         { "term":  { "status": "published" }},         { "range": { "publish_date": { "gte": "2015-01-01" }}}       ]     }   } }

对上面的例子分析下:

  1. query 参数表示整个语句是处于 query context 中
  2. bool 和 match 语句被用在 query context 中,也就是说它们会计算每个文档的匹配度(_score)
  3. filter 参数则表示这个子查询处于 filter context 中
  4. filter 语句中的 term 和 range 语句用在 filter context 中,它们只起到过滤的作用,并不会计算文档的得分。

2、查询数据准备

1)创建索引

PUT student {   "settings":{     "number_of_shards":1,     "number_of_replicas":1   },   "mappings":{       "properties":{         "name":{"type":