【问题标题】:Using boolean fields in groovy script in elasticsearch - doc['field_name'].value not working在弹性搜索的 groovy 脚本中使用布尔字段 - doc['field_name'].value 不起作用
【发布时间】:2015-06-30 20:04:18
【问题描述】:

问题

我正在尝试在脚本中使用布尔字段来评分。似乎 doc['boolean_field'].value 不能作为布尔值进行操作,但 _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 查询,如果是新的,则得分为 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。

谢谢! 伊莎贝尔

【问题讨论】:

  • 我现在也遇到了同样的问题。有谁知道如何解决这个问题?我也试过 doc['myField'].value.toBoolean() == true 没有成功,我使用的是 Elasticsearch 1.5。

标签: groovy elasticsearch boolean


【解决方案1】:

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

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

【讨论】:

  • 太棒了,谢谢!至少有一种方法可以使用 doc['FIELD'].value 方式检查布尔字段的值。
【解决方案2】:

我刚拿到!

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

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

希望对你有帮助!

【讨论】:

  • 嗯,是的,它看起来像是一个错误。是的,我确实发现它可以工作,这就是我目前正在使用的,但是文档提到使用 doc['myField'].value 而不是 _source 更高效,所以我希望我能以某种方式让它工作。
  • 谢谢@David!这对我使用 Elasticsearch 2.1.1 有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多