2013-09-30 2 views
4

Я пытаюсь выполнить группировку совокупности результатов (подсчет и сумму) несколькими полями вложенным образом.Как выполнить вложенную агрегирование по нескольким полям в Solr?

Например, со схемой, показанной в конце этого сообщения, я хотел бы получить сумму «размера», сгруппированную по «категории» и сгруппированную далее по «подкатегории» и получить что-то как это:

<category name="X"> 
    <subcategory name="X_A"> 
    <size sum="..." /> 
    </subcategory> 
    <subcategory name="X_B"> 
    <size sum="..." /> 
    </subcategory> 
</category> 
.... 

Я смотрел в первую очередь на компоненте Статистика Solr, который, насколько я могу видеть, не позволяет вложенную агрегации.

Буду признателен, если кто-нибудь знает о каком-либо способе реализовать это, с компонентом Stats или без него.

Вот сокращенная версия целевой схемы:

<types> 
    <fieldType name="string" class="solr.StrField" /> 
    <fieldType name="text" class="solr.TextField"> 
    <analyzer><tokenizer class="solr.StandardTokenizerFactory" /></analyzer> 
    </fieldType> 
    <fieldType name="date" class="solr.DateField" /> 
    <fieldType name="int" class="solr.TrieIntField" precisionStep="0" omitNorms="true" positionIncrementGap="0" /> 
</types> 

<fields> 
    <field name="id" type="string" indexed="true" stored="true" /> 
    <field name="category" type="text" indexed="true" stored="true" /> 
    <field name="subcategory" type="text" indexed="true" stored="true" /> 
    <field name="pdate" type="date" indexed="true" stored="true" /> 
    <field name="size" type="int" indexed="true" stored="true" /> 
</fields> 

ответ

1

1. Графы

Чтобы получить отсчеты, вы можете использовать Pivot Faceting. Он будет генерировать список, очень похожий на то, что вы просили, но только с подсчетами.

Вам нужно добавить это к вашему запросу:

& фаска = верно & facet.pivot = категория, подкатегория

Обратите внимание, что это работает на Solr 4.0 и после.


2. Суммы

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

2

Существует патч SOLR-3583, который добавляет процентили и средние значения в фасеты, поворотные грани и распределенные осевые грани, используя внутренние граничные элементы. Можно добавить суммы в шарнирные грани, улучшив этот патч.

Например, средние значения могут быть вычислены для категорий, используя этот адрес:

http://localhost:8983/solr/select?q=*%3A* 
&facet=true 
&facet.pivot=category,subcategory 
&facet.stats.percentiles=true 
&facet.stats.percentiles.averages=true 
&facet.stats.percentiles.field=size 
&f.size.stats.percentiles.requested=25,50,75 
&f.size.stats.percentiles.lower.fence=0 
&f.size.stats.percentiles.upper.fence=1000 
&f.size.stats.percentiles.gap=10 

Смотрите также this video and slides для более подробной информации.

+0

Страница не найдена по указанной ссылке – Ajay

+0

Я обновил ссылку –

3

Новый модуль огранка в Solr 5.1 может сделать это, он был добавлен в https://issues.apache.org/jira/browse/SOLR-7214

Вот как бы вы добавить сумму (размер) для каждого фасета ведра, и сортировать по убыванию по этой статистике.

json.facet={ 
    categories:{terms:{ 
    field:category, 
    sort:"total_size desc", // this will sort the facet buckets by your stat 
    facet:{ 
     total_size:"sum(size)" // this calculates the stat per bucket 
    } 
    }} 
} 

И это, как вы бы добавить в subfacet на подкатегории:

json.facet={ 
    categories:{terms:{ 
    field:category, 
    sort:"total_size desc", 
    facet:{ 
     total_size:"sum(size)", 
     subcat:{terms:{ // this will facet on the subcategory field for each bucket 
     field:subcategory, 
     facet:{ 
     sz:"sum(size)" // this calculates the sum per sub-cat bucket   
     }} 
    } 
    }} 
} 

Так выше даст вам сумму (размер) как на категории и подкатегории уровней. Документация для нового фасетного модуля в настоящее время находится на http://yonik.com/json-facet-api/

Смежные вопросы