Я столкнулся с тем, что кажется ошибкой в Painless: если используется векторная функция, скажем, l2norm(), результат остается таким же, как и в первой итерации. Я использую безболезненный скрипт для оценки функции, надеюсь, приведенный ниже запрос прольет свет. Я использую исключение, чтобы увидеть, какое значение имеет каждая итерация, и каждый раз это оценка первого вектора. Я знаю это, потому что пару раз перебирал параметры, и каждый раз счет зависал на первом. Итак, я думаю, что происходит то, что функция l2norm() (и все векторные функции?!) являются экземплярами объекта, которые могут быть созданы только один раз? Если бы это было так, что бы обойти?
Ссылка на обсуждение ES: https://discuss.elastic.co/t/painless-bug-using-for-loops-and-vector-functions/267263
{
"query": {
"nested": {
"path": "media",
"query": {
"function_score": {
"boost_mode": "replace",
"query": {
"bool": {
"filter": [{
"exists": {
"field": "media.full_body_dense_vector"
}
}]
}
},
"functions": [{
"script_score": {
"script": {
"source": "if (params.filterVectors.size() > 0 && params.filterCutOffScore >= 0) {\n for (int i=0; i < params.filterVectors.size();i++) {\n def c = params.filterVectors[i]; double euDistance = l2norm(c, doc['media.full_body_dense_vector']);\n if (i==1) { throw new Exception(euDistance + ''); } \n }\n return 1.0f;",
"params": {
"filterVectors":[
[1.0,2.0,3.0],[0.1,0.4,0.5]
],
"filterCutOffScore": 1.04
},
"lang": "painless"
}
}
}]
}
}
}
},
"size": 500,
"from": 0,
"track_scores": true
}