Привет, я использую эластичный поиск 6.4, и я пытался найти какое-либо подходящее решение для моей проблемы.Так что моя проблема в том, что у меня есть документ, и я пытаюсь забить в зависимости от идентификатора из запроса.Упрощенная структура документа выглядит следующим образом:
{
"rates": [
{ "id": 1, "score_rate": 4.0},
{ "id": 2, "score_rate": 5.0},
{ "id": 3, "score_rate": 0.0}
]
}
Поле ставок является вложенным.
С первой попытки я связался для достижения этой цели с помощью функции script_score запроса:
{"script_score":{"script":{"params":{"id":1,"min":0.0},"id":"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) в script_functions.
Во второй попытке я попытался использовать комбинацию NestedQuery и FieldValueFactor, которая выглядит примерно так: https://discuss.elastic.co/t/nested-value-on-function-score/29935/2. Но, к сожалению, NestedQuery делает второй запрос и объединяет (я не могу контролировать, как выполняется соединение), результатыэто с корневым запросом, и если корневой запрос пуст, Результат NestedQuery просто добавляется к корневым результатам.Такое поведение неприемлемо для моей бизнес-логики.
С третьей попытки я попытался переиндексировать поле ставок в виде массива и закодировал информацию об идентификаторе в нем.Таким образом, поле из приведенного выше примера будет выглядеть следующим образом: { "rates": [0, 4.0, 5.0, 0.0]}
Снова я использовал функцию скрипта, но нет гарантии порядка элементов (из официального массива документов Elastic Search, рассматриваемого как «мешок значений»).Чтобы элементы были в том же порядке, что и во время индекса, мне нужно использовать поле _source
(которое недоступно в 6.4).
Так что я застрял в этой проблеме ипонятия не имею как это решить.Так что любые предложения или советы приветствуются.Заранее спасибо