Go 操作 ElasticSearch 实战

这篇具有很好参考价值的文章主要介绍了Go 操作 ElasticSearch 实战。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在这里记录一下Golang操作elastic的使用方式,本文使用的是第三方包github.com/olivere/elastic的v7版本。

1.精确匹配单个字段 使用term查询,

package main

import (
    "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, 连接ES
    client, 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 error
        fmt.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 error
        panic(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查询条件
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.匹配单个字段 某个字段使用全文搜索

// 创建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,将查询条件组合起来。

5.1. must条件 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.3. 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语言中使用ES查询的方式,包括精确查询,全文索引,范围查询,组合查询等,希望能够对大家有用。

转自:

juejin.cn/post/6978782173306290184

关注 获取更多好文

本文由 mdnice 多平台发布文章来源地址https://www.toymoban.com/news/detail-404458.html

到了这里,关于Go 操作 ElasticSearch 实战的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Beats:使用 Filebeat 将 golang 应用程序记录到 Elasticsearch - 8.x

    毫无疑问,日志记录是任何应用程序最重要的方面之一。 当事情出错时(而且确实会出错),我们需要知道发生了什么。 为了实现这一目标,我们可以设置 Filebeat 从我们的 golang 应用程序收集日志,然后将它们发送到 Elasticsearch。 最后,使用 Kibana 我们可以可视化这些日志并

    2024年02月12日
    浏览(39)
  • 100天精通Golang(基础入门篇)——第23天:错误处理的艺术: Go语言实战指南

    🌷🍁 博主猫头虎🐅🐾 带您进入 Golang 语言的新世界✨✨🍁 🦄 博客首页 ——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文并茂🦖生动形象🐅简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍专栏》 🐾 学会IDEA常用操作,工作效率翻倍~💐 🌊 《100天精通

    2024年02月07日
    浏览(67)
  • Golang 通过开源库 go-redis 操作 NoSQL 缓存服务器

    前置条件: 1、导入库: import ( \\\"github.com/go-redis/redis/v8\\\" ) 2、搭建哨兵模式集群 具体可以百度、谷歌搜索,网上现成配置教程太多了,不行还可以搜教程视频,跟着视频博主一步一个慢动作,慢慢整。 本文只介绍通过 “主从架构 / 哨兵模式” 访问的形式,这是因为,单个

    2024年01月23日
    浏览(51)
  • Go操作elasticsearch合集

    参考链接这个博主的很不错 must 条件 must_not should 条件 任意聚合类型都支持嵌套,桶聚合可以嵌套桶聚合,也可以嵌套指标聚合。 例子:

    2024年02月11日
    浏览(41)
  • 【Golang项目实战】用Go写一个学生信息管理系统,真的太酷啦| 保姆级详解,附源码——建议收藏

    博主简介: 努力学习的大一在校计算机专业学生,热爱学习和创作。目前在学习和分享:数据结构、Go,Java等相关知识。 博主主页: @是瑶瑶子啦 所属专栏: Go语言核心编程 近期目标: 写好专栏的每一篇文章 学习了Go的基础语法知识,如何巩固和提升呢?跟着瑶瑶子写一个

    2024年02月02日
    浏览(56)
  • go-elasticsearch 官方包操作合集

    2024年02月11日
    浏览(33)
  • go操作elasticsearch 如何打印query log

    我们在写代码调试的时候,有时候需要打印es的query log 看下请求json到底长什么样。在new的时候我们需要传一个 实现了 elasticsearch 这个包  Logger 接口的结构体进来。 package DbBase import (    \\\"fmt\\\"    \\\"log\\\"    \\\"net\\\"    \\\"net/http\\\"    \\\"time\\\"    \\\"github.com/spf13/viper\\\"    \\\"gopkg.in/olive

    2024年02月10日
    浏览(40)
  • Go字符串实战操作大全!

    在本篇文章中,我们深入探讨了Go语言中字符串的魅力和深度。从基础定义、操作、字符编码到复杂的类型转换,每个环节都带有实例和代码示例来深化理解。通过这些深入的解析,读者不仅能够掌握字符串在Go中的核心概念,还能洞察Go设计哲学背后的思考。 关注公众号【

    2024年02月08日
    浏览(40)
  • [golang gin框架] 38.Gin操作Elasticsearch创建索引、修改映射、数据CURD以及数据分页

    常见的 Golang 操作 ElasticSearch 的插件主要有下面两个: 第三方插件: github.com/olivere/elastic 官网插件 github.com/elastic/go-elasticsearch 其中 elastic 比 go-elasticsearch 文档更全面一些,start 量也更多一些,本节讲解 elastic 使用第三方库 https://github.com/olivere/elastic 来连接 ES 并进行操作 注意

    2024年02月09日
    浏览(63)
  • ElasticSearch8.x操作记录

    文档内容来自于尚硅谷海波老师的ElasticSearch教程课,在Kibana中的一些操作演示 以下为在文档中的相关操作记录 1.索引操作 2.文档操作 3.文档搜索 4.聚合搜索 5.索引模板 6.中文分词 7.文档评分机制 : 1, “description”: “freq, occurrences of term within document”, “details”: [] }, { “val

    2024年02月03日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包