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 查询相关推荐

  1. Go Elasticsearch 查询快速入门

    文章目录 0.前言 1.根据 ID 查询 2.精确匹配单个字段 3.精确匹配单个字段的多个值 4.全文查询 5.范围查询 6.判断某个字段是否存在 7.bool 组合查询 must filter sh ...

  2. elasticsearch 查询(match和term)

    elasticsearch 查询(match和term) es中的查询请求有两种方式,一种是简易版的查询,另外一种是使用JSON完整的请求体,叫做结构化查询(DSL). 由于DSL查询更为直观也更为简 ...

  3. es查询语句拼接 java_JAVA使用ElasticSearch查询in和not in的实现方式

    JAVA使用ElasticSearch查询in和not in的实现方式 发布时间:2020-08-22 16:03:11 来源:脚本之家 阅读:119 作者:执笔记忆的空白 ElasticSearch ...

  4. ElasticSearch查询 第四篇:匹配查询(Match)

    <ElasticSearch查询>目录导航: ElasticSearch查询 第一篇:搜索API ElasticSearch查询 第二篇:文档更新 ElasticSearch查询 第三篇: ...

  5. Elasticsearch查询性能优化

    constant_score的用处 当我们不关心检索词频率TF(Term Frequency)对搜索结果排序的影响时,可以使用constant_score将查询语句query或者过滤语句filter包 ...

  6. 【Elasticsearch】Elasticsearch 查询过程中的 pre-filter 原理

    1.概述 转载:添Elasticsearch 查询过程中的 pre-filter 原理 大家都知道在对索引执行查询的时候,需要在所有的分片上执行查询,因为无法知道被查询的关键词位于哪个分片,对于全文查 ...

  7. 【Elasticsearch】Elasticsearch查询参数batched_reduce_size的解释

    1.概述 当我们使用Elasticsearch查询数据时,如果数据量非常大时,会命中大量分片中的大量数据,可能会造成集群内存异常,此时可以通过一个高级参数batched_reduce_size进行控制 ...

  8. 为什么Elasticsearch查询变得这么慢了?

    Elasticsearch 最少必要知识实战教程直播回放 0.引言 Elasticsearch社区中经常看到慢查询问题:"你能帮我看看Elasticsearch的响应时间吗?"或者 ...

  9. 助你掌握搜索神器,10个实用的Elasticsearch查询技巧

    前言   Elasticsearch是一个非常流行的搜索引擎,已经成为了许多企业的首选解决方案.然而,我们要想成为一个优秀的程序员,就必须掌握各种查询技巧.本文将向大家介绍10个实用的Elastics ...

最新文章

  1. 2021-08-27 分割之后mask在原图中提取出来(语义分割—实例分割)
  2. mysql特别点_Mysql 特别注意点!
  3. (DFS)n皇后问题
  4. html瀑布流视频列表,StaggeredGridLayoutManager实现瀑布流视频列表和头部广告位以及分栏Header条...
  5. 局域网访问虚拟机VMware6.5
  6. Java读取文件中的arraylist_java – 从文件中读取ArrayList作为对象?
  7. poi.openxml4j.exceptions.InvalidFormatException: Package should contain a content type part [M1.13]
  8. 【LeetCode】【数组】题号:73,矩阵置零
  9. 基于Java的酒店管理系统论文
  10. android 有序map,给HashMap排序,使之成为有序Map
  11. 关注C-RAN 的五大理由
  12. 微信小程序毕业论文题目_SSM项目考勤签到管理系统+后台管理系统
  13. 宋宝华: 纪念金庸先生——程序员的武侠世界
  14. 大数据时代的变革与顺势而为——读《大数据时代》
  15. matlab jacks信道,【学习笔记】移动无线信道理论
  16. 中国传媒大学计算机课程表,中国传媒大学新闻学院课程表.doc
  17. js-es6知识汇总(1) 原型与原型链
  18. 微软笔记本服务器怎么重装系统,笔记本重装系统,详细教您笔记本怎么重装win10系统...
  19. 工具_SETUNA2、3下载,截图小工具,SETUNA github下载
  20. 用Java 实现MSN聊天功能

热门文章

  1. CGB2103-day06
  2. ipv6_dhcp服务器搭建步骤
  3. 解决移动硬盘符不见的问题
  4. execlp和system的区别
  5. 做代理记账工作风险有哪些
  6. ui设计就业前景怎么样?薪资如何?
  7. Android短信大全
  8. DVWA安装和环境搭建
  9. 遥望布达拉——DAY10 巴塘-海通兵站
  10. 案例研究:海通证券金融云统一云管理平台建设历程