Solr: Indexação e Buscas de Alta Performance usando Software Open Source

Autor: Marco Antonio Rocha

Solr: Indexação e Buscas de Alta Performance usando Software Open Source

Solr é um projeto Open Source de um servidor de buscas de alta performance do projeto Apache Lucene. É desenvolvido em Java e utiliza o Lucene Core como base para indexação e busca, além de fornecer APIs baseadas em REST o que lhe permite ser integrado a praticamente qualquer linguagem de programação.

Principais características

  • Altamente escalável através da replicação de dados para outros servidores;
  • Fácil configuração através de configuração XML, sem necessidade de codificação;
  • Fácil extensão através de plugins;
  • Otimizado para alto volume de tráfego;
  • Interfaces padrão de integração: XML, JSON e HTTP;
  • Ferramenta de administração de fácil compreensão;
  • Estatísticas providas via JMX para monitoramento;

Principais recursos

  • Busca Textual;
  • Busca Geoespacial;
  • Destaque de Termos;
  • Busca facetada;
  • Integração com Banco de Dados;
  • Manipulação de rich documents como PDFs ou DOCs;

Dentre os principais recursos, alguns serão detalhados posteriormente.

Destaque de Termos

Permite destacar o termo buscado dentro do documento encontrado, como pode ser visto na imagem a seguir, onde simulamos o funcionamento do recurso buscando pelo termo Solr no seu site oficial:

Busca Facetadas

Permite agrupar os resultados de acordo com qualquer atributo publicado. O exemplo mais comum que podemos citar sobre o uso desse recurso é a contagem e agrupamento de produtos por categorias, características ou fabricantes existente em sites de compras.

Funcionamento Básico

Instalação

O procedimento de instalação do Solr varia de acordo com o ambiente desejado, mas pode ser instalado como uma aplicação web convencional em um Servlet Container como o Tomcat.

O processo detalhado pode ser visto diretamente na Solr Wiki. Além disso é possível executar uma versão standalone apenas executando os scripts contidos no pacote obtido durante o download.

Configuração

O processo de configuração consiste em configurar o schema utilizado de modo a refletir o modelo de dados que se deseja indexar. Dessa maneira é necessário configurar e, se necessário, criar types e fields.

Types

Através da configuração de tipos é possível determinar o tipo de cada dado (int, float, char, etc) e seus atributos (classe, precisão, etc).

Para tipos textuais é possível configurar analisadores e filtros de modo a customizar o comportamento de acordo com especificidades do idioma com, por exemplo, busca fonética.

Abaixo segue exemplo de configuração básica de tipos:

[xml]<types>

<fieldType name=”boolean” class=”solr.BoolField” sortMissingLast=”true”/>
<fieldType name=”float” class=”solr.TrieFloatField” precisionStep=”0″ omitNorms=”true” positionIncrementGap=”0″/>
<fieldType name=”long” class=”solr.TrieLongField” precisionStep=”0″ omitNorms=”true” positionIncrementGap=”0″/>
<fieldType name=”string” class=”solr.TextField” omitNorms=”true”/>
<fieldType name=”date” class=”solr.DateField” omitNorms=”true”/>

<fieldType name=”text” class=”solr.TextField” omitNorms=”false”>
<analyzer>
<tokenizer class=”solr.StandardTokenizerFactory”/>
<charFilter class=”solr.HTMLStripCharFilterFactory”/>
<filter class=”solr.LowerCaseFilterFactory”/>
<filter class=”solr.BrazilianStemFilterFactory”/>
</analyzer>
</fieldType>

</types>[/xml]

Fields

Através da configuração de campos é possível definir o modelo de dados utilizado. O schema é flexível o suficiente para configurar campos obrigatórios, opcionais, dinâmicos e calculados.

Abaixo segue exemplo de configuração básica de campos, mostrando campos obrigatórios, opcionais e multivalorados:

[xml]<fields>

<field name=”id” type=”long” indexed=”true” stored=”true” required=”true”/>
<field name=”nome” type=”text” indexed=”true” stored=”true” required=”true”/>
<field name=”descricao” type=”text” indexed=”true” stored=”true” required=”false” />
<field name=”preco” type=”float” indexed=”true” stored=”true” required=”true” />
<field name=”categoria” type=”long” indexed=”true” stored=”true” multiValued=”true” required=”false” />
<field name=”fabricante” type=”long” indexed=”true” stored=”true” multiValued=”false” required=”true” />

</fields>[/xml]

Campos Dinâmicos

Campos dinâmicos são campos criados quando não se precisa criar um conjunto de campos seguindo determinado padrão mas não é possível determinar esse padrão em tempo de configuração, dessa maneira cria-se um campo dinâmico e utiliza-se o caracter coringa (*);

Abaixo segue exemplo de configuração de um campo dinâmico que permite que sejam publicados campos chamados ordem_1, ordem_2, ordem_3 e assim por diante:

[xml]<fields>

<dynamicField name=”ordem_*” type=”long” indexed=”true” stored=”true”/>

</fields>[/xml]

Campos Calculados

Campos calculados são campos criados a partir de um processamento (cópia, cálculos matemáticos, etc) realizado nos valores de outros campos e campos opcionais.

Abaixo segue exemplo de configuração de um campo calculado (texto) criado a partir da cópia do conteúdo de dois outros campos (nome e descricao):

[xml]<fields>

<field name=”texto” type=”text” indexed=”true” stored=”false” multiValued=”true”/>

</fields>

<copyField source=”nome” dest=”texto”/>
<copyField source=”descricao” dest=”texto”/>[/xml]

Administração

O Solr fornece uma interface de administração Web, onde pode-se verificar a configuração realizada e realizar operações administrativas como alteração de nível de logging, testes de queries e análise de estatísticas.

Segue abaixo a tela inicial da ferramenta de administração:

Publicação

A publicação de conteúdo deve seguir o modelo definido previamente na configuração do schema. É possível publicar conteúdo através de requisições HTTP ou usando a API fornecida diretamente para cada linguagem. Em Java é possível utilizar a API Solrj.

Busca

A busca é realizada usando a sintaxe já definida pela ferramenta semelhante à sintaxe utilizada pelo Lucene. Assim como a publicação, as buscas podem ser realizadas através de requisições HTTP ou das APIs fornecidas.

Referências

Comentários