Searchkick: увеличение числа свиданий в будущем - PullRequest
1 голос
/ 18 июня 2020

Я использую 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 (модель и имена полей изменены из-за очень специфической c модели предметной области).

  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}

1 Ответ

1 голос
/ 19 июня 2020

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

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

Model.search('value', boost_by: { year: { scale: '1825d' } })
...