英文:
Go update document using elastic search
问题
我正在使用go-elasticsearch作为Elasticsearch客户端。
我尝试使用这里的代码来更新文档:elastic/go-elasticsearch/api.update.go
然而,使用GitHub上相同的代码时,我遇到了以下错误:
[UpdateRequest] unknown field [Title]
到目前为止,我只有一个文档,它的结构如下所示:
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 4,
"successful": 4,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1.0,
"hits": [
{
"_index": "posts",
"_type": "_doc",
"_id": "fc87941f-dc82-4fdb-9e04-460830e5f3ab",
"_score": 1.0,
"_source": {
"Title": "one two three2",
"Done": false,
"Created": "2022-02-09T11:51:59.027356+01:00",
"Updated": null
}
}
]
}
}
我的Go函数如下:
func (postRepository) Update(id uuid.UUID, input inputs.Post) error {
channel := make(chan error)
go func() {
post := entities.Post{
Title: "title updated",
}
body, err := json.Marshal(post)
if err != nil {
channel <- err
}
request := esapi.UpdateRequest{
Index: index,
DocumentID: id.String(),
Body: strings.NewReader(string(body)),
}
response, err := request.Do(context.Background(), data.ElasticSearchClient)
if err != nil {
channel <- err
}
defer response.Body.Close()
if response.IsError() {
var b map[string]interface{}
e := json.NewDecoder(response.Body).Decode(&b)
if e != nil {
fmt.Println(fmt.Errorf("error parsing the response body: %s", err))
}
fmt.Println(fmt.Errorf("reason: %s", b["error"].(map[string]interface{})["reason"].(string)))
channel <- fmt.Errorf("[%s] Error indexing document", response.Status())
}
channel <- nil
}()
return <-channel
}
我的实体如下:
type Post struct {
Title string
Done bool
Created time.Time
Updated *time.Time
}
此外,这是唯一一个不起作用的函数,其他函数如AddDocument
、RemoveDocument
、GetDocuments
都按预期工作。
英文:
I'm using go-elasticsearch as a elastic search client.
I tried to update document using code from here elastic/go-elasticsearch/api.update.go
However using the same code from GitHub I got:
[UpdateRequest] unknown field [Title]
So far I have only one document which looks like this
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 4,
"successful": 4,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1.0,
"hits": [
{
"_index": "posts",
"_type": "_doc",
"_id": "fc87941f-dc82-4fdb-9e04-460830e5f3ab",
"_score": 1.0,
"_source": {
"Title": "one two three2",
"Done": false,
"Created": "2022-02-09T11:51:59.027356+01:00",
"Updated": null
}
}
]
}
}
My go function:
func (postRepository) Update(id uuid.UUID, input inputs.Post) error {
channel := make(chan error)
go func() {
post := entities.Post{
Title: "title updated",
}
body, err := json.Marshal(post)
if err != nil {
channel <- err
}
request := esapi.UpdateRequest{
Index: index,
DocumentID: id.String(),
Body: strings.NewReader(string(body)),
}
response, err := request.Do(context.Background(), data.ElasticSearchClient)
if err != nil {
channel <- err
}
defer response.Body.Close()
if response.IsError() {
var b map[string]interface{}
e := json.NewDecoder(response.Body).Decode(&b)
if e != nil {
fmt.Println(fmt.Errorf("error parsing the response body: %s", err))
}
fmt.Println(fmt.Errorf("reason: %s", b["error"].(map[string]interface{})["reason"].(string)))
channel <- fmt.Errorf("[%s] Error indexing document", response.Status())
}
channel <- nil
}()
return <-channel
}
My entity:
type Post struct {
Title string
Done bool
Created time.Time
Updated *time.Time
}
In addition this is the only function which does not work, other function like: AddDocument
, RemoveDocument
, GetDocuments
all works as expected.
答案1
得分: 4
在这里找到解决方案:在Golang中的一个简单的Elasticsearch CRUD示例
不要使用:
request := esapi.UpdateRequest{
Index: index,
DocumentID: id.String(),
Body: strings.NewReader(string(body)),
}
而是使用:
request := esapi.UpdateRequest{
Index: index,
DocumentID: id.String(),
Body: bytes.NewReader([]byte(fmt.Sprintf(`{"doc":%s}`, body))),
}
英文:
Found solution here: a-simple-elasticsearch-crud-example-in-golang
Instead of using:
request := esapi.UpdateRequest{
Index: index,
DocumentID: id.String(),
Body: strings.NewReader(string(body)),
}
use
request := esapi.UpdateRequest{
Index: index,
DocumentID: id.String(),
Body: bytes.NewReader([]byte(fmt.Sprintf(`{"doc":%s}`, body))),
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论