Agrupación de resultados de búsqueda utilizando GroupingEschar
Paquete org.apache.lucene.search.grouping Descripción
Este módulo puede agrupar los resultados de búsqueda de Lucene, y los campos especificados de un solo valor se juntan. Por ejemplo, el grupo Según el campo "Autor", los documentos con el mismo valor de campo "autor" se dividen en un grupo.
Al agrupar, debe ingresar la información necesaria:
1. Groupfield: Grupo según este campo. Por ejemplo, si usa el campo "Autor" para agruparse, entonces los libros en cada grupo son el mismo autor. Los documentos sin este dominio se dividirán en un grupo separado.
2. Groupsort: clasificación grupal.
3. Topn Groups: cuántos grupos se retienen. Por ejemplo, 10 significa que solo se retienen los primeros 10 grupos.
4. GroupOffset: búsqueda para qué grupos grupales se clasifican primero. Por ejemplo, 3 significa devolver 7 grupos (suponiendo grupos OPN igual a 10). Es muy útil en la paginación, como solo se muestran 5 grupos por página.
5. WithingRoupSort: ordene documentos en grupos. Nota: La diferencia entre aquí y grupos
6. With GroupOffset: búsqueda para qué documentos se clasifican primero en cada grupo.
Agrupar los resultados de la búsqueda es más simple de usar GroupingEsching
GroupingeSearch API Documentation Introducción:
Clase de conveniencia para realizar la agrupación en un entorno no distribuido.
Agrupación en entornos no distribuidos
ADVERTENCIA: Esta API es experimental y podría cambiar de manera incompatible en el próximo lanzamiento.
La versión 4.3.1 se usa aquí
Algunas formas importantes:
Código de muestra:
1. Primero mire el código de índice
clase pública indexHelper {documento de documento privado; directorio de directorio privado; Indexwriter privado IndexWriter; Directorio público getDirectory () {Directory = (Directory == NULL)? nuevo RamDirectory (): directorio; directorio de retorno; } private indexwriterconfig getConfig () {return new IndexWriterConfig (versión.lucene_43, new IKanalyzer (true)); } private indexwriter getIndexwriter () {try {return New IndexWriter (getDirectory (), getConfig ()); } catch (ioException e) {E.PrintStackTrace (); regresar nulo; }} public indexsearcher getIndexsearcher () lanza IOException {return New IndexSearcher (DirectoryReader.open (getDirectory ())); } / ** * Crear índice para la prueba de grupo * @param autor * @param content * / public void createIndexforGroup (int id, string autor, string content) {indexwriter = getIndexwriter (); documento = nuevo documento (); document.add (nuevo intfield ("id", id, field.store.yes)); document.add (new Stringfield ("autor", autor, field.store.yes)); document.add (nuevo TextField ("Content", Content, Field.store.yes)); intente {indexWriter.addDocument (documento); indexwriter.commit (); indexwriter.close (); } catch (ioException e) {E.PrintStackTrace (); }}}2. Agrupación:
Public Class GrouptestPublic Void Group (indexsearcher indexsearcher, string groupfield, string content) lanza IOException, ParseException {GroupSearch GroupingSearch = new GroupingSearch (Groupfield); GroupingeSearch.SetGroupSort (nuevo sort (sortfield.field_score)); GroupingingSearch.SetFillSortFields (verdadero); GroupingeSearch.SetCachingInmb (4.0, verdadero); GroupingingSearch.SetAllGroups (verdadero); //GroupingSearch.SetallGroUpheads(true); GroupingingSearch.SetGroupDocSlimit (10); QueryParser parser = new QueryParser (versión.lucene_43, "contenido", new iKanalyzer (true)); Consulta consulta = parser.parse (contenido); TopGroups <bytesRef> result = GroupingingSearch.search (indexSearcher, consulta, 0, 1000); System.out.println ("Hits de búsqueda:" + resultado.totalhitCount); System.out.println ("Grouping de resultados de búsqueda:" + resultado.groups.length); Documento de documento; para (GroupDocs <bytesRef> Groupdocs: result.groups) {System.out.println ("Group:" + GroupDocs.GroupValue.utf8ToString ()); System.out.println ("Registro en el grupo:" + Groupdocs.totalhits); //System.out.println("groupdocs.scoredocs.length: " + groupdocs.scoredocs.length); para (scoredoc scoredoc: groupdocs.scoredocs) {system.out.println (indexsearcher.doc (scoredoc.doc)); }}}3. Prueba simple:
public static void main (string [] args) lanza ioexception, parseException {indexHelper indexHelper = new IndexHelper (); indexHelper.CreateIndexforGroup (1, "batata", "código abierto China"); indexhelper.createIndexforGroup (2, "batata", "comunidad de código abierto"); indexHelper.CreateIndexforGroup (3, "batata", "diseño de código"); indexhelper.createindexforgroup (4, "batata", "diseño"); indexHelper.CreateIndexforGroup (5, "Jiexian", "Desarrollo de Lucene"); indexhelper.createIndexforGroup (6, "jiexian", "combate práctico lucene"); indexHelper.CreateIndexforGroup (7, "Jiexian", "Open Source Lucene"); indexHelper.CreateIndexforGroup (8, "Jiexian", "Solr de código abierto"); indexHelper.CreateIndexforGroup (9, "sanxian", "Source abierto de Sanxiano Lucene"); indexHelper.CreateIndexforGroup (10, "Sanxian", "Solr de código abierto de Sanxiano"); indexHelper.CreateIndexforGroup (11, "sanxian", "código abierto"); Grouptest Grouptest = new Grouptest (); Grouptest.group (indexHelper.getIndexsearcher (), "autor", "código abierto"); }} 4. Resultados de la prueba:
Dos formas de paginar
Lucene tiene dos formas de paginar:
1. Pagine directamente los resultados de búsqueda. Este método se puede usar cuando el volumen de datos es relativamente pequeño. La referencia central del código de paginación es:
Scoredoc [] sd = xxx; // consulta Iniciar registro Posición int begin = PageSize * (currentPage - 1); // consulta Posición de registro int end = Math.min (Begin+Pagesize, SD.Length); for (int i = begin; i <end && i <totalHits; I ++) {// Código para procesar datos de búsqueda de datos}}2. Use SearchAfter (...)
Lucene proporciona cinco métodos de sobrecarga que se pueden usar según sea necesario
ScoredOC After: Reduzca la cantidad total de CORTORDOC para el último resultado de búsqueda en 1;
Consulta de consulta: método de consulta
int n: el número de resultados devueltos para cada consulta, es decir, el número total de resultados por página
Un ejemplo simple de usar:
// puede usar el mapa para guardar los resultados de búsqueda necesarios MAP <String, Object> resultMap = new Hashmap <String, Object> (); scoredOC After = Null; Query Query = XXTOPDOCS TD = Search.SearchAfter (After, Query, Size); // Obtener el número HIT resultMap.put ("num", td.totalhits); Scoredoc [] sd = td.scoredocs; para (scoredOC scoredoc: sd) {// procesamiento de resultados de búsqueda clásica} // Resultados de búsqueda La cantidad total se reduce por 1 después de = SD [td.scoredocs.length - 1]; // Guardar después para la próxima búsqueda, es decir, la página siguiente inicia resultMap.put ("después", después); return ResultMap;