5

我有以下当前使用动态脚本的查询。从那以后,我发现我的主机不支持这一点,因为它具有更广泛的安全影响。我将如何重写此脚本以使其不使用动态脚本?

{
  "size": 0,
  "aggs": {
    "filtered_cells": {
      "filter": {
        "geo_bounding_box": {
          "loc": {
            "top_left": "58.645976, -13.515625",
            "bottom_right": "50.524473, 2.436523"
          }
        }
      },
      "aggs": {
        "cells": {
          "geohash_grid": {
            "field": "loc",
            "precision": 2
          },
          "aggs": {
            "center_lat": {
              "avg": {
                "script": "doc['loc'].lat"
              }
            },
            "center_lon": {
              "avg": {
                "script": "doc['loc'].lon"
              }
            }
          }
        }
      }
    }
  },
  "query": {
    "match_all": {}
  }
}
4

2 回答 2

2

您可以将脚本存储在文件系统上,并从查询/聚合中引用它们。

创建一个config/scripts/lat.groovy具有以下内容的文件

 doc['loc'].lat

创建另一个config/scripts/lon.groovy具有以下内容的文件

 doc['loc'].lon

然后将您的查询更改为:

{
  "size": 0,
  "aggs": {
    "filtered_cells": {
      "filter": {
        "geo_bounding_box": {
          "loc": {
            "top_left": "58.645976, -13.515625",
            "bottom_right": "50.524473, 2.436523"
          }
        }
      },
      "aggs": {
        "cells": {
          "geohash_grid": {
            "field": "loc",
            "precision": 2
          },
          "aggs": {
            "center_lat": {
              "avg": {
                "script_file": "lat"
              }
            },
            "center_lon": {
              "avg": {
                "script_file": "lon"
              }
            }
          }
        }
      }
    }
  },
  "query": {
    "match_all": {}
  }
}
于 2015-05-28T11:47:05.737 回答
1

除了将实际脚本放在.groovy文件上,就像我提到的(更多细节在这里),你可以定义一个native脚本。比 groovy-on-file 方法涉及更多,但更灵活。在您的情况下,脚本非常简单:-),尽管您不需要灵活性,但是存在该选项(确实来自您的实现示例):ElasticSearch:aggregation on _score field w/Groovy disabled

于 2015-05-28T11:55:34.460 回答