Guia para Solr em Java com Apache SolrJ

Guia para Solr em Java com Apache SolrJ

1. Visão geral

Apache Solr é uma plataforma de pesquisa de código aberto construída sobre o Lucene. O Apache SolrJ é um cliente baseado em Java para o Solr que fornece interfaces para os principais recursos de pesquisa, como indexação, consulta e exclusão de documentos.

Neste artigo, vamos explorarhow to interact with an Apache Solr server using SolrJ.

2. Configuração

Para instalar um servidor Solr em sua máquina, consulteSolr QuickStart Guide.

O processo de instalação é simples - basta baixar o pacote zip / tar, extrair o conteúdo e iniciar o servidor na linha de comando. Para este artigo, vamos criar um servidor Solr com um núcleo chamado ‘bigboxstore ':

bin/solr start
bin/solr create -c 'bigboxstore'

Por padrão, o Solr escuta a porta 8983 para consultas HTTP recebidas. Você pode verificar se ele foi iniciado com sucesso abrindo a URLhttp://localhost:8983/solr/#/bigboxstore em um navegador e observando o painel Solr.

3. Configuração do Maven

Agora que temos nosso servidor Solr em funcionamento, vamos direto para o cliente SolrJ Java. Para usar SolrJ em seu projeto, você precisará ter a seguinte dependência Maven declarada em seu arquivopom.xml:


    org.apache.solr
    solr-solrj
    6.4.0

Você sempre pode encontrar a versão mais recente hospedada porMaven Central.

4. Apache SolrJ Java API

Vamos iniciar o cliente SolrJ conectando-se ao nosso servidor Solr:

String urlString = "http://localhost:8983/solr/bigboxstore";
HttpSolrClient solr = new HttpSolrClient.Builder(urlString).build();
solr.setParser(new XMLResponseParser());

Nota:SolrJ uses a binary format, rather than XML, como seu formato de resposta padrão. Para compatibilidade com o Solr, é necessário invocar explicitamentesetParser() para XML, conforme mostrado acima. Mais detalhes sobre isso podem ser encontradoshere.

4.1. Documentos de indexação

Vamos definir os dados a serem indexados usando umSolrInputDocumente adicioná-los ao nosso índice usando o métodoadd():

SolrInputDocument document = new SolrInputDocument();
document.addField("id", "123456");
document.addField("name", "Kenmore Dishwasher");
document.addField("price", "599.99");
solr.add(document);
solr.commit();

Nota: Qualquer ação que modifique o banco de dados Solr requer que a ação seja seguida porcommit().

4.2. Indexando com Feijão

You can also index Solr documents using beans. Vamos definir um ProductBean cujas propriedades são anotadas com @Field:

public class ProductBean {

    String id;
    String name;
    String price;

    @Field("id")
    protected void setId(String id) {
        this.id = id;
    }

    @Field("name")
    protected void setName(String name) {
        this.name = name;
    }

    @Field("price")
    protected void setPrice(String price) {
        this.price = price;
    }

    // getters and constructor omitted for space
}

Então, vamos adicionar o bean ao nosso índice:

solrClient.addBean( new ProductBean("888", "Apple iPhone 6s", "299.99") );
solrClient.commit();

4.3. Consulta de documentos indexados por campo e id

Vamos verificar se nosso documento foi adicionado usandoSolrQuery para consultar nosso servidor Solr.

OQueryResponse do servidor conterá uma lista de objetosSolrDocument correspondentes a qualquer consulta com o formatofield:value. Neste exemplo, consultamos por preço:

SolrQuery query = new SolrQuery();
query.set("q", "price:599.99");
QueryResponse response = solr.query(query);

SolrDocumentList docList = response.getResults();
assertEquals(docList.getNumFound(), 1);

for (SolrDocument doc : docList) {
     assertEquals((String) doc.getFieldValue("id"), "123456");
     assertEquals((Double) doc.getFieldValue("price"), (Double) 599.99);
}

Uma opção mais simples é consultar porId usandogetById(). que retornará apenas um documento se uma correspondência for encontrada:

SolrDocument doc = solr.getById("123456");
assertEquals((String) doc.getFieldValue("name"), "Kenmore Dishwasher");
assertEquals((Double) doc.getFieldValue("price"), (Double) 599.99);

4.4. Exclusão de documentos

Quando queremos remover um documento do índice, podemos usardeleteById()e verificar se ele foi removido:

solr.deleteById("123456");
solr.commit();
SolrQuery query = new SolrQuery();
query.set("q", "id:123456");
QueryResponse response = solr.query(query);
SolrDocumentList docList = response.getResults();
assertEquals(docList.getNumFound(), 0);

Também temos a opção dedeleteByQuery(), então vamos tentar excluir qualquer documento com um nome específico:

solr.deleteByQuery("name:Kenmore Dishwasher");
solr.commit();
SolrQuery query = new SolrQuery();
query.set("q", "id:123456");
QueryResponse response = solr.query(query);
SolrDocumentList docList = response.getResults();
assertEquals(docList.getNumFound(), 0);

5. Conclusão

Neste artigo rápido, vimos como usar a API Java do SolrJ para executar algumas das interações comuns com o mecanismo de pesquisa de texto completo do Apache Solr.

Você pode verificar os exemplos fornecidos neste artigoover on GitHub.