因为 ES 是以后搜寻零碎的标杆,在做搜寻零碎时,有时候须要拿 ES 的实现形式来作为咱们的搜寻零碎实现形式的参考,这时就须要对 ES 接口的每个参数进行具体的拆解,搞清楚每个参数的作用机制及外部的实现形式,避免接口 API 在未来产生频繁变动,在具体实现时少走弯路。这个过程中仅仅是 ES 的文档就有点不够了,ES 的文档诚然十分优良,但也不是每个参数都会解说的八面玲珑,有时候咱们须要在源码中寻找答案,上面就 ES 本地调试环境的搭建做简略的介绍。
-
第一步,将 ES 的源码 clone 到本地,这里成文时 es 的最新版本是 7.9.0。
git clone git@github.com:elastic/elasticsearch.git
- 导入到 IDE 中,这里应用的是 idea,ES 是应用 gradle 构建的,能够应用 idea 的主动导入不便的导入到 IDE 中,这里要留神的一点是构建过程中会从 maven 仓库下载相干依赖,找一个速度比拟快的 maven 仓库能够减速导入,比方阿里的 maven 仓库,还须要一个 vpn,因为构建过程中须要从 aws 下载一些资源,须要 fq。
- 导入胜利后,idea 的 run configuration 中会主动呈现一个 ”Debug Elasticsearch” 的配置,能够先将这个跑起来,前面会用到
- 执行命令
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 的内容具体跟踪源码了。
本文首发于简书