Go中Elasticsearch的大量更新

时间:2018-07-16 18:08:56

标签: elasticsearch go

我尝试用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 {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(冲突)

2 个答案:

答案 0 :(得分: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)
    }

答案 1 :(得分:0)

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

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

您只需要在请求正文中的URL上设置“ conflicts = proceded”或“ conflicts”:“ proceed”。