lucene lucene.net

¿Es posible iterar a través de documentos almacenados en el Índice Lucene?



lucene.net (5)

Hay una clase de consulta llamada MatchAllDocsQuery , creo que puede usarse en este caso:

Query query = new MatchAllDocsQuery(); TopDocs topDocs = getIndexSearcher.search(query, RESULT_LIMIT);

Tengo algunos documentos almacenados en un índice de Lucene con un campo docId. Quiero obtener todos los documentos almacenados en el índice. También hay un problema. El número de documentos es aproximadamente 300 000, por lo que preferiría obtener estos documentos en trozos de tamaño 500. ¿Es posible hacerlo?


Los números de documento (o ID) serán números posteriores de 0 a IndexReader.maxDoc () - 1. Estos números no son persistentes y solo son válidos para IndexReader abierto. Podría verificar si el documento se eliminó con el método IndexReader.isDeleted (int documentNumber)


Si usa .document (i) como en los ejemplos anteriores y omite los documentos eliminados, tenga cuidado si usa este método para la paginación de resultados. es decir: tiene una lista de 10 documentos por página y necesita obtener los documentos. para la página 6. Su entrada podría ser algo como esto: desplazamiento = 60, cuenta = 10 (documentos de 60 a 70).

IndexReader reader = // create IndexReader for (int i=offset; i<offset + 10; i++) { if (reader.isDeleted(i)) continue; Document doc = reader.document(i); String docId = doc.get("docId"); }

Tendrá algunos problemas con los eliminados porque no debe comenzar desde offset = 60, sino desde offset = 60 + el número de documentos eliminados que aparecen antes de 60.

Una alternativa que encontré es algo como esto:

is = getIndexSearcher(); //new IndexSearcher(indexReader) //get all results without any conditions attached. Term term = new Term([[any mandatory field name]], "*"); Query query = new WildcardQuery(term); topCollector = TopScoreDocCollector.create([[int max hits to get]], true); is.search(query, topCollector); TopDocs topDocs = topCollector.topDocs(offset, count);

nota: reemplace el texto entre [[]] con valores propios. Corrí esto en un índice grande con 1.5 millones de entradas y obtuve 10 resultados aleatorios en menos de un segundo. De acuerdo es más lento, pero al menos puede ignorar los documentos eliminados si necesita paginación.


Lucene 4

Bits liveDocs = MultiFields.getLiveDocs(reader); for (int i=0; i<reader.maxDoc(); i++) { if (liveDocs != null && !liveDocs.get(i)) continue; Document doc = reader.document(i); }

Consulte LUCENE-2600 en esta página para obtener detalles: https://lucene.apache.org/core/4_0_0/MIGRATE.html


IndexReader reader = // create IndexReader for (int i=0; i<reader.maxDoc(); i++) { if (reader.isDeleted(i)) continue; Document doc = reader.document(i); String docId = doc.get("docId"); // do something with docId here... }