DSL 语法实践例子(一)

Jacob的咖啡屋2019-01-08 14:19:24

ElasticSearch DSL 语法实践例子(一)

这只是一篇课程笔记,方便日后查询。例子从一丢丢数据开始,一点点实践 DSL 语法的方方面面。

Elasticsearch顶尖高手系列

Init

插入 Initial data ,对应elasticsearch 版本为 6.2。

  1. POST /forum/article/_bulk

  2. {"index":{"_id":1}}

  3. {"articleID":"XHDK-A-1293-#fJ3","userID":1,"hidden":false,"postDate":"2017-01-01"}

  4. {"index":{"_id":2}}

  5. {"articleID":"KDKE-B-9947-#kL5","userID":1,"hidden":false,"postDate":"2017-01-02"}

  6. {"index":{"_id":3}}

  7. {"articleID":"JODL-X-1937-#pV7","userID":2,"hidden":false,"postDate":"2017-01-01"}

  8. {"index":{"_id":4}}

  9. {"articleID":"QQPX-R-3956-#aD8","userID":2,"hidden":true,"postDate":"2017-01-02"}

Term

根据用户 ID 搜索帖子

term filter/query, 对搜索文本不分词,直接拿去倒排索引中匹配,你输入什么就搜索什么

  1. GET /forum/article/_search

  2. {

  3.  "query": {

  4.    "constant_score": {

  5.      "filter": {

  6.        "term": {

  7.          "userID": "1"

  8.        }

  9.      }

  10.    }

  11.  }

  12. }

搜索没有隐藏的帖子

  1. GET /forum/article/_search

  2. {

  3.  "query": {

  4.    "constant_score": {

  5.      "filter": {

  6.        "term": {

  7.          "hidden": "false"

  8.        }

  9.      },

  10.      "boost": 1.2

  11.    }

  12.  }

  13. }

根据发帖日期搜索

  1. GET /forum/article/_search

  2. {

  3.  "query": {

  4.    "constant_score": {

  5.      "filter": {

  6.        "term": {

  7.          "postDate": "2017-01-02"

  8.        }

  9.      },

  10.      "boost": 1.2

  11.    }

  12.  }

  13. }

根据帖子ID搜索

  1. GET /forum/_search

  2. {

  3.  "query": {

  4.    "constant_score": {

  5.      "filter": {

  6.        "term": {

  7.          "articleID.keyword": "KDKE-B-9947-#kL5"

  8.        }

  9.      },

  10.      "boost": 1.2

  11.    }

  12.  }

  13. }

text类型。自动生成不分词field,默认 text 是由分词器处理,这样的话直接搜索 articleID 字段,是找不到的。必须用默认不分词的版本,即自动生成 keyword field。

  1. {

  2.    "articleID": {

  3.        "type": "text",

  4.        "fields": {

  5.            "keyword": {

  6.                "type": "keyword",

  7.                "ignore_above": 256

  8.            }

  9.        }

  10.    }

  11. }

Terms

类似于 SQL 中 in 的语法

Pre

  1. POST /forum/article/_bulk

  2. {"update":{"_id":1}}

  3. {"doc":{"tags":["java","hadoop"]}}

  4. {"update":{"_id":2}}

  5. {"doc":{"tags":["java"]}}

  6. {"update":{"_id":3}}

  7. {"doc":{"tags":["hadoop"]}}

  8. {"update":{"_id":4}}

  9. {"doc":{"tags":["java","elasticsearch"]}}

搜索 articleID 为 JODL-X-1937-#pV7 或 KDKE-B-9947-#kL5 的帖子

  1. GET forum/_search

  2. {

  3.  "query": {

  4.    "constant_score": {

  5.      "filter": {

  6.        "terms": {

  7.          "articleID.keyword": [

  8.            "JODL-X-1937-#pV7",

  9.            "KDKE-B-9947-#kL5"

  10.          ]

  11.        }

  12.      },

  13.      "boost": 1.2

  14.    }

  15.  }

  16. }

搜索 tags 中包含 java 的帖子

  1. GET /forum/article/_search

  2. {

  3.  "query": {

  4.    "constant_score": {

  5.      "filter": {

  6.        "terms": {

  7.          "tags": ["java"]

  8.        }

  9.      },

  10.      "boost": 1.2

  11.    }

  12.  }

  13. GET /forum/article/_search

  14. {

  15.  "query": {

  16.    "constant_score": {

  17.      "filter": {

  18.        "bool": {

  19.          "must":[

  20.            {

  21.              "terms":{"tags":["java"]}

  22.            },

  23.            {"term":{"tag_cnt":1}}

  24.            ]

  25.        }

  26.      },

  27.      "boost": 1.2

  28.    }

  29.  }

  30. }

Bool

bool 里可以放 must should must_not filter 等过滤条件

搜索 postDate 为2017-01-01,或者articleID为 XHDK-A-1293-#fJ3 的帖子,同时要求帖子的发帖日期绝对不能是 2017-01-02

  1. GET /forum/article/_search

  2. {

  3.  "query": {

  4.    "constant_score": {

  5.      "filter": {

  6.        "bool": {

  7.          "should": [

  8.            {

  9.              "term": {

  10.                "postDate": "2017-01-01"

  11.              }

  12.            },

  13.            {

  14.              "term": {

  15.                "articleID": "XHDK-A-1293-#fJ3"

  16.              }

  17.            }

  18.          ],

  19.          "must_not":{"term":{"postDate":"2017-01-02"}}

  20.        }

  21.      },

  22.      "boost": 1.2

  23.    }

  24.  }

  25. }

搜索articleID 为 XHDK-A-1293-#fJ3,或者是帖子ID为JODL-X-1937-#pV7 而且发帖日期为2017-01-01的帖子

  1. GET /forum/article/_search

  2. {

  3.  "query": {

  4.    "constant_score": {

  5.      "filter": {

  6.        "bool": {

  7.          "should": [

  8.            {

  9.              "term": {

  10.                "articleID.keyword": "XHDK-A-1293-#fJ3"

  11.              }

  12.            },

  13.            {

  14.              "bool": {

  15.                "must": [

  16.                  {

  17.                    "term": {

  18.                      "articleID.keyword": "JODL-X-1937-#pV7"

  19.                    }

  20.                  },

  21.                  {

  22.                    "term": {

  23.                      "postDate": "2017-01-01"

  24.                    }

  25.                  }

  26.                ]

  27.              }

  28.            }

  29.          ]

  30.        }

  31.      },

  32.      "boost": 1.2

  33.    }

  34.  }

  35. }

Range

Pre

  1. POST /forum/article/_bulk

  2. {"update":{"_id": "1"}}

  3. {"doc":{"view_cnt":30}}

  4. {"update":{"_id": "2"}}

  5. {"doc":{"view_cnt":50}}

  6. {"update":{"_id": "3"}}

  7. {"doc":{"view_cnt":100}}

  8. {"update":{"_id": "1"}}

  9. {"doc":{"view_cnt":80}}

搜索浏览量在30~60之间的帖子

  1. GET /forum/article/_search

  2. {

  3.  "query": {

  4.    "constant_score": {

  5.      "filter": {

  6.        "range": {

  7.          "view_cnt": {

  8.            "gte": 30,

  9.            "lte": 60

  10.          }

  11.        }

  12.      },

  13.      "boost": 1.2

  14.    }

  15.  }

  16. }

搜索发帖日期在最近1个月的帖子

NOW 用于 date 字段

  1. GET /forum/article/_search

  2. {

  3.  "query": {

  4.    "constant_score": {

  5.      "filter": {

  6.        "range": {

  7.          "postDate": {

  8.            "gte": "now-1m"

  9.          }

  10.        }

  11.      },

  12.      "boost": 1.2

  13.    }

  14.  }

  15. }

搜索给定日期附近的帖子,eg: 2017-01-04 一个月内

  1. GET /forum/article/_search

  2. {

  3.  "query": {

  4.    "constant_score": {

  5.      "filter": {

  6.        "range": {

  7.          "postDate": {

  8.            "gte": "2017-01-04||-1M"

  9.          }

  10.        }

  11.      },

  12.      "boost": 1.2

  13.    }

  14.  }

  15. }

Match.and

pre

  1. POST /forum/article/_bulk

  2. {"update":{"_id":1}}

  3. {"doc":{"title":"this is java and elasticsearch blog"}}

  4. {"update":{"_id":2}}

  5. {"doc":{"title":"this is java blog"}}

  6. {"update":{"_id":3}}

  7. {"doc":{"title":"this is elasticsearch blog"}}

  8. {"update":{"_id":4}}

  9. {"doc":{"title":"this is java, elasticsearch, hadoop blog"}}

搜索标题中包含 java 和 elasticsearch 的 blog

  1. GET /forum/article/_search

  2. {

  3.  "query": {

  4.    "match": {

  5.      "title": {

  6.        "query": "java elasticsearch",

  7.        "operator": "and"

  8.      }

  9.    }

  10.  }

  11. }

Match.minimumshouldmatch

java elasticsearch hadoop spark 中必须有三个匹配

  1. GET /forum/article/_search

  2. {

  3.  "query": {

  4.    "match": {

  5.      "title": {

  6.        "query": "java elasticsearch hadoop spark",

  7.        "minimum_should_match": "75%"

  8.      }

  9.    }

  10.  }

  11. }

当然,用 bool 也成。。事实上,ES底层就是将上面的转换为下面的形式

  1. GET forum/article/_search

  2. {

  3.  "query": {

  4.    "constant_score": {

  5.      "filter": {

  6.        "bool": {

  7.          "should":[

  8.            {"term":{"title":"java"}},

  9.            {"term":{"title":"elasticsearch"}},

  10.            {"term":{"title":"hadoop"}}

  11.          ],

  12.          "minimum_should_match":2

  13.        }

  14.      },

  15.      "boost": 1.2

  16.    }

  17.  }

  18. }

Boost

搜索标题中包含 java 的帖子

同时, 如果标题中包含 hadoop 或 Elasticsearch 优先。

如果一个帖子包含 java, hadoop, 一个帖子包含java,elasticsearch,包含hadoop的帖子要比elasticsearch 优先。

  1. GET /forum/article/_search

  2. {

  3.  "query": {

  4.    "bool": {

  5.      "must": [

  6.        {

  7.          "match": {

  8.            "title": "java"

  9.          }

  10.        }

  11.      ],

  12.      "should": [

  13.        {

  14.          "match": {

  15.            "title": {

  16.              "query": "elasticsearch",

  17.              "boost": 1.5

  18.            }

  19.          }

  20.        },

  21.        {

  22.          "match": {

  23.            "title": {

  24.              "query": "hadoop",

  25.              "boost": 2

  26.            }

  27.          }

  28.        }

  29.      ]

  30.    }

  31.  }

  32. }


Copyright © 温县电话机虚拟社区@2017