使用表达式的脚本字段 - 只能访问成员变量[value]或成员方法

时间:2016-03-30 08:27:21

标签: elasticsearch

我正在尝试在查询中使用脚本字段。 我启用了沙盒脚本,并尝试使用表达式来计算新字段。

问题是我收到以下错误:

{
   "type": "expression_script_compilation_exception",
   "reason": "Only the member variable [value] or member methods may be accessed on a field when not accessing the field directly"
}

似乎只有"价值"可以访问。我在这里错过了什么?

运行以下查询时:

{
  "query": {
    "match_all": {}
  },
  "script_fields" : {
    "field1" : {
        "script" : {
            "lang": "expression",
            "inline": "doc['about.hobbies'].empty"
        }
    }
  }
}

映射:

{
  "my_index": {
  "mappings": {
     "type": {
        "properties": {
           "about": {
              "properties": {
                 "hobbies": {
                    "type": "string",
                    "analyzer": "lowercase"
                 }
              }
           }
        }  
     }
   }
}

小解释:我有一个字段,可以包含字符串值列表。

"hobbies": ["a","b",c"]

它也可以是空的。我希望有一个类型为boolean的脚本字段,当列表不为空时,其值为true;如果列表为空,则为false。

更新:阅读更多内容,我在lucene expressions scripts

上遇到此文档
  

相对于其他脚本语言存在一些限制:

     
      
  • 只能访问数字字段
  •   
  • 存储的字段不可用
  •   
  • 如果某个字段是稀疏的(只有部分文档包含值),则缺少该字段的文档的值为0
  •   

我的字段是String类型,可能是问题? 如果是,是否有其他方法可以使用基于字符串字段的脚本字段?也许使用groovy?

1 个答案:

答案 0 :(得分:1)

我认为问题是该字段是嵌套对象,如果我正确阅读文档,则doc ['field']仅支持简单的术语字段。

  

但请注意,doc [...]符号只允许使用简单的值字段(不能从中返回json对象),并且仅在非分析或基于单个术语的字段中有意义。

但是使用_source对我有用

   "script_fields" : {
      "field1" : {
           "script" : "_source.about.hobbies.size() > 0"
       }
    },