我正在处理的文档如下所示:
{
"product_name": "abc",
"prices": {
"regular": 9.99,
"pricing_tables": [
{ "id": 1, "price": 8.99 },
{ "id": 2, "price": 7.99 }
]
}
}
其中 prices.pricing_tables 是一个嵌套字段。
我想做的是用下面的逻辑排序,给定一个定价表id:
- 如果嵌套字段包含给定的id,则使用pricing_tables.price
- 如果嵌套字段不包含id,则使用prices.regular
到目前为止我尝试使用的查询:
"sort": [
{
"_script": {
"type": "number",
"script": {
"lang": "painless",
"source": """
if(doc['prices.pricing_tables.price'].size() != 0) {
return doc['prices.pricing_tables.price'].value;
}
else {
return doc['prices.regular'].value;
}
"""
},
"nested": {
"path": "prices.pricing_tables",
"filter": {
"term": {"prices.pricing_tables.id": 1}
}
},
"order": "asc"
}
}
]
但是,它并没有按预期方式工作。如果pricing_tables嵌套对象中没有条目,则结果中的排序值始终为1。7976931348623157E308
我错过了什么?这是可能的吗?
1条答案
按热度按时间kjthegm61#
你的
nested
过滤器实际上是排除所有pricing_tables.id
不等于1
的文档。然后Elasticsearch为这些文档分配1.79E308
的排序值。这个数字不是随机的--它确实是Double.MAX_VALUE
,并且是ES在asc
排序的情况下默认的值。但是回到你的脚本排序,我不认为你可以很容易地访问
prices.pricing_tables.price
的doc-values而不使prices
本身成为nested
。您可以做的是:
_source
作为HashMap
访问pricing_tables
(如果适用)下面是一个例子:
请记住,与访问doc-values相比,访问
_source
会使排序性能下降。