下面先解释一下ES的GET+request body这种模式
一般我们知道HTTP协议一般是不允许get请求带上request body,但是因为get更加适合描述查询数据的操作,因此还是这么用了。
碰巧当前很多浏览器或是服务器也都支持GET+request body模式
如果遇到不支持的场景,也可以用POST+request body模式.

1、 一个例子让你明白什么是query DSL

GET /website/_search{  "query": {    "match_all": {}  }}

2、query DSL的基本语法

GET /{index}/_search{    "各种条件"}

示例:

GET /website/_search{  "query": {    "match": {      "title": "article"    }  }}{  "took" : 3,  "timed_out" : false,  "_shards" : {    "total" : 1,    "successful" : 1,    "skipped" : 0,    "failed" : 0  },  "hits" : {    "total" : {      "value" : 3,      "relation" : "eq"    },    "max_score" : 0.13353139,    "hits" : [      {        "_index" : "website",        "_type" : "_doc",        "_id" : "1",        "_score" : 0.13353139,        "_source" : {          "post_date" : "2017-01-01",          "title" : "my first article",          "content" : "this is my first article in this website",          "author_id" : 11400        }      },      {        "_index" : "website",        "_type" : "_doc",        "_id" : "2",        "_score" : 0.13353139,        "_source" : {          "post_date" : "2017-01-02",          "title" : "my second article",          "content" : "this is my second article in this website",          "author_id" : 11400        }      },      {        "_index" : "website",        "_type" : "_doc",        "_id" : "3",        "_score" : 0.13353139,        "_source" : {          "post_date" : "2017-01-03",          "title" : "my third article",          "content" : "this is my third article in this website",          "author_id" : 11400        }      }    ]  }}

3、组合多个搜索条件

搜索需求:title必须包含first,content可以包含website也可以不包含,author_id必须不为111

GET /website/_search{  "query": {    "bool": {      "must": [        {          "match": {            "title": "first"          }        }      ],      "should": [        {          "match": {            "content": "website"          }        }      ],      "must_not": [        {          "match": {            "author_id": 111          }        }      ]    }  }}{  "took" : 21,  "timed_out" : false,  "_shards" : {    "total" : 1,    "successful" : 1,    "skipped" : 0,    "failed" : 0  },  "hits" : {    "total" : {      "value" : 1,      "relation" : "eq"    },    "max_score" : 1.1143606,    "hits" : [      {        "_index" : "website",        "_type" : "_doc",        "_id" : "1",        "_score" : 1.1143606,        "_source" : {          "post_date" : "2017-01-01",          "title" : "my first article",          "content" : "this is my first article in this website",          "author_id" : 11400        }      }    ]  }}

下面附上一个更复杂的组合查询,之后可以作为思考的模板:

GET /website/_search{  "query": {    "bool": {      "must": [        {          "match": {            "title": "first"          }        }      ],      "should": [        {          "match": {            "content": "website"          }        },        {          "bool": {            "must": [              {                "match": {                  "content": "first"                }              }            ],            "must_not": [              {                "match": {                  "title": "second"                }              }            ]          }        }      ],      "must_not": [        {          "match": {            "author_id": 111          }        }      ]    }  }}