Methods Summary |
---|
private final void | addToFront(org.apache.lucene.search.HitDoc hitDoc) // insert at front of cache
if (first == null) {
last = hitDoc;
} else {
first.prev = hitDoc;
}
hitDoc.next = first;
first = hitDoc;
hitDoc.prev = null;
numDocs++;
|
public final org.apache.lucene.document.Document | doc(int n)Returns the stored fields of the nth document in this set.
Documents are cached, so that repeated requests for the same element may
return the same Document object.
HitDoc hitDoc = hitDoc(n);
// Update LRU cache of documents
remove(hitDoc); // remove from list, if there
addToFront(hitDoc); // add to front of list
if (numDocs > maxDocs) { // if cache is full
HitDoc oldLast = last;
remove(last); // flush last
oldLast.doc = null; // let doc get gc'd
}
if (hitDoc.doc == null) {
hitDoc.doc = searcher.doc(hitDoc.id); // cache miss: read document
}
return hitDoc.doc;
|
private final void | getMoreDocs(int min)Tries to add new documents to hitDocs.
Ensures that the hit numbered min has been retrieved.
if (hitDocs.size() > min) {
min = hitDocs.size();
}
int n = min * 2; // double # retrieved
TopDocs topDocs = (sort == null) ? searcher.search(query, filter, n) : searcher.search(query, filter, n, sort);
length = topDocs.totalHits;
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
float scoreNorm = 1.0f;
if (length > 0 && scoreDocs[0].score > 1.0f) {
scoreNorm = 1.0f / scoreDocs[0].score;
}
int end = scoreDocs.length < length ? scoreDocs.length : length;
for (int i = hitDocs.size(); i < end; i++) {
hitDocs.addElement(new HitDoc(scoreDocs[i].score * scoreNorm,
scoreDocs[i].doc));
}
|
private final org.apache.lucene.search.HitDoc | hitDoc(int n)
if (n >= length) {
throw new IndexOutOfBoundsException("Not a valid hit number: " + n);
}
if (n >= hitDocs.size()) {
getMoreDocs(n);
}
return (HitDoc) hitDocs.elementAt(n);
|
public final int | id(int n)Returns the id for the nth document in this set.
return hitDoc(n).id;
|
public final int | length()Returns the total number of hits available in this set.
return length;
|
private final void | remove(org.apache.lucene.search.HitDoc hitDoc) // remove from cache
if (hitDoc.doc == null) { // it's not in the list
return; // abort
}
if (hitDoc.next == null) {
last = hitDoc.prev;
} else {
hitDoc.next.prev = hitDoc.prev;
}
if (hitDoc.prev == null) {
first = hitDoc.next;
} else {
hitDoc.prev.next = hitDoc.next;
}
numDocs--;
|
public final float | score(int n)Returns the score for the nth document in this set.
return hitDoc(n).score;
|