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.