Searchkick: повышение будущих дат

Я использую Searchkick в проекте Rails с сервером ElasticSearch 6.8. Я пытаюсь повысить некоторые документы, в которых есть поле года, равное этому году или году в будущем.

Я пробовал использовать boost_where и совсем недавно boost_by, но ни один из них не работает. boost_by генерирует функцию function_score, которая выдает ошибку в ElasticSearch. Вот моя последняя попытка.

Model.search('value', boost_by: { year: { scale: '5y' } })

ElasticSearch, похоже, не нравится интервал календаря (5y), хотя он должен быть допустимым. Вот объект причины из ошибки:

          "caused_by": {
            "type": "number_format_exception",
            "reason": "For input string: \"5y\""
          }

Я пытался установить origin и decay вместе с scale, но это, похоже, ничего не помогает.

Вот запрос, сгенерированный Searchkick (имена моделей и полей изменены из-за очень специфической модели предметной области).

  Model Search (163.5ms)  model_development/_search {"query":{"function_score":{"functions":[{"weight":1,"gauss":{"year":{"scale":"5y"}}}],"query":{"bool":{"should":[{"dis_max":{"queries":[{"multi_match":{"query":"Abreu","boost":10,"operator":"and","analyzer":"searchkick_search","fields":["*.analyzed"],"type":"best_fields"}},{"multi_match":{"query":"Abreu","boost":10,"operator":"and","analyzer":"searchkick_search2","fields":["*.analyzed"],"type":"best_fields"}},{"multi_match":{"query":"Abreu","boost":1,"operator":"and","analyzer":"searchkick_search","fuzziness":1,"prefix_length":0,"max_expansions":3,"fuzzy_transpositions":true,"fields":["*.analyzed"],"type":"best_fields"}},{"multi_match":{"query":"Abreu","boost":1,"operator":"and","analyzer":"searchkick_search2","fuzziness":1,"prefix_length":0,"max_expansions":3,"fuzzy_transpositions":true,"fields":["*.analyzed"],"type":"best_fields"}}]}}]}},"score_mode":"sum"}},"timeout":"11s","_source":false,"size":10000}

person Brandon Cordell    schedule 18.06.2020    source источник


Ответы (1)


Год, вероятно, не является поддерживаемым форматом даты из-за отсутствия абсолютного представления. В сутках всегда 24 часа, а в году иногда 364 дня и обычно 365 дней. Вместо того, чтобы решать эту сложность, ES, скорее всего, остановится на днях.

Если вы хотите, вы можете вместо этого использовать дни для своей шкалы:

Model.search('value', boost_by: { year: { scale: '1825d' } })
person Syntactic Fructose    schedule 18.06.2020
comment
Задним числом это кажется таким очевидным, спасибо! Вишенкой на торте является то, что теперь, когда он работает, он на самом деле не делает то, что я хочу, ха-ха. - person Brandon Cordell; 19.06.2020
comment
Лол, что ты пытаешься сделать в своем запросе? @БрэндонКорделл - person Syntactic Fructose; 19.06.2020
comment
Я пытался повысить результаты, в которых есть поле даты, которое соответствует текущему году или будущему, чтобы даты в прошлом весили меньше. @СинтаксическаяФруктоза. - person Brandon Cordell; 24.06.2020
comment
Рассматривали ли вы возможность использования функции затухания @BrandonCordell? Функция затухания будет наказывать старый контент, уменьшая его оценку. - person Syntactic Fructose; 24.06.2020