Apache SOLR – Trabalhando com resultados agrupados e separando por categorias

Publicado: 9 de setembro de 2014 em Diversos

Este post é dedicado para aquelas pessoas que estão iniciando com Solr e estão esbarrando em questões de agrupamento de documentos. Pensando nisso resolvi abordar este tema, e mostrar como realizar agrupamento de dados de maneira simples e prática.

Quanto as configurações do Solr vou deixar para um outro post pois não é o foco neste momento, até porque se você está lendo este post provavelmente já realizou tal configuração J.

Agora vamos pensar em um problema que poderia ser resolvido com agrupamentos e para isso pense na seguinte questão:
E se eu tivesse que obter exatamente 3 registros por categoria em uma coleção de muitas categorias com milhares de registros?

Veja abaixo uma consulta comum do Solr que geralmente é utilizada.

Consulta sem agrupamento
http://localhost:8983/solr/select?q=*.*&start=0&rows=3&fl=id,title,category&wt=json&indent=true

Retorno

{
“responseHeader”:{
“status”:0,
“QTime”:91,
“params”:{
“fl”:”id,title,category”,
“indent”:”true”,
“start”:”0″,
“q”:”*:*”,
“wt”:”json”,
“rows”:”3″}},
“response”:{“numFound”:7707700,”start”:0,”docs”:[
{
“id”:”9855549″,
“category”:Esporte},
{
“id”:”9855540″,
“category”:Política},
{
“id”:”9855539″,
“category”:Tecnologia}]
}}

Note que a consulta não resolveu nosso problema, então vamos incrementar adicionando os recursos de agrupamento

Parâmetros básicos que iremos utilizar

Parâmetros adicionados

Tipo

Descrição

&rows=X integer Indica quantos grupos devem ser analisados
&group=true Boolean Habilita o recurso de agrupamento
&group.field=CAMPO_PARA_AGRUPAR string Usado para definir qual campo deverá ser utilizado para agrupar os resultados
&group.limit=X integer Indica a quantidade de valores que devem ser retornados para cada grupo em rows

Adicionando os parâmetros acima ficaremos com a seguinte consulta abaixo: http://localhost:8983/solr/select?q=*.*&start=0&rows=3&fl=id,title,category&wt=json&indent=true&group=true&group.field=categoria&group.limit=3

Veja abaixo como ficou o retorno, note que os Ids são distintos, ou seja exatamente o que estávamos buscando para resolver a questão levantada.

{
“responseHeader”:{
“status”:0,    “QTime”:425,    “params”:{      “group.ngrous”:”false”,      “fl”:”id,title,category”,      “indent”:”true”,      “start”:”0″,      “q”:”*:*”,
“group.limit”:”3″,
“group.field”:”category”,
“group”:”true”,
“wt”:”json”,
“rows”:”3″}},
“grouped”:{
“category”:{
“matches”:7707700,
“groups”:[{
“groupValue”:2249,
“doclist”:{“numFound”:86434,”start”:0,”docs”:[
{
“id”:”9855549″,
category”:Esporte},
{
“id”:”9855070″,
category”:Esporte },
{
“id”:”9854768″,
category”:Esporte }]
}},
{
“groupValue”:2408,
“doclist”:{“numFound”:240541,”start”:0,”docs”:[
{
“id”:”9855540″,
category”:Política},
{
“id”:”9855539″,
category”:Política},
{
“id”:”9855538″,
category”:Política}]
}},
{
“groupValue”:2253,
“doclist”:{“numFound”:16234,”start”:0,”docs”:[
{
“id”:”9855526″,
category”:Tecnologia},
{
“id”:”9855525″,
category”:Tecnologia},
{
“id”:”9481634″,
category”:Tecnologia}]
}}]}}}

Enfim, agora é só usar a imaginação e colocar a mão na massa.

NOTA: Existem muitos outros parâmetros de grupos que podem ser utilizados para ajudar no seu dia a dia e que podem ser visualizados AQUI . Em breve irei disponibilizar como realizar a implantação do mesmo em JAVA e PHP.

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s