Миграция с Hit / Hits на TopDocs / TopDocCollector - PullRequest
13 голосов
/ 10 июня 2009

У меня есть код, похожий на:

final Term t = /* ... */;
final Iterator i = searcher.search( new TermQuery( t ) ).iterator();
while ( i.hasNext() ) {
    Hit hit = (Hit)i.next();
    // "FILE" is the field that recorded the original file indexed
    File f = new File( hit.get( "FILE" ) );
    // ...
}

Мне не понятно, как переписать код с помощью TopDocs / TopDocCollector и как перебрать все результаты.

1 Ответ

24 голосов
/ 10 июня 2009

По сути, вы должны принять решение об ограничении количества ожидаемых результатов. Затем вы перебираете все ScoreDoc s в полученном TopDocs.

final MAX_RESULTS = 10000;
final Term t = /* ... */;
final TopDocs topDocs = searcher.search( new TermQuery( t ), MAX_RESULTS );
for ( ScoreDoc scoreDoc : topDocs.scoreDocs ) {
    Document doc = searcher.doc( scoreDoc.doc )
    // "FILE" is the field that recorded the original file indexed
    File f = new File( doc.get( "FILE" ) );
    // ...
}

Это в основном то, что делает класс Hits, только он устанавливает ограничение на 50 результатов, и если вы повторяете его, поиск повторяется, что обычно расточительно. Вот почему это устарело.

ДОБАВЛЕНО : Если нет ограничения на количество результатов, вы должны использовать HitCollector:

final Term t = /* ... */;
final ArrayList<Integer> docs = new ArrayList<Integer>();
searcher.search( new TermQuery( t ), new HitCollector() {
    public void collect(int doc, float score) {
        docs.add(doc);
    }
});

for(Integer docid : docs) {
    Document doc = searcher.doc(docid);
    // "FILE" is the field that recorded the original file indexed
    File f = new File( doc.get( "FILE" ) );
    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...