Эластичный поиск.Динамическая оценка на основе поля документа - PullRequest
0 голосов
/ 09 октября 2018

Привет, я использую эластичный поиск 6.4, и я пытался найти какое-либо подходящее решение для моей проблемы.Так что моя проблема в том, что у меня есть документ, и я пытаюсь забить в зависимости от идентификатора из запроса.Упрощенная структура документа выглядит следующим образом:

{
    "rates": [
     { "id": 1, "score_rate": 4.0},
     { "id": 2, "score_rate": 5.0}, 
     { "id": 3, "score_rate": 0.0}
   ]
}

Поле ставок является вложенным.

  1. С первой попытки я связался для достижения этой цели с помощью функции 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).

Так что я застрял в этой проблеме ипонятия не имею как это решить.Так что любые предложения или советы приветствуются.Заранее спасибо

1 Ответ

0 голосов
/ 12 октября 2018

Если вы знаете, как заставить это работать должным образом, пожалуйста, напишите это в комментариях.Но я знаю, что я создаю обходной путь:

Поскольку массив скоростей имеет относительно небольшой размер.Мне удалось создать поле Float для каждого значения динамически, а затем во время поиска я передаю имя этих полей в качестве параметра в свой script_score (параметр rate_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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...