网站建设 拖欠尾款,如何用VS2017做网站,张家港做网站的公司,人力管理系统前面两篇文章介绍了elasticsearch以及Kibana的安装#xff0c;检索引擎以及可视化工具都已经安装完成#xff0c;接下来介绍下如何使用golang的sdk实现简单的分页查询。
1、下载Elastic官方golang sdk
在讲解elasticsearch检索之前#xff0c;需要先把golang的环境安装好检索引擎以及可视化工具都已经安装完成接下来介绍下如何使用golang的sdk实现简单的分页查询。
1、下载Elastic官方golang sdk
在讲解elasticsearch检索之前需要先把golang的环境安装好go的安装可以参考官方文档mac、linux下的安装都非常简单参考以下文档
go下载地址https://go.dev/dl/
安装说明https://go.dev/doc/install
安装完成后把goproxy改成国内代理执行以下命令
go env -w GOPROXYhttps://goproxy.cn,direct
下载elasticsearch官方golang包
go get github.com/elastic/go-elasticsearch/v8
或者直接在代码里引入该包之后通过命令
go mod tidy
来下载各种依赖包。
2、测试数据说明 es中一共写入了11000条数据doc_id字段标识了数据的索引有助于说明本文分享的使用fromsize参数的检索。
3、使用fromsize实现分页检索
首先定义检索结果的基础数据结构 // 最外层数据结构
type Documents struct {Shards Shards json:_shardsHits HitOutLayer json:hitsTimedOut bool json:timed_outTook int json:took
}
type Shards struct {Failed int json:failedSkipped int json:skippedSuccessful int json:successfulTotal int json:total
}
type HitOutLayer struct {Hits []Hits json:hitsMaxScore float64 json:max_scoreTotal Total json:total
}
type Hits struct {ID string json:_idIndex string json:_indexScore float64 json:_scoreSource map[string]any json:_sourceType string json:_type
}
type Total struct {Relation string json:relationValue int json:value
}
连接eses8默认是通过https进行连接因此在连接时需要设置证书证书的位置在es路径下的config文件夹中 连接es的代码如下
cert, _ : os.ReadFile(/Users/liupeng/Documents/study/elasticsearch-8.17.0/config/certs/http_ca.crt)
client, err : elasticsearch.NewClient(elasticsearch.Config{Username: elastic,Password: XBSadqa799j_AozAh,Addresses: []string{https://127.0.0.1:9200},CACert: cert,
})
构建检索dsl跳过前面1000个文档检索10条文档
dslQuery : esbuilder.NewDsl()
boolQuery : esbuilder.NewBoolQuery()
boolQuery.Filter(esbuilder.NewRangeQuery(doc_id).Gte(1))
dslQuery.SetQuery(boolQuery)
dslQuery.SetFrom(1000)
dslQuery.SetSize(3)
dslQuery.SetOrder(esbuilder.NewSortQuery(doc_id, asc))
dsl : dslQuery.BuildJson()
构建dsl我使用了自研的构建dsl的库
github.com/liupengh3c/esbuilder
主打一个方便就不用开发者自行去拼凑dsl了开发成本降低了许多。
执行检索过程并把检索到的内容进行打印
search : esapi.SearchRequest{Index: []string{new_tag_202411},Body: strings.NewReader(dsl),
}
resp, err : search.Do(context.Background(), client)
if err ! nil {fmt.Println(search err:, err.Error())return
}
json.NewDecoder(resp.Body).Decode(docs)
strDoc, _ : json.MarshalToString(docs)
fmt.Println(strDoc)
理论上应该打印doc_id从1001开始到1003的3条数据打印出来的数据如下
{_shards: {failed: 0,skipped: 0,successful: 1,total: 1},hits: {hits: [{_id: JME17xx_adc_behavior_NOJUNCTION_STRAIGHT_1_1732982184160_1732982184860_1733030180041,_index: new_tag_202411,_score: 0,_source: {adc_behavior: NOJUNCTION_STRAIGHT,car_id: JME17xx,create_time: 2024-12-23 21:34:51,doc_id: 1001,end_time: 1732982184860,rule_id: 1,rule_priority: 1,rule_version: 2.1.0.0,start_time: 1732982184160,tag_additional_info: {adc_driving_mode: COMPLETE_MANUAL,average_speed: 0.003893,driving_mode: 0,end_point: {x: 222294.311402,y: 3373118.699096,z: 14.721843},start_point: {x: 222294.312234,y: 3373118.698359,z: 14.721373}},tag_name: adc_behavior,user: liupeng},_type: },{_id: JME18xx_adc_behavior_NOJUNCTION_STRAIGHT_1_1732982184140_1732982218540_1733030184257,_index: new_tag_202411,_score: 0,_source: {adc_behavior: NOJUNCTION_STRAIGHT,car_id: JME18xx,create_time: 2024-12-23 21:34:51,doc_id: 1002,end_time: 1732982218540,rule_id: 1,rule_priority: 1,rule_version: 2.1.0.0,start_time: 1732982184140,tag_additional_info: {adc_driving_mode: COMPLETE_AUTO_DRIVE,average_speed: 3.86589,driving_mode: 1,end_point: {x: 219886.247841,y: 3374513.249021,z: 8.882025},start_point: {x: 219576.290596,y: 3374298.199175,z: 9.130117}},tag_name: adc_behavior,user: liupeng},_type: },{_id: ARCFxx_adc_behavior_U_TURN_1_1732982184047_1732982227367_1733030187627,_index: new_tag_202411,_score: 0,_source: {adc_behavior: U_TURN,car_id: ARCFxx,create_time: 2024-12-23 21:34:52,doc_id: 1003,end_time: 1732982227367,rule_id: 1,rule_priority: 1,rule_version: 2.1.0.0,start_time: 1732982184047,tag_additional_info: {adc_driving_mode: COMPLETE_AUTO_DRIVE,average_speed: 10.146669,driving_mode: 1,end_point: {x: 228474.086367,y: 3392800.40123,z: 8.736978},start_point: {x: 228502.4916,y: 3392823.01595,z: 8.714573}},tag_name: adc_behavior,user: liupeng},_type: }],max_score: 0,total: {relation: gte,value: 10000}},timed_out: false,took: 2
}
结果的返回是符合预期的perfect。
4、一个很重要的知识点
formsize的这种分页方式是有前提的就是只能检索10000条以内的数据如果超过10000那就不灵了超过10000后一条数据都不会返回比如我们将设置from、size的代码改成如下
dslQuery : esbuilder.NewDsl()
boolQuery : esbuilder.NewBoolQuery()
boolQuery.Filter(esbuilder.NewRangeQuery(doc_id).Gte(1))
dslQuery.SetQuery(boolQuery)
dslQuery.SetFrom(9998)
dslQuery.SetSize(3)
dslQuery.SetOrder(esbuilder.NewSortQuery(doc_id, asc))
dsl : dslQuery.BuildJson()
跳过前面9998条检索3条数据出来很明显这样的检索条件是超过了10000条的执行代码后检索没有结果 所以这种检索分页方式存在局限性在10000条数据之内可以这么使用但是一旦超过10000就会有问题当然我们也不用担心elastic是有解决方案的我会再单独写文章来介绍。
5、one more thing
我在自己的macbook上【在家里】安装了es注意关键信息是【在家里】安装的上班的时候把自己电脑带到了公司上班摸鱼的时候我打开了自己电脑连接wifi启动es、kibana准备把公司mac上es的数据copy到自己mac上问题来了自己mac上kibnan启动不了了启动不了了......我很纳闷啥情况为啥启动不了了难道是我替换了es文件夹下data的缘故吗重新恢复为自己的data问题依旧。
下班心想还得把公司电脑上es的数据拷贝一份到自己mac上以用来测试就把公司mac带回家连接家里的wifi我满怀期待的打开电脑准备倒数据结果公司电脑的kibana也启动不了启动不了了我的天哪这是见鬼了吗啥情况呢自己电脑上的kibana能启动了这是在外面认生吗得回到自己家才能启动这是问题1这个时候我心想公司电脑上kibana启动不了就算了我直接用自己mac跑代码读取公司mac上es的数据然后写入到本地的es上问题又来了竟然连接不上提示证书授权的ip没有当前ip这完蛋了这是问题2。
于是我就停下来大概想了一下问题的始末大概明白了es8的安全证书对网络加了校验既然我通过自己mac连接不上公司mac现在所处的网络是家里那就说明自己mac的证书是有效的于是就调换一下从公司mac上跑代码读取本机写入到自己mac上结果还真成了。
但是kibana更换网络无法启动的问题还未解决这个问题不解决也就是说只要不是在家里kibana就打不开es不能做的这么傻吧于是今天到公司后请教了elastic中国社区首席布道师刘晓国老师刘老师非常热情的直接电话过来解释了kibana无法打开的原因以及解决办法在这里对刘老师的帮助表达诚挚感谢非常感谢刘老师。推荐大家看看刘老师的博客Elastic开发者上手指南-CSDN博客
接下来我们说kibana无法打开的原因还是证书问题kibana在启动时对本机的ip做了校验更换网络后ip发生变更因此kibana无法启动kibana的配置文件中有这么一行代码 我们只要这行代码更改为以下即可
elasticsearch.hosts: [https://localhost:9200]
es8的证书除了对本机的实际ip做了校验也对localhost做了验证因此只要改成localhost问题就会解决即使更换网络localhost是不会改变的。
另外再更换网络的情况下如果要通过未更换网络的机器连接更换网络的机器只有一个办法那就是在当前网络下更新证书除此别无他法。
6、所有代码
package mainimport (contextfmtosstringstimegithub.com/elastic/go-elasticsearch/v7/esapigithub.com/elastic/go-elasticsearch/v8jsoniter github.com/json-iterator/gogithub.com/liupengh3c/esbuilder
)// 最外层数据结构
type Documents struct {Shards Shards json:_shardsHits HitOutLayer json:hitsTimedOut bool json:timed_outTook int json:took
}
type Shards struct {Failed int json:failedSkipped int json:skippedSuccessful int json:successfulTotal int json:total
}
type HitOutLayer struct {Hits []Hits json:hitsMaxScore float64 json:max_scoreTotal Total json:total
}
type Hits struct {ID string json:_idIndex string json:_indexScore float64 json:_scoreSource map[string]any json:_sourceType string json:_type
}
type Total struct {Relation string json:relationValue int json:value
}func main() {SearchFromSize()
}func SearchFromSize() {st : time.Now()defer func() {fmt.Println(cost:, time.Since(st).Milliseconds(), ms)}()var json jsoniter.ConfigCompatibleWithStandardLibrarydocs : Documents{}cert, _ : os.ReadFile(/Users/liupeng/Documents/study/elasticsearch-8.17.0/config/certs/http_ca.crt)client, err : elasticsearch.NewClient(elasticsearch.Config{Username: elastic,Password: xpE4DQGWE9bCkoj7WXYE,Addresses: []string{https://127.0.0.1:9200},CACert: cert,})if err ! nil {fmt.Println(create client err:, err.Error())return}dslQuery : esbuilder.NewDsl()boolQuery : esbuilder.NewBoolQuery()boolQuery.Filter(esbuilder.NewRangeQuery(doc_id).Gte(1))dslQuery.SetQuery(boolQuery)dslQuery.SetFrom(9998)dslQuery.SetSize(3)dslQuery.SetOrder(esbuilder.NewSortQuery(doc_id, asc))dsl : dslQuery.BuildJson()search : esapi.SearchRequest{Index: []string{new_tag_202411},Body: strings.NewReader(dsl),}resp, err : search.Do(context.Background(), client)if err ! nil {fmt.Println(search err:, err.Error())return}json.NewDecoder(resp.Body).Decode(docs)strDoc, _ : json.MarshalToString(docs)fmt.Println(strDoc)
} 最后祝各位同学圣诞节快乐~~~~~~~~~~~~~