我有一个包含各种成员文档的弹性搜索索引。每个成员文档包含一个成员资格对象,以及与/描述个人成员资格相关的各种字段。例如:
{membership:{'join_date':2015-01-01,'status':'A'}}
会员身份可以是'A'(有效)或'我'(无效);两个Unicode字符串值。我有兴趣略微提高包含活跃会员身份的文件的分数。
在我的groovy脚本中,以及各种数字字段上的其他自定义助推器,我添加了以下内容:
String status = doc['membership.status'].value;
float status_boost = 0.0;
if (status=='A') {status_boost = 2.0} else {status_boost=0.0};
return _score + status_boost
由于某些原因与字符串如何通过groovy进行操作相关联,检查(status=='A')
不起作用。我尝试过(status.toString()=='A')
,(status.toString()=="A")
,(status.equals('A'))
以及其他一些变体。
我应该如何进行故障排除(以高效,高效的方式)?我没有一个单独的groovy安装,但是当我在python中提取响应数据时,状态非常如此,无论是Unicode'A'还是'I',没有额外的间距或字符。
答案 0 :(得分:3)
@VineetMohan最有可能是'a'
而不是'A'
。
您可以通过将它们作为脚本字段吐出来检查值的索引方式:
$ curl -XGET localhost:9200/test/_search -d '
{
"script_fields": {
"status": {
"script": "doc[\"membership.status\"].values"
}
}
}
'
从那里,它应该表明你实际上在做什么。很可能基于名称和您的用法,you will want to reindex (recreate) your data so that membership.status
is mapped as a not_analyzed
string。如果完成,那么你不必担心任何事情的降低。
与此同时,你可以接受:
return _score + (doc['membership.status'].value == 'a' ? 2 : 0)
另外,您不应该使用动态脚本。在生产中使用存储的脚本以避免安全问题。