• 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)
                }
            }
        }
    }
    • 1

    后续示例只列举出核心代码,其余代码结构参考本节实现。

    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)             // 执行请求
    • 1

    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) 
    • 1

    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)
    • 1

    5.bool组合查询 bool的功能类似于Sql中的and和or,将查询条件组合起来。

    5.1. must条件 must类似sql中的and功能,

    // 创建bool查询

    boolQuery := elastic.NewBoolQuery().Must()
    • 1
    // 创建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)             // 执行请求
    • 1

    5.2. must_not条件 跟must的作用相反,用法和must类似

    // 创建bool查询
    boolQuery := elastic.NewBoolQuery().Must()

    // 创建term查询
    termQuery := elastic.NewTermQuery("Author""tizi")

    // 设置bool查询的must not条件
    boolQuery.MustNot(termQuery)
    • 1

    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)
    • 1

    以上,使用简明扼要的方式来说明在Go语言中使用ES查询的方式,包括精确查询,全文索引,范围查询,组合查询等,希望能够对大家有用。

    转自:

    juejin.cn/post/6978782173306290184

    关注 获取更多好文

    alt

    本文由 mdnice 多平台发布

  • 相关阅读:
    【dgl学习】dgl处理图中的节点/边的属性/特征/类型
    上传的文件资源不能被百度收录
    收到公安部门的致谢信,顶象业务安全“反诈”再接再厉
    ASP.NET Core 6框架揭秘实例演示[05]:依赖注入基本编程模式
    万界星空科技智能管理系统低代码平台
    Selenium自动化测试框架工作原理你明白了吗?
    gin框架
    Prepared SQL 性能测试
    号称新物种,一年半烧了14多亿,卢放和岚图汽车终究是扶不起来?
    ubuntu20.04下Kafka安装部署及基础使用
  • 原文地址:https://blog.csdn.net/qq_39787367/article/details/125996248