登录
首页 >  Golang >  Go问答

利用弹性搜索进行文档更新

来源:stackoverflow

时间:2024-03-10 23:36:27 138浏览 收藏

一分耕耘,一分收获!既然打开了这篇文章《利用弹性搜索进行文档更新》,就坚持看下去吧!文中内容包含等等知识点...希望你能在阅读本文后,能真真实实学到知识或者帮你解决心中的疑惑,也欢迎大佬或者新人朋友们多留言评论,多给建议!谢谢!

问题内容

我使用 go-elasticsearch 作为弹性搜索客户端。

我尝试使用此处的代码更新文档 elastic/go-elasticsearch/api.update.go

但是使用 github 上的相同代码我得到:

[updaterequest]未知字段[标题]

到目前为止,我只有一个如下所示的文档

{
    "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
}

此外,这是唯一不起作用的函数,其他函数如:adddocumentremovedocumentgetdocuments 都按预期工作。


正确答案


在这里找到解决方案:a-simple-elasticsearch-crud-example-in-golang

而不是使用:

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))),
}

理论要掌握,实操不能落!以上关于《利用弹性搜索进行文档更新》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>