È ansible iterare attraverso i documenti memorizzati nell’Indice Lucene?

Ho alcuni documenti memorizzati in un indice di Lucene con un campo docId. Voglio ottenere tutti i docidi memorizzati nell’indice. C’è anche un problema. Il numero di documenti è di circa 300.000 quindi preferirei ottenere questo documento in blocchi di dimensioni 500. È ansible farlo?

IndexReader reader = // create IndexReader for (int i=0; i 

Lucene 4

 Bits liveDocs = MultiFields.getLiveDocs(reader); for (int i=0; i 

Vedi LUCENE-2600 in questa pagina per i dettagli: https://lucene.apache.org/core/4_0_0/MIGRATE.html

Esiste una class di query denominata MatchAllDocsQuery , penso che possa essere utilizzata in questo caso:

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

I numeri di documento (o ID) saranno numeri successivi da 0 a IndexReader.maxDoc () – 1. Questi numeri non sono persistenti e sono validi solo per IndexReader aperto. È ansible verificare se il documento viene eliminato con il metodo IndexReader.isDeleted (int documentNumber)

Se usi .document (i) come negli esempi precedenti e salti i documenti cancellati fai attenzione se usi questo metodo per impaginare i risultati. es .: hai un elenco di 10 documenti / per pagina e devi procurarti i documenti. per pagina 6. Il tuo input potrebbe essere qualcosa del tipo: offset = 60, count = 10 (documenti da 60 a 70).

  IndexReader reader = // create IndexReader for (int i=offset; i 

Avrai alcuni problemi con quelli cancellati perché non dovresti iniziare da offset = 60, ma da offset = 60 + il numero di documenti cancellati che appaiono prima di 60.

Un'alternativa che ho trovato è qualcosa del genere:

  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: sostituisci il testo tra [[]] con i propri valori. Ha funzionato su un grande indice con 1,5 milioni di voci e ottenuto 10 risultati casuali in meno di un secondo. Accetto è più lento ma almeno puoi ignorare i documenti cancellati se hai bisogno di paginazione.