背景介绍
Elasticsearch是一个分布式、高扩展、高实时的搜索与数据分析引擎,用于海量文档的搜索。有些项目会将Elasticsearch当做存储海量数据的数据库使用,可见其查询性能之高效。作为面向文档的搜索引擎,Elasticsearch比起传统数据库更偏向于结构化数据的高效查询,其独特的倒排索引更能将查询性能提升至极致。在大数据微服务时代,Elasticsearch在海量数据搜索、数据挖掘、人工智能领域都起到了关键作用。
安 装
go get "github.com/olivere/elastic/v7"
Elasticsearch的数据来源通常来自于Logstash等数据采集中间件,作为golang项目来说,其查询功能的使用更加普遍。此文章以V7版本为例来介绍如何使用golang对Elasticsearch进行查询。
开源库的使用
连接客户端构建
import elasticv7 "github.com/olivere/elastic/v7"address := []string{"http://127.0.0.1:9200"}
cli, err := elasticv7.NewClient(elasticv7.SetURL(address...),elasticv7.SetBasicAuth("elastic", "123456"),elasticv7.SetSniff(false),
)
address 为集群的地址
SetBaseicAuth 接受UserName和Password作为参数完成校验
Sniff参数为true,创建的客户端会去嗅探整个集群,此动作会使用内网IP通信,导致无法连接到ES服务器,这里设置为false。
创建查询语句
精确查询
// 单值查询
elasticv7.NewTermQuery("key","value")// 多值查询
elasticv7.NewTermsQuery("key", []string{"value1","value2"}...)
精确查询要注意字符串类型的匹配,若为text字段,将匹配失败。可以尝试对"{字段}.keyword"来进行Term查询
通配符查询
elasticv7.NewWildcardQuery(key, word)
通配符查询通常用于模糊查询,例如"*xxxx*",等价于mysql中的like "%xxxx%"。
与查询
query := elasticv7.NewBoolQuery()
query.Must(queries ...)
与查询使用BoolQuery的Must函数来完成,其参数是类型为query的不定参数。当所有query均为真时此条件为真,可嵌套。
或查询
elasticv7.NewWildcardQuery("", "")
query.Should(queries ...)
与Must相似。
创建查询服务
search := cli.Search().Index(index_name).Query(query)
index_name是ES中的索引,类比Mysql相当于表Table的概念。query为查询对象,以上各种查询可相互嵌套形成最终的查询对象。
分页
search = search.From(10)
search = search.Size(10)
这里search中的函数都是链式的,可分行写亦可整行写。
排序
search = search.Sort(key,true)
排序的第一参数为排序字段,第二参数为是否正序。
跳过评分计算
constantQuery := elasticv7.NewConstantScoreQuery(query)
评分会降低查询的效率,当不需要时可以跳过。
总 结
官方库需要自己去构造查询的json结构,使用起来较为混乱,不易理解。相较而言,此开源库采用链式可嵌套的形式来构造查询对象,使用起来更加清晰便捷。其源码库中亦有相当多的各类函数和对象用于各种条件查询,此次只是摘取本人使用时设计过的些许功能加以介绍。
参考资料
1、https://segmentfault.com/a/1190000039140870
2、https://pkg.go.dev/github.com/elastic/go-elasticsearch/v6@v6.8.5/esapi
《酷Go推荐》招募:
各位Gopher同学,最近我们社区打算推出一个类似GoCN每日新闻的新栏目《酷Go推荐》,主要是每周推荐一个库或者好的项目,然后写一点这个库使用方法或者优点之类的,这样可以真正的帮助到大家能够学习到
新的库,并且知道怎么用。
大概规则和每日新闻类似,如果报名人多的话每个人一个月轮到一次,欢迎大家报名!戳「阅读原文」,即可报名
扫码也可以加入 GoCN 的大家族哟~