定义后,您能否在查询表达式中的脚本字段上进行引用和过滤?

blu*_*utt 6 elasticsearch

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

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

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

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

Vit*_*nko 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"
  }
}
Run Code Online (Sandbox Code Playgroud)

你可以用它过滤

{
  "query": {
    "bool" : {
      "must" : {
        "script" : {
          "script" : {
            "source": " (doc["some_date_fld"].empty ? null : doc["some_date_fld"].date.year) >= 2017",
            "lang": "painless"
          }
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


imo*_*tov 7

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