在 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}
问题
我正在尝试在脚本中使用布尔字段来评分。似乎 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}