elasticsearch:如何使用painless从post\u过滤器访问嵌套字段

yzuktlbb  于 2021-06-10  发布在  ElasticSearch
关注(0)|答案(0)|浏览(257)

我在后过滤器中使用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访问嵌套字段的方式是否有错误
谢谢你的帮助

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题