【发布时间】: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