在定义查询表达式后,是否可以引用并过滤查询表达式中的脚本字段?

时间:2013-03-27 00:48:02

标签: elasticsearch

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

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

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

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

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

{
  "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"
          }
        }
      }
    }
  }
}