下面先解释一下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
}
}
]
}
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。