Сумма арифметики Solr вместо счета

Я новичок в Solr, и я заинтересован в реализации специального аспекта.

Примеры документов:

{ hostname: google.com, time_spent: 100 }
{ hostname: facebook.com, time_spent: 10 }
{ hostname: google.com, time_spent: 30 }
{ hostname: reddit.com, time_spent: 20 }
...

Я хотел бы вернуть фасет со следующей структурой:

{ google.com: 130, reddit.com: 20, facebook.com: 10 }

Хотя значения возвращаемых значений solr гораздо более подробные, важно отметить, что "counts" для граней - это сумма значений time_spent для документов, а не фактическое количество документов, соответствующих фасете.

Идея № 1:

Я мог бы использовать стержень:

q:*:*
&facet=true
&facet.pivot=hostname,time_spent

Тем не менее, это возвращает подсчеты всех уникальных затраченных временем значений для каждого уникального имени хоста. Я мог бы суммировать это в своем приложении вручную, но это кажется расточительным.

Идея № 2

Я мог бы использовать модуль статистики:

q:*:*
&stats=true
&stats.field=time_spent
&stats.facet=hostname

Однако это имеет две проблемы. Во-первых, возвращаемые результаты содержат все имена хостов. Это действительно проблематично, так как у моего набора данных есть более 1 м имен хостов. Кроме того, возвращаемые результаты не сортируются - мне нужно отобразить имена хостов в порядке убывания общего времени.

Ваша помощь в этом была бы очень оценена!

Спасибо!

Ответы

Ответ 1

С Solr >= 5.1 это возможно:

Сортировка факелов

Сортировка по умолчанию для графа полей или терминов определяется количеством веток по убыванию. Мы можем по желанию сортировать по возрастанию или по убыванию функция грани, которая появляется в каждом ковше. Например, если бы мы хотели чтобы найти верхние ведра по средней цене, тогда мы добавим сортировку: "x desc" в предыдущий запрос фасет:

$ curl http://localhost:8983/solr/query -d 'q=*:*&
 json.facet={
   categories:{
     type : terms,
     field : cat,
     sort : "x desc",   // can also use sort:{x:desc}
     facet:{
       x : "avg(price)",
       y : "sum(price)"
     }
   }
 }
'

Смотрите блог Yonik: http://yonik.com/solr-facet-functions/

Для вашего случая использования это будет:

json.facet={
  hostname_time:{
    type: terms,
    field: hostname,
    sort: "time_total desc",
    facet:{
      time_total: "sum(time_spent)",
    }
  }
}

Вызов sum() во вложенных гранях, сработанных для нас только в 6.3.0.

Ответ 2

Я считаю, что вы ищете компонент агрегации, но помните, что solr - это полнотекстовая поисковая система, а не база данных.

Итак, ответ на ваш вопрос: идете с идеей №1. В противном случае вы должны использовать поиск эластичных материалов или MongoDB или даже Redis, которые оснащены такими компонентами агрегации.