我正在嘗試對日期欄位上的彈性搜索查詢結果進行排序,registeredAt. 但是,registeredAt并非在所有回傳的檔案中都存在。在這種情況下,我希望排序在替代欄位上查找日期,invitedAt.
如果我們有 3 個如下所示的命中:
hits = [
{
id: 'hit2'
registeredAt: '2021-06-01T23:00:00.000Z',
invitedAt: '2021-05-31T23:00:00.000Z'
},
{
id: 'hit3'
invitedAt: '2021-05-31T23:00:00.000Z'
},
{
id: 'hit1'
invitedAt: '2021-06-04T23:00:00.000Z'
},
],
那么我希望排序按從最近到最近的順序回傳它們:[hit1, hit2, hit3]. 在每個檔案中,排序腳本應該查找該registeredAt欄位并將該日期作為排序值,如果該欄位不存在,則查看該值invitedAt并將其作為排序值。從這個意義上說,hit1沒有 aregisteredAt并且有最近的日期invitedAt,因此,應該排在第一位。hit2有一個registeredAt欄位,并且該欄位的日期比invitedAt日期更新hit3(沒有registeredAt欄位。
我這樣寫了查詢:
client.search({
index: 'users',
track_total_hits: true,
sort: {
_script: {
type: 'number',
script: {
lang: 'painless',
source:
"if (!doc.containsKey('registeredAt') || doc['registeredAt'].empty) { return doc['invitedAt'].value; } else { return doc['registeredAt'].value }",
},
order: 'desc',
},
},
body: {
from: skip,
size: limit,
query: {...},
},
})
查詢運行沒有錯誤,但排序不起作用,檔案按照它們被索引的順序回傳。
uj5u.com熱心網友回復:
我假設registeredAt并且invitedAt 在date映射中。此查詢應該有效。我添加的是.getMillis()在獲得價值后呼叫。
{
"sort": [
{
"_script": {
"type": "number",
"script": {
"lang": "painless",
"source": """
if (!doc.containsKey('registeredAt') || doc['registeredAt'].empty) {
return doc['invitedAt'].value.getMillis();
}
else {
return doc['registeredAt'].value.getMillis();
}
"""
},
"order": "desc"
}
}
]
}
編輯:.getMillis()在版本 7.x 中已棄用。.toInstant().toEpochMilli()應改為使用。
這是查詢:
{
"sort": [
{
"_script": {
"type": "number",
"script": {
"lang": "painless",
"source": """
if (!doc.containsKey('registeredAt') || doc['registeredAt'].empty) {
return doc['invitedAt'].value.toInstant().toEpochMilli();
}
else {
return doc['registeredAt'].value.toInstant().toEpochMilli();
}
"""
},
"order": "desc"
}
}
]
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/437153.html
上一篇:顯示排序的陣列
下一篇:如何對多級串列進行排序
