2010-04-06 20 views
14

Używam Lucene na terenie kopalni i chcę pokazać całkowitą liczbę wyników z zapytania, na przykład:Jak uzyskać całkowitą liczbę potencjalnych wyników w Lucene

Pokaż wyniki x do y z oo

Ale nie mogę znaleźć żadnego sposobu, który zwróci mi całkowitą liczbę potencjalnych wyników. Mogę tylko wydawać się znaleźć metody, które musisz określić liczbę wyników, które chcesz, a ponieważ chcę tylko 10 na stronę, wydaje się logiczne, aby przekazać 10 jako liczbę wyników.

Czy robię to źle, czy powinienem przejść w powiedzeniu 1000, a następnie po prostu wziąć 10 w zakresie, który wymagam?

Odpowiedz

15

BTW, ponieważ znam cię osobiście powinien wskazywać dla innych już wiedziałem, że masz na myśli Lucene.net, a nie Lucene :) chociaż API będzie taki sam,

W wersjach wcześniejszych niż 2.9.x możesz zadzwonić pod numer IndexSearcher.Search(Query query, Filter filter), który powraca d a Hits przedmiot, z których jedna Właściwości [metody, pod względem technicznym, ze względu na port Java] był Length()

To jest teraz oznaczone Zbędny, gdyż zostanie on usunięty w wersji 3.0, tylko wyniki wyszukiwania zwracają TopDocs lub TopFieldDocs obiektów.

Twoje alternatywy są

a) Wykorzystanie IndexServer.Search(Query query, int count) który zwróci TopDocs obiektu, więc TopDocs.TotalHits pokaże wszystkich możliwych trafień ale kosztem faktycznie tworzenia <count> wyniki

b) szybszy sposób jest aby zaimplementować własny obiekt Collector (dziedziczy po Lucene.Net.Search.Collector) i wywołać IndexSearcher.Search(Query query, Collector collector). Podczas każdego meczu metoda wyszukiwania wywoła na twoim kolektorze Collect(int docId), więc jeśli wewnętrznie będziesz śledzić, masz możliwość zebrania wszystkich wyników.

Należy zauważyć, że Lucene nie jest kompletnym środowiskiem zapytań o zestaw wyników i jest tak zaprojektowany, aby możliwie najszybciej przekazywać Ci najbardziej odpowiednie wyniki (programista). Każda metoda, która daje "całkowitą liczbę wyników" jest po prostu opakowaniem wyliczającym wszystkie dopasowania (jak w przypadku metody Collector).

Sztuką jest utrzymanie tego wyliczenia tak szybko, jak to możliwe. Najdroższą częścią jest deserializacja dokumentów z indeksu, wypełnianie każdego pola itp. Przynajmniej nowszym projektem API, wymagającym napisania własnego Collectora, zasada jest jasna, mówiąc deweloperowi, aby unikał deserializacji każdego wyniku z indeksu ponieważ tylko zgodne identyfikatory dokumentu i wynik są domyślnie dostarczane.

+0

-1 za niekompletną odpowiedź (doceniam, że ktoś ci pomógł), ale gdzie jest "IndexServer"? – Dementic

+0

@Dementic odwołanie do 'IndexServer' jest literówka, powinno to być' IndexSearcher' we wszystkich przypadkach. –

9

Górny docs kolektor robi to za ciebie, na przykład

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

Powyższe zapytanie policzyć wszystkie hity, ale zwraca tylko 10.

Powiązane problemy