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

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

时间:2023-05-20 18:13:56浏览次数:45  
标签:github string err 源码 medcl queryBody interface query scroll

esm(An Elasticsearch Migration Tool)—— v5.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"
	"fmt"
	"strings"

	log "github.com/cihub/seelog"
)

type ESAPIV5 struct {
	ESAPIV0
}

func (s *ESAPIV5) ClusterHealth() *ClusterHealth {
	return s.ESAPIV0.ClusterHealth()
}

func (s *ESAPIV5) Bulk(data *bytes.Buffer) {
	s.ESAPIV0.Bulk(data)
}

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

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

func (s *ESAPIV5) GetIndexMappings(copyAllIndexes bool, indexNames string) (string, int, *Indexes, error) {
	return s.ESAPIV0.GetIndexMappings(copyAllIndexes, indexNames)
}

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

func (s *ESAPIV5) DeleteIndex(name string) (err error) {
	return s.ESAPIV0.DeleteIndex(name)
}

func (s *ESAPIV5) CreateIndex(name string, settings map[string]interface{}) (err error) {
	return s.ESAPIV0.CreateIndex(name, settings)
}

func (s *ESAPIV5) Refresh(name string) (err error) {
	return s.ESAPIV0.Refresh(name)
}

/*这段代码用于创建 Elasticsearch 的一个 Scroll API 请求。*/
/*
	这段代码的功能是用于创建一个 Elasticsearch 的 Scroll API 请求。返回 scroll 接口和错误类型 error。
		indexNames: string数据类型,用于表示索引名称。
		scrollTime: string数据类型,用于表示滚动时间。
		docBufferCount: int数据类型,文档缓冲区大小。
		query: string数据类型,用于表示查询。
		slicedId: int数据类型,用于表示切片ID。
		maxSlicedCount: int数据类型,用于表示最大切片数。
		fields: string数据类型,用于表示字段。

*/
func (s *ESAPIV5) NewScroll(indexNames string, scrollTime string, docBufferCount int, query string, slicedId, maxSlicedCount int, fields string) (scroll interface{}, err error) {

	/*这段代码用来构建 Elasticsearch Scroll API 的 URL 的。*/
	url := fmt.Sprintf("%s/%s/_search?scroll=%s&size=%d", s.Host, indexNames, scrollTime, docBufferCount)

	var jsonBody []byte

	/*判断是否有查询条件,是否有限制返回数据的数量,是否有需要返回的字段*/
	if len(query) > 0 || maxSlicedCount > 0 || len(fields) > 0 {
		queryBody := map[string]interface{}{}

		/*返回字段*/
		if len(fields) > 0 {
			/*如果 fields 是不包含由逗号分隔的字符串,它将被设置为 _source 查询参数的值*/
			if !strings.Contains(fields, ",") {
				queryBody["_source"] = fields
			} else {
				/*否则,字段名是一个由逗号分隔的字符串,则它将拆分成一个字符串切片,并赋值给 _source*/
				queryBody["_source"] = strings.Split(fields, ",")
			}
		}
		/*处理用户的查询参数*/
		if len(query) > 0 {
			/*如果用户设置了查询参数,则创建一个 queryBody["query"] 空 map类型变量*/
			queryBody["query"] = map[string]interface{}{}
			/*queryBody["query"] 的值设置为一个新的 query_string Map 类型变量*/
			queryBody["query"].(map[string]interface{})["query_string"] = map[string]interface{}{}
			/*并将用户提供的查询字符串设置为 queryBody["query"]["query_string"]["query"] 的值*/
			queryBody["query"].(map[string]interface{})["query_string"].(map[string]interface{})["query"] = query
		}

		/*使用 Scroll API 进行分片查询。当数据量较大的时候,es通常需要对数据进行分片处理以提高查询效率。*/
		if maxSlicedCount > 1 {

			/*
				log.Tracef 和 log.Infof 是日志记录的两个方法,它们之间的区别如下:
					log.Tracef 用于输出跟踪信息级别 (trace),通常用于输出程序中非常详细的调试信息。对于一些需要追踪的操作,可以使用该方法输出相关的日志信息,并通过查看日志文件来分析问题所在。
					log.Infof 用于输出信息级别 (info),通常用于输出程序的运行状态信息。当程序需要输出运行状态信息时,可以使用该方法输出相关的日志信息,并通过查看日志文件来了解程序的运行状况。
				下面这段代码,通过 log 对象输出一条日志,用来记录当前分片的ID和总分片数。
			*/
			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
		}

		/*这段代码是将一个结构体(queryBody)转换为 json 字符串格式(jsonBody)*/
		jsonBody, err = json.Marshal(queryBody)
		if err != nil {
			log.Error(err)
		}
	}

	/*
		这段代码是使用 "DoRequest" 方法来执行 HTTP 请求并发送 JSON 格式的请求正文(即"jsonBody")。
		如果在发送请求时出现错误,将返回 "nil" 并将错误信息记录在日志中。
	*/
	body, err := DoRequest(s.Compress, "POST", url, s.Auth, jsonBody, s.HttpProxy)
	if err != nil {
		log.Error(err)
		return nil, err
	}

	scroll = &Scroll{}
	err = DecodeJson(body, scroll)
	if err != nil {
		log.Error(err)
		return nil, err
	}

	return scroll, err
}

/*
这段代码的作用是获取 Elasticsearch 的 Scroll API 的下一页结果。
scrollTime: string数据类型,表示查询的有效时间。
scrollID: string数据类型,表示前一个 scroll 的返回结果中包含的 ID。
*/
func (s *ESAPIV5) NextScroll(scrollTime string, scrollId string) (interface{}, error) {

	id := bytes.NewBufferString(scrollId)
	/*根据传入的 scrollTime 和 scrollID 构造请求 URL。*/
	url := fmt.Sprintf("%s/_search/scroll?scroll=%s&scroll_id=%s", s.Host, scrollTime, id)

	/*调用 DoRequest 方法发起 HTTP GET 请求。*/
	body, err := DoRequest(s.Compress, "GET", url, s.Auth, nil, s.HttpProxy)

	// decode elasticsearch scroll response
	scroll := &Scroll{}
	err = DecodeJson(body, &scroll)
	if err != nil {
		log.Error(err)
		return nil, err
	}

	return scroll, nil
}

标签:github,string,err,源码,medcl,queryBody,interface,query,scroll
From: https://www.cnblogs.com/zuoyang/p/17417564.html

相关文章

  • 互联网医院系统源码解析:实现在线问诊、挂号和支付功能
    互联网医院系统为大家的日常看病提供了更加便捷的服务,近期热度极高。本篇文章,小编将从互联网医院系统源码的角度,解析其如何实现在线问诊、挂号和支付功能。一、基本架构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源码,在之前的博客中,讲的都是比较粗略化的,因为东西太多......
  • springboot基于vue的MOBA类游戏攻略分享平台、游戏资讯分享平台,附源码+数据库+lw文档+
    1、项目介绍任何系统都要遵循系统设计的基本流程,本系统也不例外,同样需要经过市场调研,需求分析,概要设计,详细设计,编码,测试这些步骤,基于java语言设计并实现了MOBA类游戏攻略分享平台。该系统基于B/S即所谓浏览器/服务器模式,应用java技术,选择MySQL作为后台数据库。系统主要包括系统首......
  • Mybatis Plus 源码分析
    ====================================MybatisPlus源码分析入口:com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration#afterPropertiesSetcom.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration#sqlSessionFactorycom.baomidou.mybatisplus.a......
  • 直播源码技术控制直播稳定之消息篇
     在日常生活中,我们上网看直播在各个直播间内通常能看到各种各样的消息,像是用户为主播打赏礼物,直播间聊天区,又或是用户点赞出现的符号信息等,这些消息在让直播间变得多姿多彩同时,也为直播平台运营商面临了一个问题:当消息类型同时发出且数量庞大时,直播间就很可能崩溃,那我们如何解决......
  • 手撕ThreadLocal源码
    1. 图解  722. 代码  72代码在com.powernode.threadlocalTestpackagecom.powernode.threadlocal;//这里是主main方法72publicclassTest{publicstaticvoidmain(String[]args){//获取Thread对象Threadthread=Thread.currentThread();......
  • 直播源码技术控制直播稳定之消息篇
    在日常生活中,我们上网看直播在各个直播间内通常能看到各种各样的消息,像是用户为主播打赏礼物,直播间聊天区,又或是用户点赞出现的符号信息等,这些消息在让直播间变得多姿多彩同时,也为直播平台运营商面临了一个问题:当消息类型同时发出且数量庞大时,直播间就很可能崩溃,那我们如何解决这个......
  • iEnhancer-ENCC_test_layer1.py源码阅读
    一、基本准备¶1、导入包:与train一致¶ In [ ]:importnumpyasnpimporttorchfromtorchimportnnfromtorch.autogradimportVariablefromtorch.utils.dataimportDataset,DataLoaderimporttorch.nn.functionalasFimportpickleimport......