Sono d'accordo con la soluzione spiegata da Jaimie. Ma voglio sottolineare un altro aspetto di cui devi essere consapevole e che aiuta a capire il meccanismo generale di un motore di ricerca.
Con il TopDocCollector è possibile definire la quantità di visite che si desidera raccogliere in base alla query di ricerca, prima che il risultato sia ordinato per punteggio o altri criteri di ordinamento.
vedere l'esempio seguente:
collector = TopScoreDocCollector.create(9999, true);
searcher.search(parser.parse("Clone Warrior"), collector);
// get first page
topDocs = collector.topDocs(0, 10);
int resultSize=topDocs.scoreDocs.length; // 10 or less
int totalHits=topDocs.totalHits; // 9999 or less
Raccontiamo Lucene qui per raccogliere un massimo di 9999 documenti contenenti la frase di ricerca 'clone Warrior'. Ciò significa che se l'indice contiene più di 9999 documenti contenenti questa frase di ricerca, il raccoglitore si fermerà dopo essere stato riempito con 9999 visite!
Ciò significa che, quanto più grande si sceglie il MAX_RESULTS come meglio diventa il risultato della ricerca. Ma questo è rilevante solo se ti aspetti un gran numero di hit. D'altra parte, se si cerca "Luke Skywalker" e si aspetta un solo colpo, che il MAX_RESULTS può anche essere impostato a 1.
Quindi cambiare le MAX_RESULTS possono influenzare le scoreDocs restituiti come verrà eseguita l'ordinamento sui colpi raccolti. È praticamente possibile impostare MAX_RESULTS su una dimensione sufficientemente grande in modo che l'utente umano non possa discutere di perdere un documento specifico. Questo concetto è totalmente contrario al comportamento di un database SQL, che considera sempre il pool di dati completo.
Ma lucene supporta anche un altro meccanismo. È possibile, invece di definire MAX_RESULTS per il raccoglitore, in alternativa definire la quantità di tempo che si desidera attendere per il set di risultati. Ad esempio, è possibile definire che si desidera sempre interrompere il raccoglitore dopo 300 ms. Questo è un buon approccio per proteggere la tua applicazione per problemi di prestazioni. Ma se vuoi essere sicuro di contare tutti i documenti rilevanti di quello che devi impostare il parametro per MAX_RESULTS o il tempo di attesa massimo su un valore infinito.
Ciao, puoi spiegare l'impaginazione in lucene 4.x e anche io di fronte allo stesso problema .. –
Sto usando l'approccio discusso nel 3 ° paragrafo sopra. Funziona abbastanza bene tranne che per il paging molto profondo (nessuna sorpresa). – hudsonb