问题
我正在尝试在脚本中使用布尔字段来评分。似乎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。
谢谢! 伊莎贝尔
答案 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。
我希望它有所帮助!