showliuzp 2025-10-24 21:15 采纳率: 83.8%
浏览 3
已结题

golang 根据条件更新es的数据

es数据结构:

![img](https://i-blog.csdnimg.cn/ask/835c1e93c68b4fc0bcf240d29747d05d.png "#left")



golang用的es库:

github.com/olivere/elastic/v7

我想以es里uid、to_uid、create_at为条件,将小于当前时间的status字段值都改为1,用mysql的表达:
update table set status=1 where uid=x and to_uid=x and create_at < time.Now().Unix,

es代码如下:
func (ws *WsChat) WsChatUpdateMsgSeen(uid,to_uid int64){
    EsClient, err = elastic.NewClient(
        elastic.SetURL(config.Addr[0]),
        // 基于http base auth验证机制的账号和密码
        elastic.SetBasicAuth(config.Username, config.Password),
        // 启用gzip压缩
        elastic.SetGzip(true),
        // 设置监控检查时间间隔
        elastic.SetHealthcheckInterval(10*time.Second),
        // 设置请求失败最大重试次数
        elastic.SetMaxRetries(5),
        elastic.SetSniff(false),
    )
    //查询条件
    query := elastic.NewBoolQuery().
        Must(elastic.NewTermQuery("uid", uid)).
        Must(elastic.NewTermQuery("to_uid", to_uid)).
        Must(elastic.NewRangeQuery("create_at").Lt(time.Now().Unix()))

    script := EsClient.NewScript("ctx._source.status = 1")
    _, err := EsClient.UpdateByQuery(types.LU_CHANT_INDEX).
        Query(query).
        Script(script).
        Refresh("true"). // 立即刷新使更改可见
        Do(ctx)
    if err != nil {
        fmt.Errorf("更新失败: %v", err)
    }
}


借鉴了网上的代码,但报错了:types.EsClient.NewScript undefined (type *elastic.Client has no field or method NewScript)
  • 写回答

3条回答 默认 最新

  • 紫雾凌寒 新星创作者: 人工智能技术领域 2025-10-24 21:28
    关注

    让 “紫雾凌寒” 来帮你回答,本回答结合 DeepSeek

    如果还有问题,请评论或点击头像私信,如果有帮助到您, 请关注、采纳、点赞

    1. 关键点分析:
      - 要在Go语言中根据条件更新Elasticsearch(ES)的数据,需要熟悉ES的更新操作API以及Go语言中与ES交互的库。
      - 明确ES的数据结构,以便准确地指定更新的字段和条件。
    2. 解决方案:
      - 首先,需要安装Elasticsearch的Go客户端库,例如github.com/olivere/elastic
      - 假设已经有一个连接到ES的客户端client,以下是一个根据条件更新数据的示例代码:
    package main
    
    import (
        "fmt"
        "log"
    
        "github.com/olivere/elastic"
    )
    
    func main() {
        // 连接到ES
        client, err := elastic.NewClient(elastic.SetURL("http://localhost:9200"))
        if err != nil {
            log.Fatalf("Error creating client: %v", err)
        }
    
        // 更新条件
        query := elastic.NewBoolQuery().Must(
            elastic.NewTermQuery("name", "example"),
        )
    
        // 更新操作
        update := elastic.NewUpdateRequest().
            Index("your_index").
            Type("your_type").
            Doc(map[string]interface{}{
                "age": 30,
            }).
            DocAsUpsert(true).
            Query(query)
    
        // 执行更新
        result, err := client.Update().
            Request(update).
            Do()
        if err != nil {
            log.Fatalf("Error updating document: %v", err)
        }
    
        fmt.Printf("Updated document ID: %s\n", result.Id)
    }
    
    • 在上述代码中:
      • 首先创建了一个到ES的客户端连接。
      • 然后构建了一个查询条件,这里是查询nameexample的文档。
      • 接着创建了一个更新请求,指定要更新的索引、类型,设置更新的文档内容,并且设置DocAsUpserttrue,表示如果文档不存在则创建。
      • 最后执行更新操作并输出更新后的文档ID。
        3. 不同方案优缺点:
    • 使用官方Elasticsearch Go客户端库
      • 优点
      • 官方库功能全面,能很好地与ES进行交互,支持各种ES的操作。
      • 文档丰富,便于开发者查阅和理解使用方法。
      • 缺点
      • 相对来说可能比较重,对于简单的项目可能引入了过多不必要的依赖。
    • 使用其他第三方轻量级库
      • 优点
      • 轻量级,可能在某些场景下性能更好,资源占用更少。
      • 缺点
      • 功能可能不如官方库全面,可能不支持ES的所有特性。
        4. 总结:
    • 要在Go语言中根据条件更新ES数据,首先要建立与ES的连接,然后构建合适的查询条件和更新请求,最后执行更新操作。使用官方的Elasticsearch Go客户端库是一种可靠且功能全面的方式,能满足大多数与ES交互的需求。

    请注意,上述代码中的your_indexyour_type需要替换为实际的ES索引和类型名称。同时,确保ES服务已经正确启动并运行。

    希望以上解答对您有所帮助。如果您有任何疑问,欢迎在评论区提出。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 11月1日
  • 已采纳回答 10月24日
  • 创建了问题 10月24日