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

Using boolean fields in groovy script in elasticsearch - doc['field_name'].value not working

问题

我正在尝试在脚本中使用布尔字段来评分。似乎 doc['boolean_field'].value 不能作为布尔值进行操作,但 _source.boolean_field.value 可以(即使脚本文档 here 说 "The native value of the field. For example, if its a short type, it will be short.")。

我试过的

我有一个名为 '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 查询,如果是新的则得分为 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['is_new'].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['field_name'].value 速度更快,所以如果可能的话,如果这能奏效就好了。

我正在使用 Elasticsearch v1.4.4。

谢谢! 伊莎贝尔

我刚拿到!

首先,它只适用于 _source.myField,不适用于 doc['myField'].value。 我认为那里有一个错误,因为 toBoolean() 方法应该 return 一个布尔值,具体取决于实际值,但事实并非如此。

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

希望对您有所帮助!

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

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