从脚本中的聚合中获取结果 ElasticSearch/Painless

Get result from aggs in script ElasticSearch/Painless

我是 ElasticSearch 世界的新手。我一直在尝试编写简单的请求,我需要在我的脚本中获取聚合结果以创建简单的条件。有可能这样做吗? 以下条件仅供参考。

GET _search
{
  "aggs" : {
      "sum_field" : { "sum" : { "field" : "someField" } }
  },
  "script_fields": {
    "script_name": {
      "script": {
        "lang": "painless",
        "source": """
             // get there aggs result (sum_field)
              if(sum_field > 5){
                  return sum_field
              }
        """
      }
    }
  }
}

要求是在具有相同字段名称

多个索引上执行sum aggregation

现在有了多个索引,您必须检查该特定字段 是否存在于该索引中 以及该字段是否属于 相同的数据类型.

索引

我创建了三个索引,有一个名为 num 的字段。

index_1
     - num: long

index_2
     - num: long

index_3
     - num: text
          : fielddata: true

另请注意,如果该字段的类型为 text,那么我将其设置为 属性 fielddata:true。但是如果你不设置它,那么下面的查询会给你聚合结果以及一个错误,说你不能检索类型 text 的值作为它的分析字符串,你只能使用 doc对于 non_analyzed 的字段。

示例查询:

POST /_search
{  
   "size":0,
   "query":{  
      "bool":{  
         "filter":[  
            {  
               "exists":{  
                  "field":"num"
               }
            }
         ]
      }
   },
   "aggs":{  
      "myaggs":{  
         "sum":{  
            "script":{  
               "source":"if(doc['num'].value instanceof long) return doc['num'].value;"
            }
         }
      }
   }
}

无法设置时查询fielddata:true

在这种情况下,您需要明确提及要聚合的索引。

POST /_search
{  
   "size":0,
   "query":{  
      "bool":{  
         "filter":[  
            {  
               "exists":{  
                  "field":"num"
               }
            },
            {  
               "terms":{  
                  "_index":[  
                     "index_1",
                     "index_2"
                  ]
               }
            }
         ]
      }
   },
   "aggs":{  
      "myaggs":{  
         "sum":{  
            "script":{  
               "source":"if(doc['num'].value instanceof long) return doc['num'].value;"
            }
         }
      }
   }
}

希望对您有所帮助!