sorting - 如何同时按父字段和嵌套字段在 Elasticsearch 中排序?
问题描述
我需要同时按父字段和嵌套字段在 Elasticsearch 中进行排序。我的数据是这样的:
[
{
"id": "1",
"rank": 8,
"price": 12.45,
"offers": [
{
"id": "777",
"rank": 12,
"price": 45.75
}
]
},
{
"id": "2",
"rank": 35,
"price": 5.95,
"offers": null
}
]
我需要以rank
这样的方式对结果进行排序,当offers
不是时null
我应该采用嵌套offers.rank
值,否则我应该采用父rank
值。我试过这个脚本,但它不起作用:
"sort": [
{
"_script": {
"script": {
"source": "doc['offers'].size()==0 ? doc['rank'].value : doc['offers.rank'].value",
"lang": "painless"
},
"type": "number",
"order": "asc"
}
}
]
它不起作用可能是因为它来自一个不可访问offers.rank
的嵌套对象。offers
但我不明白如何处理它 - 如果我为整个脚本添加一个嵌套条件,那么我的父值doc['rank'].value
将无法再访问。可以同时按父字段和嵌套字段排序吗?
解决方案
您假设无法访问父级是正确的。现在,你可以
- 创建 2 个单独的排序“对象”,一个用于父级,一个用于嵌套报价,然后使用排序模式或
- 迭代
_source
而不是:
{
"sort": [
{
"_script": {
"script": {
"source": """
if (params._source.offers instanceof ArrayList
&& params._source.offers.length > 0) {
return params._source['offers'][0].rank;
}
return params._source.rank
""",
"lang": "painless"
},
"type": "number",
"order": "asc"
}
}
]
}
请注意,由于我们在ArrayList
这里使用“报价”,因此您需要某种机制来选择排名。这取决于您——我只是访问了第一个报价的排名,您可能想要对数组列表进行排序并选择最高的...
如果您喜欢的话,这里有一个单线:
params._source.offers instanceof ArrayList && params._source.offers.length > 0 ? params._source['offers'][0].rank : params._source.rank
推荐阅读
- javascript - 唯一用户名 - 带有 Android Studio 的 Firebase
- reactjs - 在复合组件上声明附加成员
- azure - Azure Functions 使用 JavaScript 中的 Azure 媒体服务提供 mp4 视频
- vba - 过滤数据后创建新工作簿
- django - 在进入个人资料页面时,“profile_pic”没有与之关联的文件,出现值错误
- javascript - 重新加载页面后,Service Worker 显示为已删除
- python-3.x - 无法打开链接或单击文本按钮以使用 selenium 和 python 转到网站上的 reletad 区域
- python-3.x - 使用 .setEchoMode() 后 QLineEdit 消失
- tensorflow - 由于时期数,张量流模型无法正常工作
- javascript - 如何在打字稿的单元测试中模拟课堂上的硬私有财产