showliuzp 2025-10-13 18:37 采纳率: 84.3%
浏览 4
已结题

golang添加数据到es里



//操作es的代码
func (g *GuildIncome) Test()(resp iapi.GuildIncomeListResp,err error){

   //建立es连接
    var err error
    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),
    )
    if err != nil {
        panic(fmt.Sprintf("es获取全局配置错误,err:%+v",err))
    } else {
        load_step+=1
        fmt.Printf("\n[%s]es连接成功\n",now.Format(DATE_NORMAL_FORMAT))
    }

   data := `{
        "operator": "admin",
        "module": "明细查询",
    }`

    // 创建一个IndexRequest对象,指定索引名和文档ID(如果需要)
    req := esapi.IndexRequest{
        Index:      "lu_admin_operator", // 目标索引名
        Body:       strings.NewReader(data), // 文档内容
        Refresh:    "true", // 设置为true以确保立即刷新索引,以便可以立即搜索到新文档
    }

    es_client := types.EsClient
    res, err := req.Do(ctx, es_client)
    if err != nil {
        fmt.Printf("Error getting response: %s", err)
    }

    defer res.Body.Close()

    fmt.Printf("res返回值:%+v", res)

    return
}


 我建立一个es的连接,并给es添加一条数据,但报错:
cannot use es_client (variable of type *elastic.Client) as esapi.Transport value in argument to req.Do: *elastic.Client does not implement esapi.Transport (missing method Perform)
make: *** [build] 错误 1

另外:如果数据库不存在,比如lu_admin_operator,es会自动创建么
  • 写回答

4条回答 默认 最新

  • 檀越@新空间 2025-10-13 18:38
    关注

    晚上好🌙🌙🌙
    本答案参考通义千问

    你遇到的错误是由于 esapi.IndexRequest.Do() 方法期望的是一个 esapi.Transport 类型的参数,而你传入的是 *elastic.Client。虽然 *elastic.Client 是 Elasticsearch 客户端库中的一部分,但它 不直接实现 esapi.Transport 接口,所以导致类型不匹配。


    ✅ 问题分析

    1. 错误原因

    req := esapi.IndexRequest{
        Index: "lu_admin_operator",
        Body:  strings.NewReader(data),
        Refresh: "true",
    }
    
    res, err := req.Do(ctx, es_client)
    

    你使用了 esapi.IndexRequest,这是 Elasticsearch 的官方 Go 客户端(elasticsearch-go) 中的结构体,但你用的是 github.com/olivere/elastic 这个第三方客户端库。

    这两个客户端库是 不同的,不能混用!


    ✅ 解决方案

    ✅ 正确做法:统一使用 github.com/olivere/elastic 客户端

    如果你使用的是 olivere/elastic,那么应使用其提供的方法来添加文档,而不是 esapi.IndexRequest

    ✅ 修改后的代码如下:

    func (g *GuildIncome) Test() (resp iapi.GuildIncomeListResp, err error) {
        // 建立ES连接
        var err error
        EsClient, err = elastic.NewClient(
            elastic.SetURL(config.Addr[0]),
            elastic.SetBasicAuth(config.Username, config.Password),
            elastic.SetGzip(true),
            elastic.SetHealthcheckInterval(10*time.Second),
            elastic.SetMaxRetries(5),
            elastic.SetSniff(false),
        )
        if err != nil {
            panic(fmt.Sprintf("es获取全局配置错误,err:%+v", err))
        } else {
            load_step += 1
            fmt.Printf("\n[%s]es连接成功\n", now.Format(DATE_NORMAL_FORMAT))
        }
    
        data := map[string]interface{}{
            "operator": "admin",
            "module":   "明细查询",
        }
    
        // 使用 elastic 库的方法添加数据
        _, err = EsClient.Index().
            Index("lu_admin_operator").
            BodyJson(data).
            Do(context.Background())
    
        if err != nil {
            fmt.Printf("Error adding document: %s", err)
            return resp, err
        }
    
        fmt.Println("Document added successfully")
        return
    }
    

    ✅ 补充说明

    ✅ 1. 如果索引不存在,Elasticsearch 会自动创建吗?

    是的,当使用 elastic 客户端进行写入操作时,如果目标索引不存在,Elasticsearch 会自动创建该索引,前提是你的用户有权限这么做。

    注意:这可能不是最佳实践,建议在生产环境中预先创建好索引并设置合适的 mapping 和分片策略。


    ✅ 2. 如何判断是否使用正确的客户端?

    • github.com/olivere/elastic:适用于较旧版本的 Elasticsearch。
    • github.com/elastic/go-elasticsearch/v8:适用于 Elasticsearch 7.x 及以上版本,是官方推荐的客户端。

    ✅ 总结

    | 问题 | 解决方案 | |------|----------| | 错误:*elastic.Client does not implement esapi.Transport | 不要混用 elasticesapi 客户端,统一使用 elasticgo-elasticsearch | | 索引不存在时是否自动创建 | 是的,Elasticsearch 会自动创建索引 | | 推荐使用哪个客户端 | github.com/olivere/elastic(简单易用)或 github.com/elastic/go-elasticsearch/v8(官方推荐) |


    如需进一步帮助,请提供你使用的 Elasticsearch 版本和客户端版本。

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

报告相同问题?

问题事件

  • 系统已结题 10月21日
  • 已采纳回答 10月13日
  • 创建了问题 10月13日