2010-04-06 5 views
14

sto usando Lucene su un sito di mio e voglio mostrare il conteggio totale risultato di una query, ad esempio:Come ottenere il numero totale di risultati possibili in Lucene

Risultati x a y di z

Ma io non riesco a trovare alcun metodo che mi restituirà il numero totale di potenziali risultati. Posso solo sembrare di trovare metodi che devi specificare il numero di risultati che vuoi, e dal momento che voglio solo 10 per pagina sembra logico passare in 10 come numero di risultati.

O sto sbagliando, dovrei passare a dire 1000 e poi solo prendendo il 10 nell'intervallo che mi serve?

risposta

15

BTW, da quando ti conosco personalmente Tengo a precisare per gli altri sapevo già che ti riferivi a Lucene.net e non a Lucene :) anche se l'API sarebbe la stessa

Nelle versioni precedenti a 2.9.x puoi chiamare IndexSearcher.Search(Query query, Filter filter) che restituisce d un Hits oggetto, di cui una proprietà [metodi, tecnicamente, dovuto alla porta Java] era Length()

Questa è contrassegnato Obsoleto quanto verrà rimossa a 3.0, i soli risultati di ricerca ritorno TopDocs o TopFieldDocs oggetti.

Le alternative sono

a) Utilizzare IndexServer.Search(Query query, int count) che restituirà un oggetto TopDocs, così TopDocs.TotalHits vi mostrerà il totale colpi possibili, ma a scapito di realtà la creazione <count> risultati

b) Un modo più veloce è per implementare il proprio oggetto Collector (ereditato da Lucene.Net.Search.Collector) e chiamare IndexSearcher.Search(Query query, Collector collector). Il metodo di ricerca chiamerà il numero Collect(int docId) sul tuo raccoglitore ad ogni incontro, quindi se internamente tieni traccia di ciò hai un modo per ottenere tutti i risultati.

Si noti che Lucene non è un ambiente di query con set di risultati totali ed è progettato per trasmettere i risultati più pertinenti all'utente (lo sviluppatore) il più rapidamente possibile. Qualsiasi metodo che fornisce un conteggio "risultati totali" è solo un wrapper che enumera su tutte le corrispondenze (come con il metodo Collector).

Il trucco è mantenere questa enumerazione il più velocemente possibile. La parte più costosa è la deserializzazione di Documenti dall'indice, la compilazione di ogni campo ecc. Almeno con la nuova progettazione dell'API, che richiede di scrivere il proprio Collector, il principio è chiarito dicendo allo sviluppatore di evitare di deserializzare ogni risultato dall'indice poiché sono forniti solo ID documento e punteggio corrispondenti.

+0

-1 per risposta incompleta (apprezzo il tuo aiuto a qualcuno), ma dov'è il 'IndexServer'? – Dementic

+0

@Dementic il riferimento 'IndexServer' è un refuso, dovrebbe essere' IndexSearcher' in tutti i casi. –

9

La parte superiore docs collettore lo fa per voi, per esempio

TopDocs topDocs = searcher.search(qry, 10); 
int totalHits = topDocs.totalHits ; 

La query sopra conterà tutti i colpi, ma solo tornare 10.