Agrupando os resultados da pesquisa usando o GroupingingSearch
Pacote org.apache.lucene.search.Grouping Descrição
Este módulo pode agrupar os resultados de pesquisa da Lucene e os campos de valor único especificado são reunidos. Por exemplo, grupo de acordo com o campo "Autor", documentos com o mesmo valor de campo "autor" são divididos em um grupo.
Ao agrupar, você precisa inserir algumas informações necessárias:
1. Groupfield: Grupo de acordo com este campo. Por exemplo, se você usar o campo "Autor" para agrupar, os livros em cada grupo são o mesmo autor. Os documentos sem esse domínio serão divididos em um grupo separado.
2 GRUPOS DO GRUPOS: CLASSIFICAÇÃO DO GRUPO.
3. TopnGroups: Quantos grupos são retidos. Por exemplo, 10 significa que apenas os 10 primeiros grupos são retidos.
4. GroupOffset: Pesquise quais grupos de grupos são classificados em primeiro lugar. Por exemplo, 3 significa retornar 7 grupos (assumindo o OpnGroups iguais a 10). É muito útil na paginação, como apenas 5 grupos são exibidos por página.
5. WithingRoupSort: Classifique documentos em grupos. Nota: a diferença entre aqui e grupos
6. WithGroupoffset: Pesquise quais documentos classificaram primeiro em cada grupo.
Os resultados da pesquisa de agrupamento é mais simples de usar o GroupingSearch
Documentação da API da GroupingSearch: Introdução:
Classe de conveniência para realizar agrupamento em um ambiente não distribuído.
Agrupamento em ambientes não distribuídos
Aviso: Esta API é experimental e pode mudar de maneiras incompatíveis no próximo lançamento.
Versão 4.3.1 é usado aqui
Algumas maneiras importantes:
Código de exemplo:
1. Primeiro olhe para o código do índice
classe pública IndexHelper {Private Document Document; diretório de diretório privado; private indexwriter indexwriter; Public Directory getDirectory () {diretório = (diretório == null)? novo ramdirectory (): diretório; diretório de retorno; } private indexwriterConfig getConfig () {return new indexwriterconfig (versão.lucene_43, new ikanalyzer (true)); } private indexWriter getIndexWriter () {try {return new indexWriter (getDirectory (), getConfig ()); } catch (ioexception e) {e.printStackTrace (); retornar nulo; }} public IndexSearcher getIndexSearcher () lança IoException {return new IndexSearcher (diretoryReader.open (getDirectory ())); } / ** * Crie índice para teste de grupo * @param autor * @param content * / public void createIndexforGroup (int id, string autor, string content) {indexwriter = getIndexWriter (); document = new document (); document.add (new intfield ("id", id, field.store.yes)); document.add (new stringfield ("autor", autor, field.store.yes)); Document.add (New TextField ("Content", Content, Field.store.yes)); tente {indexwriter.adddocument (document); indexwriter.commit (); indexwriter.close (); } catch (ioexception e) {e.printStackTrace (); }}}2. Agrupamento:
Classe pública GROUPTESTPUBLIC VOID GRUPO (IndexSarcher IndexSearcher, String Groupfield, String Content) lança IoException, parseException {GroupingsEarch GroupingsEarch = new GroupingSearch (Groupfield); groupingSearch.setGroupSort (novo Sort (Sortfield.field_score)); groupingsEarch.setFillSortFields (true); groupingSearch.setCachingInmb (4.0, verdadeiro); groupingSearch.setallgroups (true); //groupingsEarch.SetallGroupheads(True); groupingsEarch.setGroupDocslimit (10); Queryparser parser = new queryparser (versão.lucene_43, "content", new ikanalyzer (true)); Query Query = Parser.Parse (Content); TopGroups <ByTesRef> resultado = GroupingSearch.Search (IndexSearcher, consulta, 0, 1000); System.out.println ("Pesquisa hits:" + resultado.totalhitcount); System.out.println ("agrupamento de resultados de pesquisa:" + resultado.groups.length); Documento documento; for (groupDocs <tytesref> groupDocs: resultado.groups) {System.out.println ("Grupo:" + groupDocs.groupValue.utf8toString ()); System.out.println ("Record em grupo:" + groupdocs.totalhits); //System.out.println("GroupDocs.Coredocs.Length: " + groupDocs.scoredocs.length); para (SCOREDOC SCORDOC: groupDocs.scoredocs) {System.out.println (indexSearcher.doc (scoredoc.doc)); }}}3. Teste simples:
public static void main (string [] args) lança IoException, parseException {indexHelper indexHelper = new IndexHelper (); IndexHelper.CreateIndexForGroup (1, "batata -doce", "código aberto da China"); IndexHelper.CreateIndexForGroup (2, "Batata Sweet", "Comunidade de código aberto"); IndexHelper.CreateIndexforGroup (3, "Batata Sweet", "Código Design"); IndexHelper.CreateIndexForGroup (4, "Batata Sweet", "Design"); IndexHelper.CreateIndexForGroup (5, "Jiexian", "Lucene Development"); IndexHelper.CreateIndexForGroup (6, "Jiexian", "Lucene Practical Combat"); IndexHelper.CreateIndexForGroup (7, "Jiexian", "Open Source Lucene"); IndexHelper.CreateIndexforGroup (8, "Jiexian", "Open Source Solr"); IndexHelper.CreateIndexforGroup (9, "Sanxian", "Sanxian Open Source Lucene"); IndexHelper.CreateIndexForGroup (10, "Sanxian", "Sanxian Open Source Solr"); IndexHelper.CreateIndexForGroup (11, "Sanxian", "Open Source"); Grouptest grouptest = novo grouptest (); grouptest.group (indexHelper.getIndexSearcher (), "Autor", "Open Source"); }} 4. Resultados dos testes:
Duas maneiras de pagar
Lucene tem duas maneiras de pagar:
1. Paginar diretamente os resultados da pesquisa. Este método pode ser usado quando o volume de dados é relativamente pequeno. A referência principal do código de paginação é:
Scoredoc [] sd = xxx; // consulta inicial Posição de registro Int Begin = PageSize * (CurrentPage - 1); // Consulta Termine Posição de registro Int END = Math.min (Begin+Pagesize, Sd.Length); para (int i = BEGIN e Dados de Better; I <End && i <Totalhits; i ++) {// Code para processamento2. Use Searchafter (...)
Lucene fornece cinco métodos de sobrecarga que podem ser usados conforme necessário
SCOREDOC APÓS: Reduza a quantidade total de SCOREDOC para o último resultado da pesquisa em 1;
Consulta de consulta: método de consulta
int n: o número de resultados retornados para cada consulta, ou seja, o número total de resultados por página
Um exemplo simples de usar:
// você pode usar o mapa para salvar o mapa de resultados de pesquisa necessário <string, object> resultmap = new hashmap <string, object> (); scoredoc depois = null; query query = xxtopdocs td = search.searchafter (depois, consulta, tamanho); // Obtenha o número de acertos resultaMap.put ("num", td.totalhits); Scoredoc [] sd = td.scoredocs; para (SCOREDOC SCOREDOC: SD) {// Processamento de resultado da pesquisa clássica} // Resultados da pesquisa O valor total do SCOREDOCS é reduzido em 1 após = SD [td.scoredocs.length - 1]; // Salvar após a próxima pesquisa, ou seja, a próxima página inicia o resultMap.put ("depois", depois); Retornar ResultMap;