Можно ли это сделать в эластичном поисковом запросе?

В настоящее время я решаю эту проблему, предварительно вычисляя оценку перед вставкой событий в Elastic Search. Однако, поскольку он основан на дате, мне приходится ежедневно пересчитывать счет. Можно ли сделать этот расчет во время запроса?

Данные:

{
    "title" : "event 1",
    "rank" : 1034, // pre-calculated score
    "score": 34,
    "date" : "2015-10-10 00:00:00",
    "meta" : [
        {
            "date": "2015-10-10 00:00:00",
            "type": "insert"
        },
        {
            "date": "2015-12-10 00:00:00",
            "type": "outsert"
        },
        {
            "date": "2015-05-10 00:00:00",
            "type": "other"
        }       
    ]
}

Рейтинг:

Создано 4 "сегмента" с датой insert.

  • Мероприятия младше 5 дней
  • События старше 5 дней и младше 10 дней
  • События старше 10 дней и младше 15 дней
  • События старше 15 дней

События в каждой корзине должны быть отсортированы по score полю DESC.

Предварительно рассчитанный рейтинг создается путем добавления 1000, 2000 или 3000 к счету в зависимости от того, в какую категорию попадает событие.

При выполнении запроса результаты сортируются по рангу.

Как бы я сделал это без использования предварительно рассчитанного rank?


person sschueller    schedule 24.11.2015    source источник


Ответы (1)


я думаю, вы можете добиться этого. Настоящая проблема с вашей текущей предопределенной логикой подсчета очков заключается в том, что вы не можете перемещать данные события назад после истечения срока их действия в его текущем сегменте. поскольку ваши сегменты следуют симметрии разницы дней в 5 дней. Используйте оценку функции с линейным днем, шкала -5 дней. https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html

{
 "gauss": {
        "date_field": {
              "origin": "2013-09-17", 
              "scale": "5d",
              "offset": "0d", 
              "decay" : 0.5 
            }
        }
    }

Замените источник текущей датой при запросе data.setup boost_mode и score_mode в соответствии с общей ссылкой. Надеюсь, это сработает.

person user3775217    schedule 24.11.2015
comment
извините, вместо гауссового распада используйте линейный распад. - person user3775217; 24.11.2015