因为ES是以后搜寻零碎的标杆,在做搜寻零碎时,有时候须要拿ES的实现形式来作为咱们的搜寻零碎实现形式的参考,这时就须要对ES接口的每个参数进行具体的拆解,搞清楚每个参数的作用机制及外部的实现形式,避免接口API在未来产生频繁变动,在具体实现时少走弯路。这个过程中仅仅是ES的文档就有点不够了,ES的文档诚然十分优良,但也不是每个参数都会解说的八面玲珑,有时候咱们须要在源码中寻找答案,上面就ES本地调试环境的搭建做简略的介绍。

  1. 第一步,将ES的源码clone 到本地,这里成文时es的最新版本是7.9.0。

    git clone git@github.com:elastic/elasticsearch.git
  2. 导入到IDE中,这里应用的是idea,ES是应用gradle构建的,能够应用idea的主动导入不便的导入到IDE中,这里要留神的一点是构建过程中会从maven仓库下载相干依赖,找一个速度比拟快的maven仓库能够减速导入,比方阿里的maven仓库,还须要一个vpn,因为构建过程中须要从aws下载一些资源,须要fq。
  3. 导入胜利后,idea的run configuration中会主动呈现一个"Debug Elasticsearch"的配置,能够先将这个跑起来,前面会用到
  4. 执行命令 gradle run --debug-jvm期待启动胜利,启动比较慢,期待启动胜利后就能够通过http(如postman)工具进行拜访了,当然也能够应用kibana。默认会有basic auth,账号是elastic:password

能够先建一个索引

//PUT http://127.0.0.1:9200/test{  "mappings": {    "properties": {      "name":    { "type": "text" }      }  }}

写入一些数据

//POST http://127.0.0.1:9200/_bulk{ "index" : { "_index" : "test", "_id" : "1" } } { "name" : "trying out elastiksearch" }{ "index" : { "_index" : "test", "_id" : "2" } } { "name" : "trylng out elastiksearch" }{ "index" : { "_index" : "test", "_id" : "3" } } { "name" : "trying oute elasticsearch" }{ "index" : { "_index" : "test", "_id" : "4" } } { "name" : "trying outr elasticsearch" }

搜寻

//POST http://127.0.0.1:9200/test/_search{  "query": {    "match": {      "name": {        "query": "trying out elasticsearch haha",        "minimum_should_match": 3,        "operator": "or",        "fuzziness": 1,        "max_expansions": 1      }    }  }}

上面开始进行debug,因为咱们下面用的是match query,能够从match query的实现动手,第一步在org.elasticsearch.index.query.MatchQueryBuilder#doToQuery办法打一个断点,这里是match query的必经之路,在这里能看到match query的第一次改写逻辑,会将match query改写为一个lucene的Boolean query,而Boolean query中的元素视状况而定,有可能是fuzzy query,也有可能是term query

org.apache.lucene.search.IndexSearcher#search(org.apache.lucene.search.Query, org.apache.lucene.search.Collector)办法中咱们能看到query改写后的最终后果,并进入最终的搜寻过程,其余的要杜绝query的内容具体跟踪源码了。

本文首发于简书