【问题标题】:Massive updates in elasticsearch with go使用 go 在 elasticsearch 中进行大规模更新
【发布时间】:2019-03-05 12:05:14
【问题描述】:

我尝试用 golang 更新我的 elasticsearch 数据库。我有两个功能:

func UpdateAllByUserID(client *elastic.Client, id string, requestName string, requestNick string) error {
    ctx := context.Background()

    query := elastic.NewMatchQuery("user_id", id)

    out_name, err := client.UpdateByQuery().Index("test").Type("test").Query(query).Script(elastic.NewScriptInline("ctx._source.user_name = '" + requestName + "'")).Do(ctx)
    if nil != err {
        log.Println(err)
    }

    fmt.Println("update all name: ", out_name.Updated)

    return nil

}


func UpdateAllNicksByUserIdInFeed(client *elastic.Client, id string, requestNick string) error {
    ctx := context.Background()

    query := elastic.NewMatchQuery("user_id", id)


    out_nick, err := client.UpdateByQuery().Index("test").Type("test").Query(query).Script(elastic.NewScriptInline("ctx._source.user_nick = '" + requestNick + "'")).Do(ctx)
    if nil != err {
        log.Println(err)
    }

    fmt.Println("update all nick: ", out_nick.Updated)

    return nil

}

弹性中的 POST:

POST {index}/{type}/_update_by_query
{
  "script": {
    "inline": "ctx._source.user_name = 'test'",
    "inline": "ctx._source.user_nick = 'test test'"
  },
  "query": {
    "match": {
      "user_id": "mtJZngDOy6Qj22Qv9MEf1MhSLVb2"
    }
  }
}

我正在使用库 github.com/olivere/elastic。 elasticsearch的版本是5.6 这个功能每个单独它运作良好,但我有两个问题:

如何在同一个函数中更新? 为什么同时使用这两个函数我有这个错误:

弹性:错误 409(冲突)

【问题讨论】:

    标签: elasticsearch go


    【解决方案1】:

    我解决了这个问题:

    out_name, err := client.UpdateByQuery().Index("test").Type("test").Query(query).Script(elastic.NewScriptInline("ctx._source.user_name = '" + requestName + "';ctx._source.user_nick = '" + requestNick + "';ctx._source.user_photo = '" + fullImageURL + "';ctx._source.user_thumb = '" + thumbnailURL + "'")).Do(ctx)
        if nil != err {
            log.Println(err)
        }
    

    【讨论】:

      【解决方案2】:

      https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update-by-query.html

      如果您想简单地计算版本冲突,而不是导致 _update_by_query 中止,您可以在 url 上设置冲突=proceed 或在请求正文中设置 "conflicts": "proceed"。第一个示例这样做是因为它只是尝试获取在线映射更改,而版本冲突仅意味着冲突文档在 _update_by_query 开始和尝试更新文档的时间之间进行了更新。这很好,因为该更新将获取在线地图更新。

      您只需要在 url 上设置冲突=proceed 或在请求正文中设置 "conflicts": "proceed"。

      【讨论】:

        猜你喜欢
        • 2013-01-02
        • 1970-01-01
        • 2021-12-24
        • 1970-01-01
        • 1970-01-01
        • 2019-05-04
        • 2021-10-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多