He visto cómo obtener una lista de todos los tokens del índice Solr/Lucene. pero Lucene 8.6.1 no parece ofrecer IndexReader.terms() . ¿Se ha movido o reemplazado? ¿Hay una manera más fácil que esta respuesta ?
Algo de historia
Preguntaste: Me pregunto si IndexReader.terms() se ha movido o ha sido reemplazado por una alternativa.
El método IndexReader.terms() de Lucene v3 se movió a AtomicReader en Lucene v4. Esto se documentó en las notas de la versión alfa v4 .
(Tenga en cuenta que Lucene v4 se lanzó en 2012).
El método en AtomicReader en v4 toma un nombre de campo .
Como indican las notas de la versión v4:
Una gran diferencia es que el campo y los términos ahora se enumeran por separado: un TermsEnum proporciona un BytesRef (envuelve un byte []) por término dentro de un solo campo, no un término.
La parte clave allí es "por término dentro de un solo campo" . Entonces, a partir de ese momento, ya no hubo una sola llamada a la API para recuperar todos los términos de un índice.
Este enfoque se mantuvo en versiones posteriores, excepto que las clases AtomicReader y AtomicReaderContext se renombraron como LeafReader y LeafReaderContext en Lucene v 5.0.0. Ver Lucene-5569 .
Lanzamientos recientes
Eso nos deja con la capacidad de acceder a listas de términos, pero solo por campo:
El siguiente código se basa en la última versión de Lucene (8.7.0), pero también debería ser válido para la versión que menciona (8.6.1), con el ejemplo usando Java:
private void getTokensForField(IndexReader reader, String fieldName) throws IOException { List<LeafReaderContext> list = reader.leaves(); for (LeafReaderContext lrc : list) { Terms terms = lrc.reader().terms(fieldName); if (terms != null) { TermsEnum termsEnum = terms.iterator(); BytesRef term; while ((term = termsEnum.next()) != null) { System.out.println(term.utf8ToString()); } } } }El ejemplo anterior asume un índice de la siguiente manera:
private static final String INDEX_PATH = "/path/to/index/directory"; ... IndexReader reader = DirectoryReader.open(FSDirectory.open(Paths.get(INDEX_PATH)));Si necesita enumerar los nombres de los campos, el código de esta pregunta puede proporcionarle un punto de partida.
Nota final
Supongo que también puede acceder a los términos por documento , en lugar de por campo , como se menciona en los comentarios. No he intentado esto.