我在后过滤器中使用painless面临一个挑战,我需要的是从painless脚本访问一个嵌套字段,这里的目标是基于prices range应用过滤器(这些范围基于报价),我们不想丢失应用的聚合,其中一个问题是,每个指数都有自己的定价因素和附加值,这意味着每个指数都有一个唯一的价格,我们希望能够毫不费力地计算出这个价格。
报价:30套指数1价格:24指数2价格:35
报价60套指数1价格:30指数2价格:67
Map
{
"properties": {
"studentName"{
"type": "text",
},
"class_room":{
"type":"integer"
},
"pricing":{
"type":"nested",
"properties": {
"name":{
"type":"text",
"fielddata":true
},
"addons":{
"type":"double"
},
"factor":{
"type":"double"
}
}
}
}
}
索引示例(\源)
索引1
{
"studentName": "Michael Smith",
"class_room": 12,
"pricing" : [
{
"name": "A",
"addons": 2.25,
"factor": 0.6
},
{
"name": "B",
"addons": 1.5,
"factor": 0.75
},
{
"name": "C",
"addons": 2.0,
"factor": 0.8
}
]
}
索引2
{
"studentName": "Sara Morales",
"class_room": 12,
"pricing" : [
{
"name": "A",
"addons": 2.25,
"factor": 0.6
},
{
"name": "B",
"addons": 1.5,
"factor": 0.75
},
{
"name": "C",
"addons": 2.0,
"factor": 0.8
},
{
"name": "D",
"addons": 1.0,
"factor": 0.8
},
{
"name": "E",
"addons": 1.1,
"factor": 0.5
}
]
}
后过滤器
{
"post_filter": {
"nested":{
"path":"seedData",
"query":{
"bool": {
"must": [
{
"script": {
"script": {
"lang": "painless",
"inline": """
def units = params.units;
def price = 0;
for(def i =0; i< doc['pricing'].length; i++){
price += doc['pricing'][i].addons;
price += (doc['pricing'][i].factor * units);
}
if( price >= params.minPrice && price <= 58){
return true;
} else{
return false;
}
""",
"params": {
"units": 30,
"minPrice": 15,
"maxPrice": 58
}
}
}
}
]
}
}
}
}
}
问题:
使用当前的post-filter脚本,我在类型为[]的Map中得到[seeddata]的no字段
如果尝试像下面的doc['pricing.addons'].length那样访问for循环中的值,我总是得到0。
Map中是否有错误或遗漏了什么?
使用painless访问嵌套字段的方式是否有错误
谢谢你的帮助
暂无答案!
目前还没有任何答案,快来回答吧!