在elasticsearch中使用groovy脚本中的布尔字段 - doc [' field_name']。值不起作用

时间:2015-04-22 22:11:23

标签: groovy elasticsearch boolean

问题

我正在尝试在脚本中使用布尔字段来评分。似乎doc [' boolean_field']。值不能被操作为布尔值,但_source.boolean_field.value可以(尽管脚本文档here说"字段的原生值。例如,如果它是一个短类型,它将是短的。")。

我尝试了什么

我有一个名为' is_new'的字段。这是映射:

PUT /test_index/test/_mapping
{
  "test": {
    "properties": {
      "is_new": {
        "type": "boolean"
      }
    }
  }
}

我有一些文件:

PUT test_index/test/1
{
    "is_new": true
}

PUT test_index/test/2
{
    "is_new": false
}

我想做一个function_score查询,如果是new则得分为1,如果不是则得0:

GET test_index/test/_search
{
  "query": {
    "function_score": {
      "query": {
        "match_all": {}
      },
      "functions": [
        {
          "script_score": {
            "script": "<<my script>>",
            "lang": "groovy"
          }
        }
      ],
      "boost_mode": "replace"
    }
  }
}

当我使用_source.is_new.value字段时,脚本会起作用,但如果我使用doc [&#39; is_new&#39;]。value。

这有效:

"if ( _source.is_new) {1} else {0}" 

这些不能工作:

"if ( doc['is_new'].value) {1} else {0}" (always true)

"if ( doc['is_new'].value instanceof Boolean) {1} else {0}" (value isn't a Boolean)

"if ( doc['is_new'].value.toBoolean()) {1} else {0}"  (always false)

"if ( doc['is_new']) {1} else {0}"  (always true)

我检查了该值,并认为它是一个字符串,但我无法进行字符串比较:

"if ( doc['is_new'].value instanceof String) {1} else {0}"  (always true)

"if ( doc['is_new'].value == 'true') {1} else {0}"  (always false)

"if ( doc['is_new'].value.equals('true')) {1} else {0}" (always false)

这是坏了,还是我做错了?显然,使用doc [&#39; field_name&#39;]。值会更快,所以如果可行的话,如果这样做会很好。

我正在使用Elasticsearch v1.4.4。

谢谢! 伊莎贝尔

2 个答案:

答案 0 :(得分:5)

我在ElasticSearch v1.5.1上遇到了同样的问题:文档中的布尔值在我的脚本中显示为字符,T'显示为true,“F”显示为false:

if ( doc['is_new'].value == 'T') {1} else {0}

答案 1 :(得分:2)

我刚收到它!

首先,它只适用于_source.myField,而不适用于doc ['myField']。value。 我认为那里有一个错误,因为toBoolean()方法应该根据实际值返回一个布尔值,但它没有。

但我还需要将字段的映射显式声明为boolean和not_analyzed。

我希望它有所帮助!