我是ElasticSearch的新手并且想知道,一旦你用mvel语法定义了一个脚本字段,你可以随后过滤,或者在查询体中引用它,就像它是否是任何其他字段一样?
我找不到任何这方面的例子,同时我没有看到在文档页面上是否可以提及
http://www.elasticsearch.org/guide/reference/modules/scripting/ http://www.elasticsearch.org/guide/reference/api/search/script-fields/
ElasticSearch Server这本书没有提到这是否可能
答案 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"
}
}
}
}
}
}