golang elasticsearch 查询
elasticsearch的查询语法比较丰富,下面分别介绍golang 的各种查询用法。
如果对ES的查询语法和概念不了解,请阅读:ES教程
1.精确匹配单个字段
elasticsearch的term查询,下面给出完整的代码
package mainimport ("context""fmt""github.com/olivere/elastic/v7""log""os""reflect""time"
)type Article struct {Title string // 文章标题Content string // 文章内容Author string // 作者Created time.Time // 发布时间
}func main() {// 创建Client, 连接ESclient, err := elastic.NewClient(// elasticsearch 服务地址,多个服务地址使用逗号分隔elastic.SetURL("http://127.0.0.1:9200", "http://127.0.0.1:9201"),// 基于http base auth验证机制的账号和密码elastic.SetBasicAuth("user", "secret"),// 启用gzip压缩elastic.SetGzip(true),// 设置监控检查时间间隔elastic.SetHealthcheckInterval(10*time.Second),// 设置请求失败最大重试次数elastic.SetMaxRetries(5),// 设置错误日志输出elastic.SetErrorLog(log.New(os.Stderr, "ELASTIC ", log.LstdFlags)),// 设置info日志输出elastic.SetInfoLog(log.New(os.Stdout, "", log.LstdFlags)))if err != nil {// Handle errorfmt.Printf("连接失败: %v\n", err)} else {fmt.Println("连接成功")}// 执行ES请求需要提供一个上下文对象ctx := context.Background()// 创建term查询条件,用于精确查询termQuery := elastic.NewTermQuery("Author", "tizi")searchResult, err := client.Search().Index("blogs"). // 设置索引名Query(termQuery). // 设置查询条件Sort("Created", true). // 设置排序字段,根据Created字段升序排序,第二个参数false表示逆序From(0). // 设置分页参数 - 起始偏移量,从第0行记录开始Size(10). // 设置分页参数 - 每页大小Pretty(true). // 查询结果返回可读性较好的JSON格式Do(ctx) // 执行请求if err != nil {// Handle errorpanic(err)}fmt.Printf("查询消耗时间 %d ms, 结果总数: %d\n", searchResult.TookInMillis, searchResult.TotalHits())if searchResult.TotalHits() > 0 {// 查询结果不为空,则遍历结果var b1 Article// 通过Each方法,将es结果的json结构转换成struct对象for _, item := range searchResult.Each(reflect.TypeOf(b1)) {// 转换成Article对象if t, ok := item.(Article); ok {fmt.Println(t.Title)}}}
}
2.通过terms实现SQL的in查询
通过terms查询语法实现,多值查询效果
例子:
// 创建terms查询条件
termsQuery := elastic.NewTermsQuery("Author", "tizi", "tizi365")searchResult, err := client.Search().Index("blogs"). // 设置索引名Query(termsQuery). // 设置查询条件Sort("Created", true). // 设置排序字段,根据Created字段升序排序,第二个参数false表示逆序From(0). // 设置分页参数 - 起始偏移量,从第0行记录开始Size(10). // 设置分页参数 - 每页大小Do(ctx) // 执行请求
3.匹配单个字段
某个字段使用全文搜索,也就是ES的match语法
例子:
// 创建match查询条件
matchQuery := elastic.NewMatchQuery("Title", "golang es教程")searchResult, err := client.Search().Index("blogs"). // 设置索引名Query(matchQuery). // 设置查询条件Sort("Created", true). // 设置排序字段,根据Created字段升序排序,第二个参数false表示逆序From(0). // 设置分页参数 - 起始偏移量,从第0行记录开始Size(10). // 设置分页参数 - 每页大小Do(ctx)
4.范围查询
实现类似Created > '2020-07-20' and Created < '2020-07-22'的范围查询条件
创建查询表达式例子:
// 例1 等价表达式: Created > "2020-07-20" and Created < "2020-07-29"
rangeQuery := elastic.NewRangeQuery("Created").Gt("2020-07-20").Lt("2020-07-29")// 例2 等价表达式: id >= 1 and id < 10
rangeQuery := elastic.NewRangeQuery("id").Gte(1).Lte(10)
5.bool组合查询
bool组合查询,实际上就是组合了前面的查询条件,然后通过类似SQL语句的and和or将查询条件组合起来,不熟悉ES查询语法,请参考ES教程
5.1. must条件
类似SQL的and,代表必须匹配的条件
// 创建bool查询
boolQuery := elastic.NewBoolQuery().Must()// 创建term查询
termQuery := elastic.NewTermQuery("Author", "tizi")
matchQuery := elastic.NewMatchQuery("Title", "golang es教程")// 设置bool查询的must条件, 组合了两个子查询
// 表示搜索匹配Author=tizi且Title匹配"golang es教程"的文档
boolQuery.Must(termQuery, matchQuery)searchResult, err := client.Search().Index("blogs"). // 设置索引名Query(boolQuery). // 设置查询条件Sort("Created", true). // 设置排序字段,根据Created字段升序排序,第二个参数false表示逆序From(0). // 设置分页参数 - 起始偏移量,从第0行记录开始Size(10). // 设置分页参数 - 每页大小Do(ctx) // 执行请求
5.2. must_not条件
跟must的作用相反,用法和must类似
// 创建bool查询
boolQuery := elastic.NewBoolQuery().Must()// 创建term查询
termQuery := elastic.NewTermQuery("Author", "tizi")// 设置bool查询的must not条件
boolQuery.MustNot(termQuery)
5.2. should条件
类似SQL中的 or, 只要匹配其中一个条件即可
// 创建bool查询
boolQuery := elastic.NewBoolQuery().Must()// 创建term查询
termQuery := elastic.NewTermQuery("Author", "tizi")
matchQuery := elastic.NewMatchQuery("Title", "golang es教程")// 设置bool查询的should条件, 组合了两个子查询
// 表示搜索Author=tizi或者Title匹配"golang es教程"的文档
boolQuery.Should(termQuery, matchQuery)
提示:go的elastic库,组合bool语句的用法,跟ES bool语法类似,可以互相嵌套查询语句。
golang elasticsearch 查询相关推荐
- Go Elasticsearch 查询快速入门
文章目录 0.前言 1.根据 ID 查询 2.精确匹配单个字段 3.精确匹配单个字段的多个值 4.全文查询 5.范围查询 6.判断某个字段是否存在 7.bool 组合查询 must filter sh ...
- elasticsearch 查询(match和term)
elasticsearch 查询(match和term) es中的查询请求有两种方式,一种是简易版的查询,另外一种是使用JSON完整的请求体,叫做结构化查询(DSL). 由于DSL查询更为直观也更为简 ...
- es查询语句拼接 java_JAVA使用ElasticSearch查询in和not in的实现方式
JAVA使用ElasticSearch查询in和not in的实现方式 发布时间:2020-08-22 16:03:11 来源:脚本之家 阅读:119 作者:执笔记忆的空白 ElasticSearch ...
- ElasticSearch查询 第四篇:匹配查询(Match)
<ElasticSearch查询>目录导航: ElasticSearch查询 第一篇:搜索API ElasticSearch查询 第二篇:文档更新 ElasticSearch查询 第三篇: ...
- Elasticsearch查询性能优化
constant_score的用处 当我们不关心检索词频率TF(Term Frequency)对搜索结果排序的影响时,可以使用constant_score将查询语句query或者过滤语句filter包 ...
- 【Elasticsearch】Elasticsearch 查询过程中的 pre-filter 原理
1.概述 转载:添Elasticsearch 查询过程中的 pre-filter 原理 大家都知道在对索引执行查询的时候,需要在所有的分片上执行查询,因为无法知道被查询的关键词位于哪个分片,对于全文查 ...
- 【Elasticsearch】Elasticsearch查询参数batched_reduce_size的解释
1.概述 当我们使用Elasticsearch查询数据时,如果数据量非常大时,会命中大量分片中的大量数据,可能会造成集群内存异常,此时可以通过一个高级参数batched_reduce_size进行控制 ...
- 为什么Elasticsearch查询变得这么慢了?
Elasticsearch 最少必要知识实战教程直播回放 0.引言 Elasticsearch社区中经常看到慢查询问题:"你能帮我看看Elasticsearch的响应时间吗?"或者 ...
- 助你掌握搜索神器,10个实用的Elasticsearch查询技巧
前言 Elasticsearch是一个非常流行的搜索引擎,已经成为了许多企业的首选解决方案.然而,我们要想成为一个优秀的程序员,就必须掌握各种查询技巧.本文将向大家介绍10个实用的Elastics ...
最新文章
- 2021-08-27 分割之后mask在原图中提取出来(语义分割—实例分割)
- mysql特别点_Mysql 特别注意点!
- (DFS)n皇后问题
- html瀑布流视频列表,StaggeredGridLayoutManager实现瀑布流视频列表和头部广告位以及分栏Header条...
- 局域网访问虚拟机VMware6.5
- Java读取文件中的arraylist_java – 从文件中读取ArrayList作为对象?
- poi.openxml4j.exceptions.InvalidFormatException: Package should contain a content type part [M1.13]
- 【LeetCode】【数组】题号:73,矩阵置零
- 基于Java的酒店管理系统论文
- android 有序map,给HashMap排序,使之成为有序Map
- 关注C-RAN 的五大理由
- 微信小程序毕业论文题目_SSM项目考勤签到管理系统+后台管理系统
- 宋宝华: 纪念金庸先生——程序员的武侠世界
- 大数据时代的变革与顺势而为——读《大数据时代》
- matlab jacks信道,【学习笔记】移动无线信道理论
- 中国传媒大学计算机课程表,中国传媒大学新闻学院课程表.doc
- js-es6知识汇总(1) 原型与原型链
- 微软笔记本服务器怎么重装系统,笔记本重装系统,详细教您笔记本怎么重装win10系统...
- 工具_SETUNA2、3下载,截图小工具,SETUNA github下载
- 用Java 实现MSN聊天功能