Сумма арифметики 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, которые оснащены такими компонентами агрегации.