美文网首页
ElasticSearch源码本地调试指南

ElasticSearch源码本地调试指南

作者: Foghost | 来源:发表于2020-08-27 11:39 被阅读0次

    由于ES是当前搜索系统的标杆,在做搜索系统时,有时候需要拿ES的实现方式来作为我们的搜索系统实现方式的参考,这时就需要对ES接口的每个参数进行详细的拆解,搞清楚每个参数的作用机制及内部的实现方式,防止接口API在将来发生频繁变动,在具体实现时少走弯路。这个过程中仅仅是ES的文档就有点不够了,ES的文档固然非常优秀,但也不是每个参数都会讲解的面面俱到,有时候我们需要在源码中寻找答案,下面就ES本地调试环境的搭建做简单的介绍。

    1. 第一步,将ES的源码clone 到本地,这里成文时es的最新版本是7.9.0。
    git clone git@github.com:elastic/elasticsearch.git
    
    1. 导入到IDE中,这里使用的是idea,ES是使用gradle构建的,可以使用idea的自动导入方便的导入到IDE中,这里要注意的一点是构建过程中会从maven仓库下载相关依赖,找一个速度比较快的maven仓库可以加速导入,比如阿里的maven仓库,还需要一个vpn,因为构建过程中需要从aws下载一些资源,需要fq。

    2. 导入成功后,idea的run configuration中会自动出现一个"Debug Elasticsearch"的配置,可以先将这个跑起来,后面会用到


      image.png
    3. 执行命令 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的内容具体跟踪源码了。

    相关文章

      网友评论

          本文标题:ElasticSearch源码本地调试指南

          本文链接:https://www.haomeiwen.com/subject/pfccsktx.html