嗨,我正在使用ElasticSearch6.4,我试图为我的问题找到任何可行的解决方案。因此,我的问题是,我有医生,我试图得分取决于id从查询。简化的文档结构如下所示:
{
"rates": [
{ "id": 1, "score_rate": 4.0},
{ "id": 2, "score_rate": 5.0},
{ "id": 3, "score_rate": 0.0}
]
}
rates字段是嵌套的。
secondary_rate是无痛脚本的地方
double min_threshold = (double) params.min;
double score = min_threshold;
for (int i = 0; i < params._source.rates.length; ++i){
def rate = params._source.rates[i];
if (rate.id == params.id){
c_score = category.score_rate;
break;
}
}
return c_score;
但是这不起作用,因为嵌套字段不能在脚本中访问整个doc['rates']
,而_source
字段在script_functions中不再可用(https://discuss.elastic.co/t/painless-null-pointer-exception/128245)。
{ "rates": [0, 4.0, 5.0, 0.0]}
我再次使用了脚本函数,但不能保证元素的顺序(来自被认为是“值袋”的官方弹性搜索文档数组)。要使元素的顺序与索引时间相同,我需要使用_source
字段(在6.4中不可用)。所以我被困在这个问题上,不知道如何解决它。因此,任何建议或暗示都是非常欢迎的。提前谢谢你
发布于 2018-10-12 13:00:42
如果你知道如何使它正常工作,请把它写在评论中。但就我所知,我创造了解决办法:
因为速率数组的大小相对较小。我设法动态地为每个值创建了Float字段,然后在搜索时间内,我将这些字段的名称作为参数传递给我的script_score (参数rates_keys),并只对值进行求和。所以无痛的功能看上去就像:
double add_score = 0.0;
String key;
for (int i = 0; i != params.rates_keys.length; ++i){
rate_key = params.rates_keys[i];
if(!doc[rate_key].empty) add_score += doc[rate_key].value;
}
return add_score;
https://stackoverflow.com/questions/52715775
复制相似问题