Pesquisa de texto completo com Solr
1. Visão geral
Neste artigo, exploraremos um conceito fundamental no mecanismo de pesquisaApache Solr - pesquisa de texto completo.
The Apache Solr is an open source framework, designed to deal with millions of documents. Analisaremos os principais recursos dele com exemplos usando a biblioteca Java -SolrJ.
2. Configuração do Maven
Dado o fato de o Solr ser de código aberto - podemos simplesmente baixar o binário e iniciar o servidor separadamente do nosso aplicativo.
Para se comunicar com o servidor, definiremos a dependência Maven para o cliente SolrJ:
org.apache.solr
solr-solrj
6.4.2
Você pode encontrar a última dependênciahere.
3. Dados de Indexação
Para indexar e pesquisar dados, precisamos criar umcore; vamos criar um chamadoitem para indexar nossos dados.
Antes de fazer isso, precisamos que os dados sejam indexados no servidor, para que se tornem pesquisáveis.
There are many different ways we can index data. Podemos usar manipuladores de importação de dados para importar dados diretamente de bancos de dados relacionais, fazer upload de dados com Solr Cell usando Apache Tika ou fazer upload de dados XML / XSLT, JSON e CSV usando manipuladores de índice.
3.1. Indexando Documento Solr
Podemos indexar dados emcore criandoSolrInputDocument. Primeiro, precisamos preencher o documento com nossos dados e, em seguida, chamar apenas a API do SolrJ para indexar o documento:
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", id);
doc.addField("description", description);
doc.addField("category", category);
doc.addField("price", price);
solrClient.add(doc);
solrClient.commit();
Observe queid deve ser naturalmente único para diferentesitems. Ter umid de um documento já indexado atualizará esse documento.
3.2. Feijões de Indexação
O SolrJ fornece APIs para indexar beans Java. Para indexar um bean, precisamos anotá-lo com as anotações@Field:
public class Item {
@Field
private String id;
@Field
private String description;
@Field
private String category;
@Field
private float price;
}
Uma vez que temos o bean, a indexação é direta:
solrClient.addBean(item);
solrClient.commit();
4. Consultas Solr
A pesquisa é a capacidade mais poderosa do Solr. Depois de indexar os documentos em nosso repositório, podemos procurar palavras-chave, frases, períodos, etc. Os resultados são classificados por relevância (pontuação).
4.1. Consultas Básicas
O servidor expõe uma API para operações de pesquisa. Podemos chamar os manipuladores de solicitação/select ou/query.
Vamos fazer uma pesquisa simples:
SolrQuery query = new SolrQuery();
query.setQuery("brand1");
query.setStart(0);
query.setRows(10);
QueryResponse response = solrClient.query(query);
List- items = response.getBeans(Item.class);
SolrJ usará internamente o parâmetro de consulta principalq em sua solicitação ao servidor. O número de registros retornados será 10, indexado a partir de zero quandostarterows não forem especificados.
A consulta de pesquisa acima irá procurar quaisquer documentos que contenham a palavra“brand1” completa em qualquer um de seus campos indexados. Observe quesimple searches are not case sensitive.
Let’s look at another example. Queremos pesquisar qualquer palavra que contenha“rand”, que comece com qualquer número de caracteres e termine com apenas um caractere. Podemos usar caracteres curinga*e? em nossa consulta:
query.setQuery("*rand?");
As consultas Solr também suportam operadores booleanos, como no SQL:
query.setQuery("brand1 AND (Washing OR Refrigerator)");
Todos os operadores booleanos devem estar em letras maiúsculas; aqueles apoiados pelo analisador de consulta sãoAND,OR, NOT,+e -.
Além disso, se quisermos pesquisar em campos específicos em vez de todos os campos indexados, podemos especificá-los na consulta:
query.setQuery("description:Brand* AND category:*Washing*");
4.2. Frase de consultas
Até esse momento, nosso código procurava por palavras-chave nos campos indexados. Também podemos fazer pesquisas de frases nos campos indexados:
query.setQuery("Washing Machine");
Quando temos uma frase como “Washing Machine“, o analisador de consulta padrão do Solr a analisa em “Washing OR Machine“. Para procurar uma frase inteira, só podemos adicionar a expressão entre aspas duplas:
query.setQuery("\"Washing Machine\"");
We can use proximity search to find words within specific distances. Se quisermos encontrar as palavras com pelo menos duas palavras, podemos usar a seguinte consulta:
query.setQuery("\"Washing equipment\"~2");
4.3. Consultas de intervalo
As consultas de intervalo permitem obter documentos cujos campos estão entre intervalos específicos.
Digamos que queremos encontrar itens cujo preço varia entre 100 e 300:
query.setQuery("price:[100 TO 300]");
A consulta acima encontrará todos os elementos cujo preço está entre 100 e 300, inclusive. Podemos usar “}” e “\{” para excluir pontos finais:
query.setQuery("price:{100 TO 300]");
4.4. Filtrar consultas
As consultas de filtro podem ser usadas para restringir o superconjunto de resultados que podem ser retornados. A consulta de filtro não influencia a pontuação:
SolrQuery query = new SolrQuery();
query.setQuery("price:[100 TO 300]");
query.addFilterQuery("description:Brand1","category:Home Appliances");
Geralmente, a consulta de filtro contém consultas usadas com frequência. Como costumam ser reutilizáveis, eles são armazenados em cache para tornar a pesquisa mais eficiente.
5. Pesquisa Facetada
Facetamento ajuda a organizar os resultados da pesquisa em contagens de grupos. Podemos facetar campos, consultas ou intervalos.
5.1. Facetamento de campo
Por exemplo, queremos obter as contagens agregadas de categorias no resultado da pesquisa. Podemos adicionar o campocategory em nossa consulta:
query.addFacetField("category");
QueryResponse response = solrClient.query(query);
List facetResults = response.getFacetField("category").getValues();
OfacetResults conterá contagens de cada categoria nos resultados.
5.2. Facetamento de consultas
O facetamento de consultas é muito útil quando queremos recuperar contagens de subconsultas:
query.addFacetQuery("Washing OR Refrigerator");
query.addFacetQuery("Brand2");
QueryResponse response = solrClient.query(query);
Map facetQueryMap = response.getFacetQuery();
Como resultado, ofacetQueryMap terá contagens de consultas de faceta.
5.3. Facetamento
A lapidação de intervalo é usada para obter a contagem de intervalos nos resultados da pesquisa. A consulta a seguir retornará as contagens de faixas de preço entre 100 e 251, com diferença de 25:
query.addNumericRangeFacet("price", 100, 275, 25);
QueryResponse response = solrClient.query(query);
List rangeFacets = response.getFacetRanges().get(0).getCounts();
Além dos intervalos numéricos, o Solr também oferece suporte a intervalos de datas, intervalo de facetas e intervalo de pivô.
6. Destaque de hit
Podemos querer que as palavras-chave em nossa consulta de pesquisa sejam destacadas nos resultados. Isso será muito útil para obter uma imagem melhor dos resultados. Vamos indexar alguns documentos e definir palavras-chave a serem destacadas:
itemSearchService.index("hm0001", "Brand1 Washing Machine", "Home Appliances", 100f);
itemSearchService.index("hm0002", "Brand1 Refrigerator", "Home Appliances", 300f);
itemSearchService.index("hm0003", "Brand2 Ceiling Fan", "Home Appliances", 200f);
itemSearchService.index("hm0004", "Brand2 Dishwasher", "Washing equipments", 250f);
SolrQuery query = new SolrQuery();
query.setQuery("Appliances");
query.setHighlight(true);
query.addHighlightField("category");
QueryResponse response = solrClient.query(query);
Map>> hitHighlightedMap = response.getHighlighting();
Map> highlightedFieldMap = hitHighlightedMap.get("hm0001");
List highlightedList = highlightedFieldMap.get("category");
String highLightedText = highlightedList.get(0);
ObteremoshighLightedText como“Home <em>Appliances</em>”. Observe que a palavra-chave de pesquisaAppliances está marcada com<em>. A tag de realce padrão usada pelo Solr é<em>, mas podemos mudar isso definindo as tagspreepost:
query.setHighlightSimplePre("");
query.setHighlightSimplePost("");
7. Sugestões de pesquisa
Um dos recursos importantes que o Solr suporta são sugestões. Se as palavras-chave na consulta contiverem erros de ortografia ou se quisermos sugerir o preenchimento automático de uma palavra-chave de pesquisa, podemos usar o recurso de sugestão.
7.1. Verificação ortográfica
O manipulador de pesquisa padrão não inclui o componente de verificação ortográfica; deve ser configurado manualmente. Existem três maneiras de fazer isso. Você pode encontrar os detalhes de configuração nowiki page oficial. Em nosso exemplo, usaremosIndexBasedSpellChecker, que usa dados indexados para verificação ortográfica de palavras-chave.
Vamos pesquisar uma palavra-chave com erro ortográfico:
query.setQuery("hme");
query.set("spellcheck", "on");
QueryResponse response = solrClient.query(query);
SpellCheckResponse spellCheckResponse = response.getSpellCheckResponse();
Suggestion suggestion = spellCheckResponse.getSuggestions().get(0);
List alternatives = suggestion.getAlternatives();
String alternative = alternatives.get(0);
A alternativa esperada para nossa palavra-chave“hme” deve ser“home”, pois nosso índice contém o termo“home”.. Observe quespellcheck deve ser ativado antes de executar a pesquisa.
7.2. Termos de sugestão automática
Convém receber sugestões de palavras-chave incompletas para ajudar na pesquisa. O componente de sugestão do Solr deve ser configurado manualmente. Você pode encontrar os detalhes de configuração em seuwiki page oficial.
Configuramos um manipulador de solicitação chamado/suggest para lidar com sugestões. Vamos obter sugestões para a palavra-chave“Hom”:
SolrQuery query = new SolrQuery();
query.setRequestHandler("/suggest");
query.set("suggest", "true");
query.set("suggest.build", "true");
query.set("suggest.dictionary", "mySuggester");
query.set("suggest.q", "Hom");
QueryResponse response = solrClient.query(query);
SuggesterResponse suggesterResponse = response.getSuggesterResponse();
Map> suggestedTerms = suggesterResponse.getSuggestedTerms();
List suggestions = suggestedTerms.get("mySuggester");
A listasuggestions deve conter todas as palavras e frases. Observe que configuramos um sugeridor chamadomySuggester em nossa configuração.
8. Conclusão
Este artigo é uma introdução rápida aos recursos do mecanismo de pesquisa e recursos do Solr.
Abordamos muitos recursos, mas é claro que eles estão apenas arranhando a superfície do que podemos fazer com um servidor de pesquisa avançado e maduro, como o Solr.
Os exemplos usados aqui estão disponíveis como sempre,over on GitHub.