6

我是 ElasticSearch 的新手,想知道,一旦您使用 mvel 语法定义了一个脚本字段,您是否可以随后过滤或在查询正文中引用它,就好像它是任何其他字段一样?

我找不到任何这样的例子,同时我没有在文档页面上看到任何关于这是否可能的提及

http://www.elasticsearch.org/guide/reference/modules/scripting/ http://www.elasticsearch.org/guide/reference/api/search/script-fields/

这本书 ElasticSearch Server 也没有提到这是否可能

4

2 回答 2

11

至于 2018 和 Elastic 6.2,仍然无法按定义的字段进行过滤,但是,您可以为相同的目的script_fields定义自定义脚本过滤器。例如,假设您已经定义了以下脚本字段:

{
  "script_fields" : {
    "some_date_fld_year":"doc["some_date_fld"].empty ? null : doc["some_date_fld"].date.year"
  }
}

你可以用它过滤

{
  "query": {
    "bool" : {
      "must" : {
        "script" : {
          "script" : {
            "source": " (doc["some_date_fld"].empty ? null : doc["some_date_fld"].date.year) >= 2017",
            "lang": "painless"
          }
        }
      }
    }
  }
}
于 2018-05-08T05:35:34.893 回答
8

这是不可能的,原因很简单:script_fields 是在搜索的最后阶段(获取阶段)计算的,并且仅针对您检索的记录(默认为前 10 名)。脚本过滤器适用于未被前面过滤器过滤掉的所有记录,并且它发生在查询阶段,该阶段在获取阶段之前。换句话说,当应用过滤器时,script_fields 还不存在。

于 2013-03-27T01:25:14.207 回答