【发布时间】:2018-10-12 21:00:42
【问题描述】:
您好,我使用的是 elasticsearch 6.4,我正在尝试为我的问题找到任何可行的解决方案。所以我的问题是我有文档,我试图根据查询中的 id 进行评分。简化的文档结构如下:
{
"rates": [
{ "id": 1, "score_rate": 4.0},
{ "id": 2, "score_rate": 5.0},
{ "id": 3, "score_rate": 0.0}
]
}
rates 字段是嵌套的。
-
在我第一次尝试时,我基于查询 script_score 函数实现了这个目标:
{"script_score":{"script":{"params":{"id":1,"min":0.0},"id":"secondary_rate"}}}
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 的脚本中无法访问嵌套字段,并且脚本函数中的https://discuss.elastic.co/t/painless-null-pointer-exception/128245 字段不再可用。
在第二次尝试中,我尝试使用 NestedQuery 和 FieldValueFactor 的组合 看起来像:https://discuss.elastic.co/t/nested-value-on-function-score/29935/2。但不幸的是,NestedQuery 使用根查询进行第二次查询和连接(我无法控制如何执行连接)结果,如果根查询为空 NestedQuery 的结果刚刚添加到根结果中。这种行为对于我的业务逻辑来说是不可接受的。
-
在第三次尝试中,我尝试将 rates 字段重新索引为数组并在其中编码有关 id 的信息。因此,上面示例中的字段将如下所示:
{ "rates": [0, 4.0, 5.0, 0.0]}我再次使用了脚本函数,但不能保证元素的顺序(来自被视为“值袋”的官方 Elastic Search 文档数组)。要有元素在 与索引时间相同的顺序我需要使用
_source字段(在 6.4 中不可用)。
所以我有点卡在这个问题上,不知道如何解决它。因此,非常欢迎任何建议或提示。提前谢谢你
【问题讨论】:
标签: elasticsearch