首页 > 编程语言 >Go源码阅读——github.com/medcl/esm —— v7.go

Go源码阅读——github.com/medcl/esm —— v7.go

时间:2023-05-21 18:14:01浏览次数:52  
标签:err github string nil 源码 medcl go scroll log

esm(An Elasticsearch Migration Tool)—— v7.go 

https://github.com/medcl/esm release: 8.7.1

通过阅读好的源代码,细致思考,理性分析并借鉴优秀实践经验,提高 zuoyang 的编程水平,所谓 "他山之石,可以攻玉"  该是如此吧。 

/*
Copyright 2016 Medcl (m AT medcl.net)

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package main

import (
	"bytes"
	"encoding/json"
	"errors"
	"fmt"
	"io"
	"io/ioutil"
	"regexp"
	"strings"

	log "github.com/cihub/seelog"
)

type ESAPIV7 struct {
	ESAPIV6
}

/**/
func (s *ESAPIV7) NewScroll(indexNames string, scrollTime string, docBufferCount int, query string, slicedId, maxSlicedCount int, fields string) (scroll interface{}, err error) {
	url := fmt.Sprintf("%s/%s/_search?scroll=%s&size=%d", s.Host, indexNames, scrollTime, docBufferCount)

	/*这里和 v5,v6都不同,前2者都是 var jsonBody []byte */
	jsonBody := ""
	if len(query) > 0 || maxSlicedCount > 0 || len(fields) > 0 {
		queryBody := map[string]interface{}{}

		if len(fields) > 0 {
			if !strings.Contains(fields, ",") {
				queryBody["_source"] = fields
			} else {
				queryBody["_source"] = strings.Split(fields, ",")
			}
		}

		if len(query) > 0 {
			queryBody["query"] = map[string]interface{}{}
			queryBody["query"].(map[string]interface{})["query_string"] = map[string]interface{}{}
			queryBody["query"].(map[string]interface{})["query_string"].(map[string]interface{})["query"] = query
		}

		if maxSlicedCount > 1 {
			log.Tracef("sliced scroll, %d of %d", slicedId, maxSlicedCount)
			queryBody["slice"] = map[string]interface{}{}
			queryBody["slice"].(map[string]interface{})["id"] = slicedId
			queryBody["slice"].(map[string]interface{})["max"] = maxSlicedCount
		}
		/*和 v5.go v6.go相比较,5和6的这部分代码:jsonBody, err = json.Marshal(queryBody)*/
		jsonArray, err := json.Marshal(queryBody)
		if err != nil {
			log.Error(err)

		} else {
			jsonBody = string(jsonArray)
		}
	}

	/*
		v5.go v6.go:
			body, err := DoRequest(s.Compress,"POST",url, s.Auth,jsonBody,s.HttpProxy)
	*/
	resp, body, errs := Post(url, s.Auth, jsonBody, s.HttpProxy)

	/* 和 v5.go v6.go 相比较,这段是新增的,v7新增这部分的处理更好。*/
	if resp != nil && resp.Body != nil {
		io.Copy(ioutil.Discard, resp.Body)
		defer resp.Body.Close()
	}

	if errs != nil {
		log.Error(errs)
		return nil, errs[0]
	}

	/* 和 v5.go v6.go 相比较,这段是新增的,v7新增这部分的处理更好。*/
	if resp.StatusCode != 200 {
		return nil, errors.New(body)
	}

	/* 和 v5.go v6.go 相比较,这段是新增的,v7新增这部分的处理更好。*/
	log.Trace("new scroll,", body)

	if err != nil {
		log.Error(err)
		return nil, err
	}

	/*v5.go v6.go scroll = &Scroll{}, v7.go 不同*/
	scroll = &ScrollV7{}
	err = DecodeJson(body, scroll)
	if err != nil {
		log.Error(err)
		return nil, err
	}

	return scroll, err
}

/*
这段代码用于滚动查询。它接收2个参数,这里不重复介绍了,和 v5.go v6.go 一样。
*/
func (s *ESAPIV7) NextScroll(scrollTime string, scrollId string) (interface{}, error) {
	id := bytes.NewBufferString(scrollId)

	url := fmt.Sprintf("%s/_search/scroll?scroll=%s&scroll_id=%s", s.Host, scrollTime, id)
	body, err := DoRequest(s.Compress, "GET", url, s.Auth, nil, s.HttpProxy)

	/*相比 v5.go v6.go,v7.go 在这里多一次判断。*/
	if err != nil {
		//log.Error(errs)
		return nil, err
	}
	// decode elasticsearch scroll response
	/*v5.go,v6.go scroll := &Scroll{}*/
	scroll := &ScrollV7{}
	err = DecodeJson(body, &scroll)
	if err != nil {
		log.Error(err)
		return nil, err
	}

	return scroll, nil
}

func (s *ESAPIV7) GetIndexSettings(indexNames string) (*Indexes, error) {
	return s.ESAPIV0.GetIndexSettings(indexNames)
}

func (s *ESAPIV7) UpdateIndexSettings(indexName string, settings map[string]interface{}) error {
	return s.ESAPIV0.UpdateIndexSettings(indexName, settings)
}

/*和v6.go 没什么不同,看不出重写的意义。v5.go 是 v0.go,也看不出 v0.go 和 v7.go 区别*/
func (s *ESAPIV7) GetIndexMappings(copyAllIndexes bool, indexNames string) (string, int, *Indexes, error) {
	url := fmt.Sprintf("%s/%s/_mapping", s.Host, indexNames)
	resp, body, errs := Get(url, s.Auth, s.HttpProxy)

	if resp != nil && resp.Body != nil {
		io.Copy(ioutil.Discard, resp.Body)
		defer resp.Body.Close()
	}

	if errs != nil {
		log.Error(errs)
		return "", 0, nil, errs[0]
	}

	if resp.StatusCode != 200 {
		return "", 0, nil, errors.New(body)
	}

	idxs := Indexes{}
	er := DecodeJson(body, &idxs)

	if er != nil {
		log.Error(body)
		return "", 0, nil, er
	}

	// if _all indexes limit the list of indexes to only these that we kept
	// after looking at mappings
	if indexNames == "_all" {

		var newIndexes []string
		for name := range idxs {
			newIndexes = append(newIndexes, name)
		}
		indexNames = strings.Join(newIndexes, ",")

	} else if strings.Contains(indexNames, "*") || strings.Contains(indexNames, "?") {

		r, _ := regexp.Compile(indexNames)

		//check index patterns
		var newIndexes []string
		for name := range idxs {
			matched := r.MatchString(name)
			if matched {
				newIndexes = append(newIndexes, name)
			}
		}
		indexNames = strings.Join(newIndexes, ",")

	}

	i := 0
	// wrap in mappings if moving from super old es
	for name, idx := range idxs {
		i++
		fmt.Println(name)
		if _, ok := idx.(map[string]interface{})["mappings"]; !ok {
			(idxs)[name] = map[string]interface{}{
				"mappings": idx,
			}
		}
	}

	return indexNames, i, &idxs, nil
}

/*更新 Elasticsearch 中索引的映射(mapping)*/
func (s *ESAPIV7) UpdateIndexMapping(indexName string, settings map[string]interface{}) error {

	log.Debug("start update mapping: ", indexName, settings)

	/*
		v7.go 和 v6.go 在这里是相同的。v0.go 和 v5.go 是相同的,但是与 v7.go 和 v6.go不同,没有这行delete代码
	*/
	delete(settings, "dynamic_templates")

	/*
		v7.go 在这块的实现和 v0.go v5.go v6.go 均不同,后者是放在 for name, _ := range settings {} 中。
		v7.go 为啥要注释掉for循环呀?
	*/
	//for name, mapping := range settings {
	log.Debug("start update mapping: ", indexName, ", ", settings)

	/*
		用于管理和操作索引的api,可以创建、更新、获取索引映射(mapping)
		这段 v0.go 和 v5.go 是一样的,v6.go 和 v7.go 是一样的。
		v0.go:
			url := fmt.Sprintf("%s/%s/%s/_mapping", s.Host, indexName, name)
	*/
	url := fmt.Sprintf("%s/%s/_mapping", s.Host, indexName)

	body := bytes.Buffer{}
	enc := json.NewEncoder(&body)
	enc.Encode(settings)
	res, err := Request("POST", url, s.Auth, &body, s.HttpProxy)
	if err != nil {
		log.Error(url)
		log.Error(body.String())
		log.Error(err, res)
		panic(err)
	}
	//}
	return nil
}

标签:err,github,string,nil,源码,medcl,go,scroll,log
From: https://www.cnblogs.com/zuoyang/p/17418915.html

相关文章

  • CesiumJS 源码杂谈 - 时间与时钟系统
    目录1.时间的“诞生”2.时间的推进3.EntityAPI与PropertyAPI的更新动力源4.简单应用4.1.使用原生JSDate对象创建JulianDate4.2.使用时间字符串(ISO8601标准的时间字符串或UTC时间字符串)创建JulianDate4.3.为时钟设置起止时间和速率4.4.调整时钟的循环情况你......
  • java基于springboot+vue的土特产在线销售平台、特产在线销售商城,附源码+数据库+lw文档
    1、项目介绍考虑到实际生活中在藏区特产销售管理方面的需要以及对该系统认真的分析,将系统权限按管理员和用户这两类涉及用户划分。(1)管理员功能需求管理员登陆后,主要模块包括首页、个人中心、用户管理、特产信息管理、特产分类管理、特产分类管理、特产评分管理、系统管理、订单......
  • 几篇不错的jquery源码总结的文章
    网上看到的几篇写的不错的jquery源码的文章,感觉不错,转载过来,以备温习之用,有时间自己也该看看源码了。 http://www.iteye.com/topic/349020http://www.iteye.com/topic/545971http://www.iteye.com/topic/1126505http://www.iteye.com/topic/1126505http://www.iteye.com/topic/714......
  • 多款前端商城购物网站html模板源码
    1、仿淘宝粉色女性化妆品网上商城模板html源码​编辑切换为居中添加图片注释,不超过140字(可选)​编辑切换为居中添加图片注释,不超过140字(可选)​编辑切换为居中添加图片注释,不超过140字(可选)2、淘宝京东商......
  • React 源码调试 (react版本17.0.2)
    环境准备//create-react-a匹配版本$create-react-app-V5.0.1//node版本$node-Vv16.16.0  1、第一步通过create-react-app快速创建环境,然后运行yarneject释放webpack配置  npxcreate-react-appreact-debugyarneject 2、第二步降级reac......
  • Go源码阅读——github.com/medcl/esm —— v5.go
    esm(AnElasticsearchMigrationTool)——v5.go https://github.com/medcl/esmrelease:8.7.1通过阅读好的源代码,细致思考,理性分析并借鉴优秀实践经验,提高zuoyang的编程水平,所谓"他山之石,可以攻玉" 该是如此吧。 /*Copyright2016Medcl(mATmedcl.net)Licensed......
  • 互联网医院系统源码解析:实现在线问诊、挂号和支付功能
    互联网医院系统为大家的日常看病提供了更加便捷的服务,近期热度极高。本篇文章,小编将从互联网医院系统源码的角度,解析其如何实现在线问诊、挂号和支付功能。一、基本架构1. 前端前端主要由HTML、CSS和JavaScript等技术实现,通过浏览器与用户进行交互。互联网医院系统源码的前端的主......
  • 源代码管理工具GitHub使用指南-以“寻舍网”项目为例
    GitHub是一个面向开源及私有软件项目的托管平台,因为只支持Git作为唯一的版本库格式进行托管,故名GitHub。GitHub于2008年4月10日正式上线,除了Git代码仓库托管及基本的Web管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享......
  • 源代码管理工具GitHub
    一、GitHub介绍:GitHub是一个面向开源及私有软件项目的托管平台,因为只支持Git作为唯一的版本库格式进行托管,故名GitHub。GitHub是一个受开发者工作方式启发的开发平台,从开源到商业,能够在上面进行托管和查看代码、管理项目和数百万其他开发人员一起开发软件。GitHub于20......
  • 【源码解读】asp.net core源码启动流程精细解读
    引言core出来至今,已经7年了,我接触也已经4年了,从开始的2.1,2.2,3.1,5,6再到如今的7,一直都有再用,虽然我是一个Winform仔,但是源码一直从3.1到7都有再看,然后在QQ上面也一直比较活跃,之前好几年前一直说给大家解读asp.netcore源码,在之前的博客中,讲的都是比较粗略化的,因为东西太多......