gpt4 book ai didi

node.js - Elasticsearch 返回类型

转载 作者:行者123 更新时间:2023-11-29 02:57:24 24 4
gpt4 key购买 nike

我试图简单地接收一个插入的项目,对其进行编辑并再次更新。不幸的是,这并不顺利。

代码尚未最终确定,只是 POC'ing,如果您打算复制它,请不要在生产中使用这样的代码:)。

我的创建功能运行良好:

async create(index: string, obj: any, id: string): Promise<TModel> {
let req: RequestParams.Create<TModel> = {
body: obj,
index: index,
id: id,
};
try {
var result = await this.client.create(req, {
ignore:[409]
});
if (result.statusCode === 201) {
return result.body;
} else {
console.log("Non succesfull call, result:", result);
return null;
}
} catch (error) {
console.log("create error", error);
return null;
}
}

我的更新功能大致相同

async update(index: string, obj: any, id: string): Promise<TModel> {
try {
let req: RequestParams.Update<TModel> = {
body: obj,
index: index,
id: id
};
var result = await this.client.update(req);
if (result.statusCode === 200 || result.statusCode === 201 || result.statusCode == 202 || result.statusCode == 204) {
return result.body;
} else {
console.log("Non succesfull call, result:", result);
return null;
}
} catch (error) {
console.error("Error updating", error);
}
}

我开始使用的搜索功能:

async search(index: string, searchBody: any): Promise<any> {

try {
var result = await this.client.search({
index: index,
body: searchBody
});
if (result.statusCode === 200) {
return result.body.hits.hits;
} else {
console.log("Non succesfull call, result:", result);
return null;
}
} catch (error) {
console.log("Error getting result", error);
return null;
}
}

当插入并稍后搜索一个对象时,您当然会得到一个any 返回类型。了解数据的结构后,我在某处执行以下操作只是为了快速测试:

返回结果.body.hits.hits[0]._source

结果是这样的:

enter image description here

虽然对象的 JSON 格式看起来是正确的,就像我创建的一样,但它会在更新数据时抛出错误:

error

所以我在谷歌上搜索并尝试应用这个由 elastic 自己提供的解决方案:

https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/typescript.html

搜索代码:

async searchTyped(index: string, searchBody: any): Promise<TModel> {
try {
let req : RequestParams.Search<TModel> ={
index : index,
body : searchBody,
};
var result : ApiResponse<SearchResponse<TModel>> = await this.client.search(req);
if (result.statusCode === 200) {
if(result.body.hits.hits.length > 0){
return result.body.hits.hits[0]._source;
}
return null;
} else {
console.log("Non succesfull call, result:", result);
return null;
}
} catch (error) {
console.log("Error getting result", error);
return null;
}
}

根据智能感知,这应该有效,_source 应该是 TModel 类型。

enter image description here

不幸的是,没有运气:

enter image description here

我是否在正确的道路上确保更新前数据对象的正确性?

我们希望坚持使用动态映射,而不定义所需的确切模型。我假设使用此设置,请求正文包含 javascript Object 还是 typescript 类型并不重要?

最佳答案

最终它是什么对象并不重要,我只需要以不同的方式进行更新:

async update(index: string, obj: any, id: string): Promise<any> {
try {
let req: RequestParams.Update<any> = {
body: {
"doc": obj
},
index: index,
id: id
};
var result = await this.client.update(req);
if (result.statusCode === 200 || result.statusCode === 201 || result.statusCode == 202 || result.statusCode == 204) {
return result.body;
} else {
console.log("Non succesfull call, result:", result);
return null;
}
} catch (error) {
console.error("Error updating", error);
}
}

所以所有更新都应该在 doc 中,然后一切都很好。

在本指南中找到:https://hub.packtpub.com/crud-create-read-update-delete-operations-elasticsearch/

关于node.js - Elasticsearch 返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58312418/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com