You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by mi...@apache.org on 2011/03/01 23:24:03 UTC
svn commit: r1076035 - in /lucene/dev/branches/branch_3x: ./ lucene/
lucene/src/java/org/apache/lucene/search/IndexSearcher.java
lucene/src/test/org/apache/lucene/search/TestSort.java solr/
Author: mikemccand
Date: Tue Mar 1 22:24:03 2011
New Revision: 1076035
URL: http://svn.apache.org/viewvc?rev=1076035&view=rev
Log:
LUCENE-2941: FieldComparator should do all sorting, even when ES is used in IS
Modified:
lucene/dev/branches/branch_3x/ (props changed)
lucene/dev/branches/branch_3x/lucene/ (props changed)
lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/IndexSearcher.java
lucene/dev/branches/branch_3x/lucene/src/test/org/apache/lucene/search/TestSort.java
lucene/dev/branches/branch_3x/solr/ (props changed)
Modified: lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/IndexSearcher.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/IndexSearcher.java?rev=1076035&r1=1076034&r2=1076035&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/IndexSearcher.java (original)
+++ lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/IndexSearcher.java Tue Mar 1 22:24:03 2011
@@ -456,13 +456,17 @@ public class IndexSearcher extends Searc
search(weight, filter, collector);
return (TopFieldDocs) collector.topDocs();
} else {
- // TODO: make this respect fillFields
- final FieldDocSortedHitQueue hq = new FieldDocSortedHitQueue(nDocs);
+ final TopFieldCollector topCollector = TopFieldCollector.create(sort, nDocs,
+ fillFields,
+ fieldSortDoTrackScores,
+ fieldSortDoMaxScore,
+ false);
+
final Lock lock = new ReentrantLock();
final ExecutionHelper<TopFieldDocs> runner = new ExecutionHelper<TopFieldDocs>(executor);
for (int i = 0; i < subReaders.length; i++) { // search each sub
runner.submit(
- new MultiSearcherCallableWithSort(lock, subSearchers[i], weight, filter, nDocs, hq, sort, i, docStarts));
+ new MultiSearcherCallableWithSort(lock, subSearchers[i], weight, filter, nDocs, topCollector, sort, i, docStarts));
}
int totalHits = 0;
float maxScore = Float.NEGATIVE_INFINITY;
@@ -472,11 +476,10 @@ public class IndexSearcher extends Searc
maxScore = Math.max(maxScore, topFieldDocs.getMaxScore());
}
}
- final ScoreDoc[] scoreDocs = new ScoreDoc[hq.size()];
- for (int i = hq.size() - 1; i >= 0; i--) // put docs in array
- scoreDocs[i] = hq.pop();
- return new TopFieldDocs(totalHits, scoreDocs, hq.getFields(), maxScore);
+ final TopFieldDocs topDocs = (TopFieldDocs) topCollector.topDocs();
+
+ return new TopFieldDocs(totalHits, topDocs.scoreDocs, topDocs.fields, topDocs.getMaxScore());
}
}
@@ -707,12 +710,12 @@ public class IndexSearcher extends Searc
private final Filter filter;
private final int nDocs;
private final int i;
- private final FieldDocSortedHitQueue hq;
+ private final TopFieldCollector hq;
private final int[] starts;
private final Sort sort;
public MultiSearcherCallableWithSort(Lock lock, IndexSearcher searchable, Weight weight,
- Filter filter, int nDocs, FieldDocSortedHitQueue hq, Sort sort, int i, int[] starts) {
+ Filter filter, int nDocs, TopFieldCollector hq, Sort sort, int i, int[] starts) {
this.lock = lock;
this.searchable = searchable;
this.weight = weight;
@@ -724,6 +727,42 @@ public class IndexSearcher extends Searc
this.sort = sort;
}
+ private final class FakeScorer extends Scorer {
+ float score;
+ int doc;
+
+ public FakeScorer() {
+ super(null, null);
+ }
+
+ @Override
+ public int advance(int target) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public int docID() {
+ return doc;
+ }
+
+ @Override
+ public float freq() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public int nextDoc() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public float score() {
+ return score;
+ }
+ }
+
+ private final FakeScorer fakeScorer = new FakeScorer();
+
public TopFieldDocs call() throws IOException {
final TopFieldDocs docs = searchable.search (weight, filter, nDocs, sort);
// If one of the Sort fields is FIELD_DOC, need to fix its values, so that
@@ -742,24 +781,16 @@ public class IndexSearcher extends Searc
lock.lock();
try {
- hq.setFields(docs.fields);
+ hq.setNextReader(searchable.getIndexReader(), starts[i]);
+ hq.setScorer(fakeScorer);
+ for(ScoreDoc scoreDoc : docs.scoreDocs) {
+ fakeScorer.doc = scoreDoc.doc;
+ fakeScorer.score = scoreDoc.score;
+ hq.collect(scoreDoc.doc);
+ }
} finally {
lock.unlock();
}
-
- final ScoreDoc[] scoreDocs = docs.scoreDocs;
- for (int j = 0; j < scoreDocs.length; j++) { // merge scoreDocs into hq
- final FieldDoc fieldDoc = (FieldDoc) scoreDocs[j];
- fieldDoc.doc += starts[i]; // convert doc
- //it would be so nice if we had a thread-safe insert
- lock.lock();
- try {
- if (fieldDoc == hq.insertWithOverflow(fieldDoc))
- break;
- } finally {
- lock.unlock();
- }
- }
return docs;
}
}
Modified: lucene/dev/branches/branch_3x/lucene/src/test/org/apache/lucene/search/TestSort.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/src/test/org/apache/lucene/search/TestSort.java?rev=1076035&r1=1076034&r2=1076035&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/src/test/org/apache/lucene/search/TestSort.java (original)
+++ lucene/dev/branches/branch_3x/lucene/src/test/org/apache/lucene/search/TestSort.java Tue Mar 1 22:24:03 2011
@@ -451,13 +451,15 @@ public class TestSort extends LuceneTest
bottomValue = slotValues[bottom];
}
+ private static final FieldCache.IntParser testIntParser = new FieldCache.IntParser() {
+ public final int parseInt(final String val) {
+ return (val.charAt(0)-'A') * 123456;
+ }
+ };
+
@Override
public void setNextReader(IndexReader reader, int docBase) throws IOException {
- docValues = FieldCache.DEFAULT.getInts(reader, "parser", new FieldCache.IntParser() {
- public final int parseInt(final String val) {
- return (val.charAt(0)-'A') * 123456;
- }
- });
+ docValues = FieldCache.DEFAULT.getInts(reader, "parser", testIntParser);
}
@Override