我有兴趣在Elasticsearch 2.1中找到以下得分问题的最快解决方案
我的文档中有几个类似字段weight_1, ..., weight_N
和decay_1, ..., decay_N
。我还提前知道参数decay_1, ..., decay_N
和scale_1, ..., scale_N
。我希望将以下计算为文档分数:
SUM(weight_i * 0.5**((decay_i - origin_i) / scale_i), i=1..N)
我会提前知道N
- 因此我将确切地知道需要总结多少字段,并且评分解决方案不需要处理动态数量的字段。
使用N = 1
非常容易:
{
"query": {
"function_score": {
"functions": [
{
"exp": {
"decay_1": {
"origin": "origin_1",
"scale": "scale_1",
"decay": "0.5"
}
}
},
{
"field_value_factor": {
"field": "weight_1",
"missing": 0
}
}
]
}
}
}
当然,我可以使用Lucene表达式(因为我提前知道N
)或使用本机Java脚本或Groovy脚本来完成此操作。但我对性能最好的解决方案很感兴趣,这似乎通常意味着尽可能使用内置版本。