gpt4 book ai didi

sorting - 如何同时按父字段和嵌套字段对 Elasticsearch 进行排序?

转载 作者:行者123 更新时间:2023-12-02 22:21:12 25 4
gpt4 key购买 nike

我需要在 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 将无法再访问。这里可以同时按父字段和嵌套字段排序吗?

最佳答案

您假设父级别不可访问是正确的。现在,您可以

  1. 创建 2 个单独的排序“对象”,一个用于父级,一个用于嵌套商品,然后使用 sort mode 对结果求和或
  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

关于sorting - 如何同时按父字段和嵌套字段对 Elasticsearch 进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63939356/

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