#node.js #elasticsearch #client #numeric #update-by-query
#node.js #elasticsearch #клиент #числовые #обновление по запросу
Вопрос:
Я немного новичок в клиенте elasticsearch. Я не делал никакого предопределенного сопоставления с каким-либо полем, потому что в будущем я мог бы добавить какое-нибудь новое поле в документы. Мои данные выглядят так:-
{
"segmentId": "4700-b70e-881",
"segmentName": "test",
"data": "This is a test data",
"dataId": "70897e86-9d69-4700-b70e-881a7f74e9f9",
"augmented": false,
"createdBy": {
"email": "2010abinas@gmail.com",
"primaryKey": "902d2b57-54e6",
"secondaryKey": "adcc-f20423822c93"
},
"status": "active",
"createdAt": 1617422043554,
"updatedAt": 1617422043554
}
Я хотел обновить 3 поля, используя updateByQuery
.
Я пытался использовать следующий подход.
await esClient.updateByQuery({
index: "data",
type: "doc",
refresh: true,
body:{
query:{
match: {
dataId: "70897e86-9d69-4700-b70e-881a7f74e9f9"
}
},
script:{
lang:"painless",
source:`ctx._source.data='This is updated test data';ctx._source.updatedAt=${Date.now()};ctx._source.segmentId=null`
}
}
})
Я получаю ошибку компиляции из-за updatedAt
и segmentId
, когда я передаю как строку, это работает, например:-
source:`ctx._source.data='This is updated test data';ctx._source.updatedAt='${Date.now()}';ctx._source.segmentId='null'`
Ответ №1:
Я нашел способ решить вышеуказанную проблему,
await esClient.updateByQuery({
index: "data",
type: "doc",
refresh: true,
body:{
query:{
match: {
dataId: "70897e86-9d69-4700-b70e-881a7f74e9f9"
}
},
script:{
lang:"painless",
source:`ctx._source.data='This is updated test data';ctx._source.updatedAt=params.date;ctx._source.segmentId=params.segmentId`,
params:{
date: Date.now(),
segmentId: null
}
}
}
});