我尝试用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(冲突)
答案 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”。