You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by jp...@apache.org on 2015/01/15 11:19:30 UTC
svn commit: r1652034 [1/3] - in /lucene/dev/branches/lucene_solr_5_0: ./
lucene/ lucene/benchmark/
lucene/benchmark/src/java/org/apache/lucene/benchmark/byTask/tasks/
lucene/core/ lucene/core/src/java/org/apache/lucene/search/
lucene/core/src/test/org/...
Author: jpountz
Date: Thu Jan 15 10:19:28 2015
New Revision: 1652034
URL: http://svn.apache.org/r1652034
Log:
LUCENE-6179: Disallow out-of-order scoring.
Added:
lucene/dev/branches/lucene_solr_5_0/lucene/join/src/java/org/apache/lucene/search/join/ToParentBlockJoinIndexSearcher.java
- copied unchanged from r1652027, lucene/dev/branches/branch_5x/lucene/join/src/java/org/apache/lucene/search/join/ToParentBlockJoinIndexSearcher.java
lucene/dev/branches/lucene_solr_5_0/lucene/test-framework/src/java/org/apache/lucene/search/AssertingLeafCollector.java
- copied unchanged from r1652027, lucene/dev/branches/branch_5x/lucene/test-framework/src/java/org/apache/lucene/search/AssertingLeafCollector.java
Removed:
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/search/TestBooleanUnevenly.java
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/search/TestTopScoreDocCollector.java
lucene/dev/branches/lucene_solr_5_0/lucene/test-framework/src/java/org/apache/lucene/search/AssertingBulkOutOfOrderScorer.java
lucene/dev/branches/lucene_solr_5_0/lucene/test-framework/src/java/org/apache/lucene/search/AssertingCollector.java
lucene/dev/branches/lucene_solr_5_0/lucene/test-framework/src/java/org/apache/lucene/search/RandomOrderCollector.java
Modified:
lucene/dev/branches/lucene_solr_5_0/ (props changed)
lucene/dev/branches/lucene_solr_5_0/lucene/ (props changed)
lucene/dev/branches/lucene_solr_5_0/lucene/CHANGES.txt (contents, props changed)
lucene/dev/branches/lucene_solr_5_0/lucene/MIGRATE.txt (contents, props changed)
lucene/dev/branches/lucene_solr_5_0/lucene/benchmark/ (props changed)
lucene/dev/branches/lucene_solr_5_0/lucene/benchmark/src/java/org/apache/lucene/benchmark/byTask/tasks/ReadTask.java
lucene/dev/branches/lucene_solr_5_0/lucene/benchmark/src/java/org/apache/lucene/benchmark/byTask/tasks/SearchWithCollectorTask.java
lucene/dev/branches/lucene_solr_5_0/lucene/core/ (props changed)
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/BooleanQuery.java
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/BooleanScorer.java
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/CachingCollector.java
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/ConstantScoreQuery.java
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/FilterLeafCollector.java
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/FilteredQuery.java
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/IndexSearcher.java
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/LeafCollector.java
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/MultiCollector.java
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/SimpleCollector.java
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/SortRescorer.java
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/TopFieldCollector.java
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/TopScoreDocCollector.java
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/TotalHitCountCollector.java
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/Weight.java
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/package.html
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/index/TestOmitTf.java
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/search/JustCompileSearch.java
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/search/MultiCollectorTest.java
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/search/TestBoolean2.java
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/search/TestBooleanCoord.java
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/search/TestBooleanMinShouldMatch.java
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/search/TestBooleanOr.java
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/search/TestBooleanQuery.java
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/search/TestBooleanQueryVisitSubscorers.java
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/search/TestBooleanScorer.java
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/search/TestCachingCollector.java
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/search/TestConstantScoreQuery.java
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/search/TestDisjunctionMaxQuery.java
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/search/TestDocBoost.java
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/search/TestEarlyTermination.java
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/search/TestElevationComparator.java
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/search/TestMultiTermConstantScore.java
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/search/TestPositiveScoresOnlyCollector.java
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/search/TestScoreCachingWrappingScorer.java
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/search/TestScorerPerf.java
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/search/TestSimilarity.java
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/search/TestSloppyPhraseQuery.java
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/search/TestSubScorerFreqs.java
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/search/TestTermScorer.java
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/search/TestTimeLimitingCollector.java
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/search/TestTopDocsCollector.java
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/search/TestTopDocsMerge.java
lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/search/TestTopFieldCollector.java (contents, props changed)
lucene/dev/branches/lucene_solr_5_0/lucene/facet/ (props changed)
lucene/dev/branches/lucene_solr_5_0/lucene/facet/src/java/org/apache/lucene/facet/DrillSideways.java
lucene/dev/branches/lucene_solr_5_0/lucene/facet/src/java/org/apache/lucene/facet/DrillSidewaysQuery.java
lucene/dev/branches/lucene_solr_5_0/lucene/facet/src/java/org/apache/lucene/facet/FacetsCollector.java
lucene/dev/branches/lucene_solr_5_0/lucene/facet/src/test/org/apache/lucene/facet/AssertingSubDocsAtOnceCollector.java
lucene/dev/branches/lucene_solr_5_0/lucene/facet/src/test/org/apache/lucene/facet/TestDrillSideways.java
lucene/dev/branches/lucene_solr_5_0/lucene/grouping/ (props changed)
lucene/dev/branches/lucene_solr_5_0/lucene/grouping/src/java/org/apache/lucene/search/grouping/AbstractAllGroupHeadsCollector.java
lucene/dev/branches/lucene_solr_5_0/lucene/grouping/src/java/org/apache/lucene/search/grouping/AbstractAllGroupsCollector.java
lucene/dev/branches/lucene_solr_5_0/lucene/grouping/src/java/org/apache/lucene/search/grouping/AbstractDistinctValuesCollector.java
lucene/dev/branches/lucene_solr_5_0/lucene/grouping/src/java/org/apache/lucene/search/grouping/AbstractFirstPassGroupingCollector.java
lucene/dev/branches/lucene_solr_5_0/lucene/grouping/src/java/org/apache/lucene/search/grouping/AbstractGroupFacetCollector.java
lucene/dev/branches/lucene_solr_5_0/lucene/grouping/src/java/org/apache/lucene/search/grouping/AbstractSecondPassGroupingCollector.java
lucene/dev/branches/lucene_solr_5_0/lucene/grouping/src/java/org/apache/lucene/search/grouping/BlockGroupingCollector.java
lucene/dev/branches/lucene_solr_5_0/lucene/grouping/src/test/org/apache/lucene/search/grouping/TestGrouping.java
lucene/dev/branches/lucene_solr_5_0/lucene/highlighter/ (props changed)
lucene/dev/branches/lucene_solr_5_0/lucene/highlighter/src/test/org/apache/lucene/search/highlight/HighlighterPhraseTest.java
lucene/dev/branches/lucene_solr_5_0/lucene/join/ (props changed)
lucene/dev/branches/lucene_solr_5_0/lucene/join/src/java/org/apache/lucene/search/join/TermsCollector.java
lucene/dev/branches/lucene_solr_5_0/lucene/join/src/java/org/apache/lucene/search/join/TermsIncludingScoreQuery.java
lucene/dev/branches/lucene_solr_5_0/lucene/join/src/java/org/apache/lucene/search/join/TermsWithScoreCollector.java
lucene/dev/branches/lucene_solr_5_0/lucene/join/src/java/org/apache/lucene/search/join/ToChildBlockJoinQuery.java
lucene/dev/branches/lucene_solr_5_0/lucene/join/src/java/org/apache/lucene/search/join/ToParentBlockJoinCollector.java
lucene/dev/branches/lucene_solr_5_0/lucene/join/src/java/org/apache/lucene/search/join/ToParentBlockJoinQuery.java
lucene/dev/branches/lucene_solr_5_0/lucene/join/src/test/org/apache/lucene/search/join/TestBlockJoin.java
lucene/dev/branches/lucene_solr_5_0/lucene/join/src/test/org/apache/lucene/search/join/TestJoinUtil.java
lucene/dev/branches/lucene_solr_5_0/lucene/memory/ (props changed)
lucene/dev/branches/lucene_solr_5_0/lucene/memory/src/java/org/apache/lucene/index/memory/MemoryIndex.java
lucene/dev/branches/lucene_solr_5_0/lucene/misc/ (props changed)
lucene/dev/branches/lucene_solr_5_0/lucene/misc/src/java/org/apache/lucene/search/EarlyTerminatingSortingCollector.java
lucene/dev/branches/lucene_solr_5_0/lucene/misc/src/test/org/apache/lucene/search/TestEarlyTerminatingSortingCollector.java
lucene/dev/branches/lucene_solr_5_0/lucene/queries/ (props changed)
lucene/dev/branches/lucene_solr_5_0/lucene/queries/src/java/org/apache/lucene/queries/CustomScoreQuery.java
lucene/dev/branches/lucene_solr_5_0/lucene/queryparser/ (props changed)
lucene/dev/branches/lucene_solr_5_0/lucene/queryparser/src/test/org/apache/lucene/queryparser/surround/query/BooleanQueryTst.java
lucene/dev/branches/lucene_solr_5_0/lucene/sandbox/ (props changed)
lucene/dev/branches/lucene_solr_5_0/lucene/sandbox/src/test/org/apache/lucene/search/TestTermAutomatonQuery.java
lucene/dev/branches/lucene_solr_5_0/lucene/suggest/ (props changed)
lucene/dev/branches/lucene_solr_5_0/lucene/suggest/src/java/org/apache/lucene/search/suggest/analyzing/AnalyzingInfixSuggester.java
lucene/dev/branches/lucene_solr_5_0/lucene/test-framework/ (props changed)
lucene/dev/branches/lucene_solr_5_0/lucene/test-framework/src/java/org/apache/lucene/search/AssertingBulkScorer.java
lucene/dev/branches/lucene_solr_5_0/lucene/test-framework/src/java/org/apache/lucene/search/AssertingWeight.java
lucene/dev/branches/lucene_solr_5_0/lucene/test-framework/src/java/org/apache/lucene/search/CheckHits.java
lucene/dev/branches/lucene_solr_5_0/lucene/test-framework/src/java/org/apache/lucene/search/QueryUtils.java
lucene/dev/branches/lucene_solr_5_0/solr/ (props changed)
lucene/dev/branches/lucene_solr_5_0/solr/contrib/ (props changed)
lucene/dev/branches/lucene_solr_5_0/solr/contrib/analytics/src/java/org/apache/solr/analytics/accumulator/ValueAccumulator.java
lucene/dev/branches/lucene_solr_5_0/solr/core/ (props changed)
lucene/dev/branches/lucene_solr_5_0/solr/core/src/java/org/apache/solr/handler/component/ExpandComponent.java
lucene/dev/branches/lucene_solr_5_0/solr/core/src/java/org/apache/solr/search/CollapsingQParserPlugin.java
lucene/dev/branches/lucene_solr_5_0/solr/core/src/java/org/apache/solr/search/DelegatingCollector.java
lucene/dev/branches/lucene_solr_5_0/solr/core/src/java/org/apache/solr/search/DocSetCollector.java
lucene/dev/branches/lucene_solr_5_0/solr/core/src/java/org/apache/solr/search/EarlyTerminatingCollector.java
lucene/dev/branches/lucene_solr_5_0/solr/core/src/java/org/apache/solr/search/ExportQParserPlugin.java
lucene/dev/branches/lucene_solr_5_0/solr/core/src/java/org/apache/solr/search/Grouping.java
lucene/dev/branches/lucene_solr_5_0/solr/core/src/java/org/apache/solr/search/ReRankQParserPlugin.java
lucene/dev/branches/lucene_solr_5_0/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java
lucene/dev/branches/lucene_solr_5_0/solr/core/src/java/org/apache/solr/search/grouping/distributed/command/QueryCommand.java
lucene/dev/branches/lucene_solr_5_0/solr/core/src/test/org/apache/solr/search/TestRankQueryPlugin.java
lucene/dev/branches/lucene_solr_5_0/solr/core/src/test/org/apache/solr/search/TestSort.java
Modified: lucene/dev/branches/lucene_solr_5_0/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_5_0/lucene/CHANGES.txt?rev=1652034&r1=1652033&r2=1652034&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_5_0/lucene/CHANGES.txt (original)
+++ lucene/dev/branches/lucene_solr_5_0/lucene/CHANGES.txt Thu Jan 15 10:19:28 2015
@@ -332,6 +332,10 @@ API Changes
* LUCENE-6158, LUCENE-6165: IndexWriter.addIndexes(IndexReader...) changed to
addIndexes(CodecReader...) (Robert Muir)
+* LUCENE-6179: Out-of-order scoring is not allowed anymore, so
+ Weight.scoresDocsOutOfOrder and LeafCollector.acceptsDocsOutOfOrder have been
+ removed and boolean queries now always score in order.
+
Bug Fixes
* LUCENE-5650: Enforce read-only access to any path outside the temporary
Modified: lucene/dev/branches/lucene_solr_5_0/lucene/MIGRATE.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_5_0/lucene/MIGRATE.txt?rev=1652034&r1=1652033&r2=1652034&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_5_0/lucene/MIGRATE.txt (original)
+++ lucene/dev/branches/lucene_solr_5_0/lucene/MIGRATE.txt Thu Jan 15 10:19:28 2015
@@ -87,3 +87,9 @@ their ValueSources in a "DefFunction" al
PayloadAttributeImpl.clone() did a shallow clone which was incorrect, and was
fixed to do a deep clone. If you require shallow cloning of the underlying bytes,
you should override PayloadAttributeImpl.clone() to do a shallow clone instead.
+
+## Removed out-of-order scoring (LUCENE-6179)
+
+Bulk scorers must now always collect documents in order. If you have custom
+collectors, the acceptsDocsOutOfOrder method has been removed and collectors
+can safely assume that they will be collected in order.
Modified: lucene/dev/branches/lucene_solr_5_0/lucene/benchmark/src/java/org/apache/lucene/benchmark/byTask/tasks/ReadTask.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_5_0/lucene/benchmark/src/java/org/apache/lucene/benchmark/byTask/tasks/ReadTask.java?rev=1652034&r1=1652033&r2=1652034&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_5_0/lucene/benchmark/src/java/org/apache/lucene/benchmark/byTask/tasks/ReadTask.java (original)
+++ lucene/dev/branches/lucene_solr_5_0/lucene/benchmark/src/java/org/apache/lucene/benchmark/byTask/tasks/ReadTask.java Thu Jan 15 10:19:28 2015
@@ -122,8 +122,7 @@ public abstract class ReadTask extends P
// pulling the Weight ourselves:
TopFieldCollector collector = TopFieldCollector.create(sort, numHits,
true, withScore(),
- withMaxScore(),
- false);
+ withMaxScore());
searcher.search(q, null, collector);
hits = collector.topDocs();
} else {
@@ -189,7 +188,7 @@ public abstract class ReadTask extends P
}
protected Collector createCollector() throws Exception {
- return TopScoreDocCollector.create(numHits(), true);
+ return TopScoreDocCollector.create(numHits());
}
Modified: lucene/dev/branches/lucene_solr_5_0/lucene/benchmark/src/java/org/apache/lucene/benchmark/byTask/tasks/SearchWithCollectorTask.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_5_0/lucene/benchmark/src/java/org/apache/lucene/benchmark/byTask/tasks/SearchWithCollectorTask.java?rev=1652034&r1=1652033&r2=1652034&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_5_0/lucene/benchmark/src/java/org/apache/lucene/benchmark/byTask/tasks/SearchWithCollectorTask.java (original)
+++ lucene/dev/branches/lucene_solr_5_0/lucene/benchmark/src/java/org/apache/lucene/benchmark/byTask/tasks/SearchWithCollectorTask.java Thu Jan 15 10:19:28 2015
@@ -52,10 +52,8 @@ public class SearchWithCollectorTask ext
@Override
protected Collector createCollector() throws Exception {
Collector collector = null;
- if (clnName.equalsIgnoreCase("topScoreDocOrdered") == true) {
- collector = TopScoreDocCollector.create(numHits(), true);
- } else if (clnName.equalsIgnoreCase("topScoreDocUnOrdered") == true) {
- collector = TopScoreDocCollector.create(numHits(), false);
+ if (clnName.equalsIgnoreCase("topScoreDoc") == true) {
+ collector = TopScoreDocCollector.create(numHits());
} else if (clnName.length() > 0){
collector = Class.forName(clnName).asSubclass(Collector.class).newInstance();
Modified: lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/BooleanQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/BooleanQuery.java?rev=1652034&r1=1652033&r2=1652034&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/BooleanQuery.java (original)
+++ lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/BooleanQuery.java Thu Jan 15 10:19:28 2015
@@ -24,8 +24,8 @@ import java.util.Iterator;
import java.util.List;
import java.util.Set;
-import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.BooleanClause.Occur;
import org.apache.lucene.search.similarities.Similarity;
@@ -305,21 +305,19 @@ public class BooleanQuery extends Query
}
@Override
- public BulkScorer bulkScorer(LeafReaderContext context, boolean scoreDocsInOrder,
- Bits acceptDocs) throws IOException {
+ public BulkScorer bulkScorer(LeafReaderContext context, Bits acceptDocs) throws IOException {
- if (scoreDocsInOrder || minNrShouldMatch > 1) {
+ if (minNrShouldMatch > 1) {
// TODO: (LUCENE-4872) in some cases BooleanScorer may be faster for minNrShouldMatch
// but the same is even true of pure conjunctions...
- return super.bulkScorer(context, scoreDocsInOrder, acceptDocs);
+ return super.bulkScorer(context, acceptDocs);
}
- List<BulkScorer> prohibited = new ArrayList<BulkScorer>();
List<BulkScorer> optional = new ArrayList<BulkScorer>();
Iterator<BooleanClause> cIter = clauses.iterator();
for (Weight w : weights) {
BooleanClause c = cIter.next();
- BulkScorer subScorer = w.bulkScorer(context, false, acceptDocs);
+ BulkScorer subScorer = w.bulkScorer(context, acceptDocs);
if (subScorer == null) {
if (c.isRequired()) {
return null;
@@ -328,16 +326,20 @@ public class BooleanQuery extends Query
// TODO: there are some cases where BooleanScorer
// would handle conjunctions faster than
// BooleanScorer2...
- return super.bulkScorer(context, scoreDocsInOrder, acceptDocs);
+ return super.bulkScorer(context, acceptDocs);
} else if (c.isProhibited()) {
// TODO: there are some cases where BooleanScorer could do this faster
- return super.bulkScorer(context, scoreDocsInOrder, acceptDocs);
+ return super.bulkScorer(context, acceptDocs);
} else {
optional.add(subScorer);
}
}
- return new BooleanScorer(this, disableCoord, minNrShouldMatch, optional, prohibited, maxCoord);
+ if (optional.size() == 0) {
+ return null;
+ }
+
+ return new BooleanScorer(this, disableCoord, maxCoord, optional);
}
@Override
@@ -432,30 +434,6 @@ public class BooleanQuery extends Query
}
}
- @Override
- public boolean scoresDocsOutOfOrder() {
- if (minNrShouldMatch > 1) {
- // BS2 (in-order) will be used by scorer()
- return false;
- }
- int optionalCount = 0;
- for (BooleanClause c : clauses) {
- if (c.isRequired()) {
- // BS2 (in-order) will be used by scorer()
- return false;
- } else if (!c.isProhibited()) {
- optionalCount++;
- }
- }
-
- if (optionalCount == minNrShouldMatch) {
- return false; // BS2 (in-order) will be used, as this means conjunction
- }
-
- // scorer() will return an out-of-order scorer if requested.
- return true;
- }
-
private Scorer req(List<Scorer> required, boolean disableCoord) {
if (required.size() == 1) {
Scorer req = required.get(0);
Modified: lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/BooleanScorer.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/BooleanScorer.java?rev=1652034&r1=1652033&r2=1652034&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/BooleanScorer.java (original)
+++ lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/BooleanScorer.java Thu Jan 15 10:19:28 2015
@@ -18,255 +18,129 @@ package org.apache.lucene.search;
*/
import java.io.IOException;
-import java.util.List;
+import java.util.Arrays;
+import java.util.Collection;
import org.apache.lucene.search.BooleanQuery.BooleanWeight;
-/* Description from Doug Cutting (excerpted from
- * LUCENE-1483):
- *
- * BooleanScorer uses an array to score windows of
- * 2K docs. So it scores docs 0-2K first, then docs 2K-4K,
- * etc. For each window it iterates through all query terms
- * and accumulates a score in table[doc%2K]. It also stores
- * in the table a bitmask representing which terms
- * contributed to the score. Non-zero scores are chained in
- * a linked list. At the end of scoring each window it then
- * iterates through the linked list and, if the bitmask
- * matches the boolean constraints, collects a hit. For
- * boolean queries with lots of frequent terms this can be
- * much faster, since it does not need to update a priority
- * queue for each posting, instead performing constant-time
- * operations per posting. The only downside is that it
- * results in hits being delivered out-of-order within the
- * window, which means it cannot be nested within other
- * scorers. But it works well as a top-level scorer.
- *
- * The new BooleanScorer2 implementation instead works by
- * merging priority queues of postings, albeit with some
- * clever tricks. For example, a pure conjunction (all terms
- * required) does not require a priority queue. Instead it
- * sorts the posting streams at the start, then repeatedly
- * skips the first to to the last. If the first ever equals
- * the last, then there's a hit. When some terms are
- * required and some terms are optional, the conjunction can
- * be evaluated first, then the optional terms can all skip
- * to the match and be added to the score. Thus the
- * conjunction can reduce the number of priority queue
- * updates for the optional terms. */
-
+/**
+ * BulkSorer that is used for pure disjunctions: no MUST clauses and
+ * minShouldMatch == 1. This scorer scores documents by batches of 2048 docs.
+ */
final class BooleanScorer extends BulkScorer {
-
- private static final class BooleanScorerCollector extends SimpleCollector {
- private BucketTable bucketTable;
- private int mask;
- private Scorer scorer;
-
- public BooleanScorerCollector(int mask, BucketTable bucketTable) {
- this.mask = mask;
- this.bucketTable = bucketTable;
- }
-
- @Override
- public void collect(final int doc) throws IOException {
- final BucketTable table = bucketTable;
- final int i = doc & BucketTable.MASK;
- final Bucket bucket = table.buckets[i];
-
- if (bucket.doc != doc) { // invalid bucket
- bucket.doc = doc; // set doc
- bucket.score = scorer.score(); // initialize score
- bucket.bits = mask; // initialize mask
- bucket.coord = 1; // initialize coord
-
- bucket.next = table.first; // push onto valid list
- table.first = bucket;
- } else { // valid bucket
- bucket.score += scorer.score(); // increment score
- bucket.bits |= mask; // add bits in mask
- bucket.coord++; // increment coord
- }
- }
-
+
+ static final int SHIFT = 11;
+ static final int SIZE = 1 << SHIFT;
+ static final int MASK = SIZE - 1;
+ static final int SET_SIZE = 1 << (SHIFT - 6);
+ static final int SET_MASK = SET_SIZE - 1;
+
+ static class Bucket {
+ double score;
+ int freq;
+ }
+
+ final Bucket[] buckets = new Bucket[SIZE];
+ // This is basically an inlined FixedBitSet... seems to help with bound checks
+ final long[] matching = new long[SET_SIZE];
+
+ final float[] coordFactors;
+ final BulkScorer[] optionalScorers;
+ final FakeScorer fakeScorer = new FakeScorer();
+
+ boolean hasMatches;
+ int max = 0;
+
+ final class OrCollector implements LeafCollector {
+ Scorer scorer;
+
@Override
public void setScorer(Scorer scorer) {
this.scorer = scorer;
}
-
+
@Override
- public boolean acceptsDocsOutOfOrder() {
- return true;
+ public void collect(int doc) throws IOException {
+ hasMatches = true;
+ final int i = doc & MASK;
+ final int idx = i >>> 6;
+ matching[idx] |= 1L << i;
+ final Bucket bucket = buckets[i];
+ bucket.freq++;
+ bucket.score += scorer.score();
}
-
}
-
- static final class Bucket {
- int doc = -1; // tells if bucket is valid
- double score; // incremental score
- // TODO: break out bool anyProhibited, int
- // numRequiredMatched; then we can remove 32 limit on
- // required clauses
- int bits; // used for bool constraints
- int coord; // count of terms in score
- Bucket next; // next valid bucket
- }
-
- /** A simple hash table of document scores within a range. */
- static final class BucketTable {
- public static final int SIZE = 1 << 11;
- public static final int MASK = SIZE - 1;
-
- final Bucket[] buckets = new Bucket[SIZE];
- Bucket first = null; // head of valid list
-
- public BucketTable() {
- // Pre-fill to save the lazy init when collecting
- // each sub:
- for(int idx=0;idx<SIZE;idx++) {
- buckets[idx] = new Bucket();
- }
+
+ final OrCollector orCollector = new OrCollector();
+
+ BooleanScorer(BooleanWeight weight, boolean disableCoord, int maxCoord, Collection<BulkScorer> optionalScorers) {
+ for (int i = 0; i < buckets.length; i++) {
+ buckets[i] = new Bucket();
}
+ this.optionalScorers = optionalScorers.toArray(new BulkScorer[0]);
- public LeafCollector newCollector(int mask) {
- return new BooleanScorerCollector(mask, this);
+ coordFactors = new float[optionalScorers.size() + 1];
+ for (int i = 0; i < coordFactors.length; i++) {
+ coordFactors[i] = disableCoord ? 1.0f : weight.coord(i, maxCoord);
}
+ }
- public int size() { return SIZE; }
+ private void scoreDocument(LeafCollector collector, int base, int i) throws IOException {
+ final Bucket bucket = buckets[i];
+ fakeScorer.freq = bucket.freq;
+ fakeScorer.score = (float) bucket.score * coordFactors[bucket.freq];
+ final int doc = base | i;
+ fakeScorer.doc = doc;
+ collector.collect(doc);
+ bucket.freq = 0;
+ bucket.score = 0;
}
- static final class SubScorer {
- public BulkScorer scorer;
- // TODO: re-enable this if BQ ever sends us required clauses
- //public boolean required = false;
- public boolean prohibited;
- public LeafCollector collector;
- public SubScorer next;
- public boolean more;
-
- public SubScorer(BulkScorer scorer, boolean required, boolean prohibited,
- LeafCollector collector, SubScorer next) {
- if (required) {
- throw new IllegalArgumentException("this scorer cannot handle required=true");
+ private void scoreMatches(LeafCollector collector, int base) throws IOException {
+ long matching[] = this.matching;
+ for (int idx = 0; idx < matching.length; idx++) {
+ long bits = matching[idx];
+ while (bits != 0L) {
+ int ntz = Long.numberOfTrailingZeros(bits);
+ int doc = idx << 6 | ntz;
+ scoreDocument(collector, base, doc);
+ bits ^= 1L << ntz;
}
- this.scorer = scorer;
- this.more = true;
- // TODO: re-enable this if BQ ever sends us required clauses
- //this.required = required;
- this.prohibited = prohibited;
- this.collector = collector;
- this.next = next;
- }
- }
-
- private SubScorer scorers = null;
- private BucketTable bucketTable = new BucketTable();
- private final float[] coordFactors;
- // TODO: re-enable this if BQ ever sends us required clauses
- //private int requiredMask = 0;
- private final int minNrShouldMatch;
- private int end;
- private Bucket current;
- // Any time a prohibited clause matches we set bit 0:
- private static final int PROHIBITED_MASK = 1;
-
- private final Weight weight;
-
- BooleanScorer(BooleanWeight weight, boolean disableCoord, int minNrShouldMatch,
- List<BulkScorer> optionalScorers, List<BulkScorer> prohibitedScorers, int maxCoord) throws IOException {
- this.minNrShouldMatch = minNrShouldMatch;
- this.weight = weight;
+ }
+ }
+ private boolean collectMatches() throws IOException {
+ boolean more = false;
for (BulkScorer scorer : optionalScorers) {
- scorers = new SubScorer(scorer, false, false, bucketTable.newCollector(0), scorers);
- }
-
- for (BulkScorer scorer : prohibitedScorers) {
- scorers = new SubScorer(scorer, false, true, bucketTable.newCollector(PROHIBITED_MASK), scorers);
+ more |= scorer.score(orCollector, max);
}
+ return more;
+ }
- coordFactors = new float[optionalScorers.size() + 1];
- for (int i = 0; i < coordFactors.length; i++) {
- coordFactors[i] = disableCoord ? 1.0f : weight.coord(i, maxCoord);
+ private boolean scoreWindow(LeafCollector collector, int base, int max) throws IOException {
+ this.max = Math.min(base + SIZE, max);
+ hasMatches = false;
+ boolean more = collectMatches();
+
+ if (hasMatches) {
+ scoreMatches(collector, base);
+ Arrays.fill(matching, 0L);
}
+
+ return more;
}
@Override
public boolean score(LeafCollector collector, int max) throws IOException {
+ fakeScorer.doc = -1;
+ collector.setScorer(fakeScorer);
- boolean more;
- Bucket tmp;
- FakeScorer fs = new FakeScorer();
-
- // The internal loop will set the score and doc before calling collect.
- collector.setScorer(fs);
- do {
- bucketTable.first = null;
-
- while (current != null) { // more queued
-
- // check prohibited & required
- if ((current.bits & PROHIBITED_MASK) == 0) {
-
- // TODO: re-enable this if BQ ever sends us required
- // clauses
- //&& (current.bits & requiredMask) == requiredMask) {
-
- // NOTE: Lucene always passes max =
- // Integer.MAX_VALUE today, because we never embed
- // a BooleanScorer inside another (even though
- // that should work)... but in theory an outside
- // app could pass a different max so we must check
- // it:
- if (current.doc >= max) {
- tmp = current;
- current = current.next;
- tmp.next = bucketTable.first;
- bucketTable.first = tmp;
- continue;
- }
-
- if (current.coord >= minNrShouldMatch) {
- fs.score = (float) (current.score * coordFactors[current.coord]);
- fs.doc = current.doc;
- fs.freq = current.coord;
- collector.collect(current.doc);
- }
- }
-
- current = current.next; // pop the queue
+ for (int docBase = this.max & ~MASK; docBase < max; docBase += SIZE) {
+ if (scoreWindow(collector, docBase, max) == false) {
+ return false;
}
-
- if (bucketTable.first != null){
- current = bucketTable.first;
- bucketTable.first = current.next;
- return true;
- }
-
- // refill the queue
- more = false;
- end += BucketTable.SIZE;
- for (SubScorer sub = scorers; sub != null; sub = sub.next) {
- if (sub.more) {
- sub.more = sub.scorer.score(sub.collector, end);
- more |= sub.more;
- }
- }
- current = bucketTable.first;
-
- } while (current != null || more);
-
- return false;
- }
-
- @Override
- public String toString() {
- StringBuilder buffer = new StringBuilder();
- buffer.append("boolean(");
- for (SubScorer sub = scorers; sub != null; sub = sub.next) {
- buffer.append(sub.scorer.toString());
- buffer.append(" ");
}
- buffer.append(")");
- return buffer.toString();
+
+ return true;
}
}
Modified: lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/CachingCollector.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/CachingCollector.java?rev=1652034&r1=1652033&r2=1652034&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/CachingCollector.java (original)
+++ lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/CachingCollector.java Thu Jan 15 10:19:28 2015
@@ -82,7 +82,6 @@ public abstract class CachingCollector e
private static class NoScoreCachingCollector extends CachingCollector {
- List<Boolean> acceptDocsOutOfOrders;
List<LeafReaderContext> contexts;
List<int[]> docs;
int maxDocsToCache;
@@ -92,7 +91,6 @@ public abstract class CachingCollector e
super(in);
this.maxDocsToCache = maxDocsToCache;
contexts = new ArrayList<>();
- acceptDocsOutOfOrders = new ArrayList<>();
docs = new ArrayList<>();
}
@@ -105,7 +103,6 @@ public abstract class CachingCollector e
final LeafCollector in = this.in.getLeafCollector(context);
if (contexts != null) {
contexts.add(context);
- acceptDocsOutOfOrders.add(in.acceptsDocsOutOfOrder());
}
if (maxDocsToCache >= 0) {
return lastCollector = wrap(in, maxDocsToCache);
@@ -152,14 +149,7 @@ public abstract class CachingCollector e
assert docs.size() == contexts.size();
for (int i = 0; i < contexts.size(); ++i) {
final LeafReaderContext context = contexts.get(i);
- final boolean docsInOrder = !acceptDocsOutOfOrders.get(i);
final LeafCollector collector = other.getLeafCollector(context);
- if (!collector.acceptsDocsOutOfOrder() && !docsInOrder) {
- throw new IllegalArgumentException(
- "cannot replay: given collector does not support "
- + "out-of-order collection, while the wrapped collector does. "
- + "Therefore cached documents may be out-of-order.");
- }
collect(collector, i);
}
}
@@ -300,16 +290,9 @@ public abstract class CachingCollector e
* Creates a {@link CachingCollector} which does not wrap another collector.
* The cached documents and scores can later be {@link #replay(Collector)
* replayed}.
- *
- * @param acceptDocsOutOfOrder
- * whether documents are allowed to be collected out-of-order
*/
- public static CachingCollector create(final boolean acceptDocsOutOfOrder, boolean cacheScores, double maxRAMMB) {
+ public static CachingCollector create(boolean cacheScores, double maxRAMMB) {
Collector other = new SimpleCollector() {
- @Override
- public boolean acceptsDocsOutOfOrder() {
- return acceptDocsOutOfOrder;
- }
@Override
public void collect(int doc) {}
Modified: lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/ConstantScoreQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/ConstantScoreQuery.java?rev=1652034&r1=1652033&r2=1652034&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/ConstantScoreQuery.java (original)
+++ lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/ConstantScoreQuery.java Thu Jan 15 10:19:28 2015
@@ -134,14 +134,14 @@ public class ConstantScoreQuery extends
}
@Override
- public BulkScorer bulkScorer(LeafReaderContext context, boolean scoreDocsInOrder, Bits acceptDocs) throws IOException {
+ public BulkScorer bulkScorer(LeafReaderContext context, Bits acceptDocs) throws IOException {
final DocIdSetIterator disi;
if (filter != null) {
assert query == null;
- return super.bulkScorer(context, scoreDocsInOrder, acceptDocs);
+ return super.bulkScorer(context, acceptDocs);
} else {
assert query != null && innerWeight != null;
- BulkScorer bulkScorer = innerWeight.bulkScorer(context, scoreDocsInOrder, acceptDocs);
+ BulkScorer bulkScorer = innerWeight.bulkScorer(context, acceptDocs);
if (bulkScorer == null) {
return null;
}
@@ -171,11 +171,6 @@ public class ConstantScoreQuery extends
}
@Override
- public boolean scoresDocsOutOfOrder() {
- return (innerWeight != null) ? innerWeight.scoresDocsOutOfOrder() : false;
- }
-
- @Override
public Explanation explain(LeafReaderContext context, int doc) throws IOException {
final Scorer cs = scorer(context, context.reader().getLiveDocs());
final boolean exists = (cs != null && cs.advance(doc) == doc);
Modified: lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/FilterLeafCollector.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/FilterLeafCollector.java?rev=1652034&r1=1652033&r2=1652034&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/FilterLeafCollector.java (original)
+++ lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/FilterLeafCollector.java Thu Jan 15 10:19:28 2015
@@ -44,11 +44,6 @@ public class FilterLeafCollector impleme
}
@Override
- public boolean acceptsDocsOutOfOrder() {
- return in.acceptsDocsOutOfOrder();
- }
-
- @Override
public String toString() {
return getClass().getSimpleName() + "(" + in + ")";
}
Modified: lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/FilteredQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/FilteredQuery.java?rev=1652034&r1=1652033&r2=1652034&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/FilteredQuery.java (original)
+++ lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/FilteredQuery.java Thu Jan 15 10:19:28 2015
@@ -81,11 +81,6 @@ public class FilteredQuery extends Query
public Weight createWeight(final IndexSearcher searcher) throws IOException {
final Weight weight = query.createWeight (searcher);
return new Weight() {
-
- @Override
- public boolean scoresDocsOutOfOrder() {
- return true;
- }
@Override
public float getValueForNormalization() throws IOException {
@@ -138,7 +133,7 @@ public class FilteredQuery extends Query
// return a filtering top scorer
@Override
- public BulkScorer bulkScorer(LeafReaderContext context, boolean scoreDocsInOrder, Bits acceptDocs) throws IOException {
+ public BulkScorer bulkScorer(LeafReaderContext context, Bits acceptDocs) throws IOException {
assert filter != null;
DocIdSet filterDocIdSet = filter.getDocIdSet(context, acceptDocs);
@@ -147,7 +142,7 @@ public class FilteredQuery extends Query
return null;
}
- return strategy.filteredBulkScorer(context, weight, scoreDocsInOrder, filterDocIdSet);
+ return strategy.filteredBulkScorer(context, weight, filterDocIdSet);
}
};
}
@@ -480,7 +475,7 @@ public class FilteredQuery extends Query
* @return a filtered top scorer
*/
public BulkScorer filteredBulkScorer(LeafReaderContext context,
- Weight weight, boolean scoreDocsInOrder, DocIdSet docIdSet) throws IOException {
+ Weight weight, DocIdSet docIdSet) throws IOException {
Scorer scorer = filteredScorer(context, weight, docIdSet);
if (scorer == null) {
return null;
@@ -603,13 +598,12 @@ public class FilteredQuery extends Query
@Override
public BulkScorer filteredBulkScorer(final LeafReaderContext context,
Weight weight,
- boolean scoreDocsInOrder, // ignored (we always top-score in order)
DocIdSet docIdSet) throws IOException {
Bits filterAcceptDocs = docIdSet.bits();
if (filterAcceptDocs == null) {
// Filter does not provide random-access Bits; we
// must fallback to leapfrog:
- return LEAP_FROG_QUERY_FIRST_STRATEGY.filteredBulkScorer(context, weight, scoreDocsInOrder, docIdSet);
+ return LEAP_FROG_QUERY_FIRST_STRATEGY.filteredBulkScorer(context, weight, docIdSet);
}
final Scorer scorer = weight.scorer(context, null);
return scorer == null ? null : new QueryFirstBulkScorer(scorer, filterAcceptDocs);
Modified: lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/IndexSearcher.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/IndexSearcher.java?rev=1652034&r1=1652033&r2=1652034&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/IndexSearcher.java (original)
+++ lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/IndexSearcher.java Thu Jan 15 10:19:28 2015
@@ -479,7 +479,7 @@ public class IndexSearcher {
limit = 1;
}
nDocs = Math.min(nDocs, limit);
- TopScoreDocCollector collector = TopScoreDocCollector.create(nDocs, after, !weight.scoresDocsOutOfOrder());
+ TopScoreDocCollector collector = TopScoreDocCollector.create(nDocs, after);
search(leaves, weight, collector);
return collector.topDocs();
}
@@ -528,8 +528,7 @@ public class IndexSearcher {
after,
fillFields,
doDocScores,
- doMaxScore,
- false);
+ doMaxScore);
final Lock lock = new ReentrantLock();
final ExecutionHelper<TopFieldDocs> runner = new ExecutionHelper<>(executor);
@@ -569,7 +568,7 @@ public class IndexSearcher {
TopFieldCollector collector = TopFieldCollector.create(sort, nDocs, after,
fillFields, doDocScores,
- doMaxScore, !weight.scoresDocsOutOfOrder());
+ doMaxScore);
search(leaves, weight, collector);
return (TopFieldDocs) collector.topDocs();
}
@@ -608,7 +607,7 @@ public class IndexSearcher {
// continue with the following leaf
continue;
}
- BulkScorer scorer = weight.bulkScorer(ctx, !leafCollector.acceptsDocsOutOfOrder(), ctx.reader().getLiveDocs());
+ BulkScorer scorer = weight.bulkScorer(ctx, ctx.reader().getLiveDocs());
if (scorer != null) {
try {
scorer.score(leafCollector);
Modified: lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/LeafCollector.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/LeafCollector.java?rev=1652034&r1=1652033&r2=1652034&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/LeafCollector.java (original)
+++ lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/LeafCollector.java Thu Jan 15 10:19:28 2015
@@ -56,14 +56,9 @@ import java.io.IOException;
* bits.set(docBase + doc);
* }
*
- * // accept docs out of order (for a BitSet it doesn't matter)
- * public boolean acceptsDocsOutOfOrder() {
- * return true;
- * }
- *
* };
* }
- *
+ *
* });
* </pre>
*
@@ -98,22 +93,4 @@ public interface LeafCollector {
*/
void collect(int doc) throws IOException;
- /**
- * Return <code>true</code> if this collector does not
- * require the matching docIDs to be delivered in int sort
- * order (smallest to largest) to {@link #collect}.
- *
- * <p> Most Lucene Query implementations will visit
- * matching docIDs in order. However, some queries
- * (currently limited to certain cases of {@link
- * BooleanQuery}) can achieve faster searching if the
- * <code>Collector</code> allows them to deliver the
- * docIDs out of order.</p>
- *
- * <p> Many collectors don't mind getting docIDs out of
- * order, so it's important to return <code>true</code>
- * here.
- */
- boolean acceptsDocsOutOfOrder();
-
}
Modified: lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/MultiCollector.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/MultiCollector.java?rev=1652034&r1=1652033&r2=1652034&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/MultiCollector.java (original)
+++ lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/MultiCollector.java Thu Jan 15 10:19:28 2015
@@ -124,16 +124,6 @@ public class MultiCollector implements C
}
}
- @Override
- public boolean acceptsDocsOutOfOrder() {
- for (LeafCollector c : collectors) {
- if (!c.acceptsDocsOutOfOrder()) {
- return false;
- }
- }
- return true;
- }
-
}
}
Modified: lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/SimpleCollector.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/SimpleCollector.java?rev=1652034&r1=1652033&r2=1652034&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/SimpleCollector.java (original)
+++ lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/SimpleCollector.java Thu Jan 15 10:19:28 2015
@@ -45,9 +45,6 @@ public abstract class SimpleCollector im
// redeclare methods so that javadocs are inherited on sub-classes
@Override
- public abstract boolean acceptsDocsOutOfOrder();
-
- @Override
public abstract void collect(int doc) throws IOException;
}
Modified: lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/SortRescorer.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/SortRescorer.java?rev=1652034&r1=1652033&r2=1652034&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/SortRescorer.java (original)
+++ lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/SortRescorer.java Thu Jan 15 10:19:28 2015
@@ -53,7 +53,7 @@ public class SortRescorer extends Rescor
List<LeafReaderContext> leaves = searcher.getIndexReader().leaves();
- TopFieldCollector collector = TopFieldCollector.create(sort, topN, true, true, true, false);
+ TopFieldCollector collector = TopFieldCollector.create(sort, topN, true, true, true);
// Now merge sort docIDs from hits, with reader's leaves:
int hitUpto = 0;
Modified: lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/TopFieldCollector.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/TopFieldCollector.java?rev=1652034&r1=1652033&r2=1652034&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/TopFieldCollector.java (original)
+++ lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/TopFieldCollector.java Thu Jan 15 10:19:28 2015
@@ -27,7 +27,7 @@ import org.apache.lucene.util.PriorityQu
* A {@link Collector} that sorts by {@link SortField} using
* {@link FieldComparator}s.
* <p/>
- * See the {@link #create(org.apache.lucene.search.Sort, int, boolean, boolean, boolean, boolean)} method
+ * See the {@link #create(org.apache.lucene.search.Sort, int, boolean, boolean, boolean)} method
* for instantiating a TopFieldCollector.
*
* @lucene.experimental
@@ -55,11 +55,6 @@ public abstract class TopFieldCollector
this.scorer = scorer;
comparator.setScorer(scorer);
}
-
- @Override
- public boolean acceptsDocsOutOfOrder() {
- return false;
- }
}
private static abstract class MultiComparatorLeafCollector implements LeafCollector {
@@ -124,11 +119,6 @@ public abstract class TopFieldCollector
comparator.setScorer(scorer);
}
}
-
- @Override
- public boolean acceptsDocsOutOfOrder() {
- return false;
- }
}
/*
@@ -219,102 +209,6 @@ public abstract class TopFieldCollector
}
/*
- * Implements a TopFieldCollector over one SortField criteria, without
- * tracking document scores and maxScore, and assumes out of orderness in doc
- * Ids collection.
- */
- private static class OutOfOrderNonScoringCollector extends TopFieldCollector {
-
- final FieldValueHitQueue<Entry> queue;
-
- public OutOfOrderNonScoringCollector(FieldValueHitQueue<Entry> queue, int numHits, boolean fillFields) {
- super(queue, numHits, fillFields);
- this.queue = queue;
- }
-
- @Override
- public LeafCollector getLeafCollector(LeafReaderContext context) throws IOException {
- docBase = context.docBase;
-
- final LeafFieldComparator[] comparators = queue.getComparators(context);
- final int[] reverseMul = queue.getReverseMul();
-
- if (comparators.length == 1) {
- return new OneComparatorLeafCollector(comparators[0], reverseMul[0]) {
-
- @Override
- public void collect(int doc) throws IOException {
- ++totalHits;
- if (queueFull) {
- // Fastmatch: return if this hit is not competitive
- final int cmp = reverseMul * comparator.compareBottom(doc);
- if (cmp < 0 || (cmp == 0 && doc + docBase > bottom.doc)) {
- return;
- }
-
- // This hit is competitive - replace bottom element in queue & adjustTop
- comparator.copy(bottom.slot, doc);
- updateBottom(doc);
- comparator.setBottom(bottom.slot);
- } else {
- // Startup transient: queue hasn't gathered numHits yet
- final int slot = totalHits - 1;
- // Copy hit into queue
- comparator.copy(slot, doc);
- add(slot, doc, Float.NaN);
- if (queueFull) {
- comparator.setBottom(bottom.slot);
- }
- }
- }
-
- @Override
- public boolean acceptsDocsOutOfOrder() {
- return true;
- }
-
- };
- } else {
- return new MultiComparatorLeafCollector(comparators, reverseMul) {
-
- @Override
- public void collect(int doc) throws IOException {
- ++totalHits;
- if (queueFull) {
- // Fastmatch: return if this hit is not competitive
- final int cmp = compareBottom(doc);
- if (cmp < 0 || (cmp == 0 && doc + docBase > bottom.doc)) {
- return;
- }
-
- // This hit is competitive - replace bottom element in queue & adjustTop
- copy(bottom.slot, doc);
- updateBottom(doc);
- setBottom(bottom.slot);
- } else {
- // Startup transient: queue hasn't gathered numHits yet
- final int slot = totalHits - 1;
- // Copy hit into queue
- copy(slot, doc);
- add(slot, doc, Float.NaN);
- if (queueFull) {
- setBottom(bottom.slot);
- }
- }
- }
-
- @Override
- public boolean acceptsDocsOutOfOrder() {
- return true;
- }
-
- };
- }
- }
-
- }
-
- /*
* Implements a TopFieldCollector over one SortField criteria, while tracking
* document scores but no maxScore.
*/
@@ -414,113 +308,6 @@ public abstract class TopFieldCollector
}
/*
- * Implements a TopFieldCollector over one SortField criteria, while tracking
- * document scores but no maxScore, and assumes out of orderness in doc Ids
- * collection.
- */
- private static class OutOfOrderScoringNoMaxScoreCollector extends TopFieldCollector {
-
- final FieldValueHitQueue<Entry> queue;
-
- public OutOfOrderScoringNoMaxScoreCollector(FieldValueHitQueue<Entry> queue, int numHits, boolean fillFields) {
- super(queue, numHits, fillFields);
- this.queue = queue;
- }
-
- @Override
- public LeafCollector getLeafCollector(LeafReaderContext context) throws IOException {
- docBase = context.docBase;
-
- final LeafFieldComparator[] comparators = queue.getComparators(context);
- final int[] reverseMul = queue.getReverseMul();
-
- if (comparators.length == 1) {
- return new OneComparatorLeafCollector(comparators[0], reverseMul[0]) {
-
- @Override
- public void collect(int doc) throws IOException {
- ++totalHits;
- if (queueFull) {
- // Fastmatch: return if this hit is not competitive
- final int cmp = reverseMul * comparator.compareBottom(doc);
- if (cmp < 0 || (cmp == 0 && doc + docBase > bottom.doc)) {
- return;
- }
-
- // Compute the score only if the hit is competitive.
- final float score = scorer.score();
-
- // This hit is competitive - replace bottom element in queue & adjustTop
- comparator.copy(bottom.slot, doc);
- updateBottom(doc, score);
- comparator.setBottom(bottom.slot);
- } else {
- // Compute the score only if the hit is competitive.
- final float score = scorer.score();
-
- // Startup transient: queue hasn't gathered numHits yet
- final int slot = totalHits - 1;
- // Copy hit into queue
- comparator.copy(slot, doc);
- add(slot, doc, score);
- if (queueFull) {
- comparator.setBottom(bottom.slot);
- }
- }
- }
-
- @Override
- public boolean acceptsDocsOutOfOrder() {
- return true;
- }
-
- };
- } else {
- return new MultiComparatorLeafCollector(comparators, reverseMul) {
-
- @Override
- public void collect(int doc) throws IOException {
- ++totalHits;
- if (queueFull) {
- // Fastmatch: return if this hit is not competitive
- final int cmp = compareBottom(doc);
- if (cmp < 0 || (cmp == 0 && doc + docBase > bottom.doc)) {
- return;
- }
-
- // Compute the score only if the hit is competitive.
- final float score = scorer.score();
-
- // This hit is competitive - replace bottom element in queue & adjustTop
- copy(bottom.slot, doc);
- updateBottom(doc, score);
- setBottom(bottom.slot);
- } else {
- // Compute the score only if the hit is competitive.
- final float score = scorer.score();
-
- // Startup transient: queue hasn't gathered numHits yet
- final int slot = totalHits - 1;
- // Copy hit into queue
- copy(slot, doc);
- add(slot, doc, score);
- if (queueFull) {
- setBottom(bottom.slot);
- }
- }
- }
-
- @Override
- public boolean acceptsDocsOutOfOrder() {
- return true;
- }
- };
- }
- }
-
- }
-
- /*
* Implements a TopFieldCollector over one SortField criteria, with tracking
* document scores and maxScore.
*/
@@ -617,109 +404,6 @@ public abstract class TopFieldCollector
}
/*
- * Implements a TopFieldCollector over one SortField criteria, with tracking
- * document scores and maxScore, and assumes out of orderness in doc Ids
- * collection.
- */
- private static class OutOfOrderScoringMaxScoreCollector extends TopFieldCollector {
-
- final FieldValueHitQueue<Entry> queue;
-
- public OutOfOrderScoringMaxScoreCollector(FieldValueHitQueue<Entry> queue, int numHits, boolean fillFields) {
- super(queue, numHits, fillFields);
- this.queue = queue;
- maxScore = Float.MIN_NORMAL; // otherwise we would keep NaN
- }
-
- @Override
- public LeafCollector getLeafCollector(LeafReaderContext context) throws IOException {
- docBase = context.docBase;
-
- final LeafFieldComparator[] comparators = queue.getComparators(context);
- final int[] reverseMul = queue.getReverseMul();
-
- if (comparators.length == 1) {
- return new OneComparatorLeafCollector(comparators[0], reverseMul[0]) {
-
- @Override
- public void collect(int doc) throws IOException {
- final float score = scorer.score();
- if (score > maxScore) {
- maxScore = score;
- }
- ++totalHits;
- if (queueFull) {
- // Fastmatch: return if this hit is not competitive
- final int cmp = reverseMul * comparator.compareBottom(doc);
- if (cmp < 0 || (cmp == 0 && doc + docBase > bottom.doc)) {
- return;
- }
-
- // This hit is competitive - replace bottom element in queue & adjustTop
- comparator.copy(bottom.slot, doc);
- updateBottom(doc, score);
- comparator.setBottom(bottom.slot);
- } else {
- // Startup transient: queue hasn't gathered numHits yet
- final int slot = totalHits - 1;
- // Copy hit into queue
- comparator.copy(slot, doc);
- add(slot, doc, score);
- if (queueFull) {
- comparator.setBottom(bottom.slot);
- }
- }
- }
-
- @Override
- public boolean acceptsDocsOutOfOrder() {
- return true;
- }
- };
- } else {
- return new MultiComparatorLeafCollector(comparators, reverseMul) {
-
- @Override
- public void collect(int doc) throws IOException {
- final float score = scorer.score();
- if (score > maxScore) {
- maxScore = score;
- }
- ++totalHits;
- if (queueFull) {
- // Fastmatch: return if this hit is not competitive
- final int cmp = compareBottom(doc);
- if (cmp < 0 || (cmp == 0 && doc + docBase > bottom.doc)) {
- return;
- }
-
- // This hit is competitive - replace bottom element in queue & adjustTop
- copy(bottom.slot, doc);
- updateBottom(doc, score);
- setBottom(bottom.slot);
- } else {
- // Startup transient: queue hasn't gathered numHits yet
- final int slot = totalHits - 1;
- // Copy hit into queue
- copy(slot, doc);
- add(slot, doc, score);
- if (queueFull) {
- setBottom(bottom.slot);
- }
- }
- }
-
- @Override
- public boolean acceptsDocsOutOfOrder() {
- return true;
- }
- };
- }
- }
-
- }
-
- /*
* Implements a TopFieldCollector when after != null.
*/
private final static class PagingFieldCollector extends TopFieldCollector {
@@ -774,8 +458,8 @@ public abstract class TopFieldCollector
// Fastmatch: return if this hit is no better than
// the worst hit currently in the queue:
final int cmp = compareBottom(doc);
- if (cmp < 0 || (cmp == 0 && doc + docBase > bottom.doc)) {
- // Definitely not competitive.
+ if (cmp <= 0) {
+ // not competitive since documents are visited in doc id order
return;
}
}
@@ -817,11 +501,6 @@ public abstract class TopFieldCollector
}
}
}
-
- @Override
- public boolean acceptsDocsOutOfOrder() {
- return true;
- }
};
}
@@ -882,18 +561,14 @@ public abstract class TopFieldCollector
* true affects performance as it incurs the score computation on
* each result. Also, setting this true automatically sets
* <code>trackDocScores</code> to true as well.
- * @param docsScoredInOrder
- * specifies whether documents are scored in doc Id order or not by
- * the given {@link Scorer} in {@link LeafCollector#setScorer(Scorer)}.
* @return a {@link TopFieldCollector} instance which will sort the results by
* the sort criteria.
* @throws IOException if there is a low-level I/O error
*/
public static TopFieldCollector create(Sort sort, int numHits,
- boolean fillFields, boolean trackDocScores, boolean trackMaxScore,
- boolean docsScoredInOrder)
+ boolean fillFields, boolean trackDocScores, boolean trackMaxScore)
throws IOException {
- return create(sort, numHits, null, fillFields, trackDocScores, trackMaxScore, docsScoredInOrder);
+ return create(sort, numHits, null, fillFields, trackDocScores, trackMaxScore);
}
/**
@@ -927,16 +602,12 @@ public abstract class TopFieldCollector
* true affects performance as it incurs the score computation on
* each result. Also, setting this true automatically sets
* <code>trackDocScores</code> to true as well.
- * @param docsScoredInOrder
- * specifies whether documents are scored in doc Id order or not by
- * the given {@link Scorer} in {@link LeafCollector#setScorer(Scorer)}.
* @return a {@link TopFieldCollector} instance which will sort the results by
* the sort criteria.
* @throws IOException if there is a low-level I/O error
*/
public static TopFieldCollector create(Sort sort, int numHits, FieldDoc after,
- boolean fillFields, boolean trackDocScores, boolean trackMaxScore,
- boolean docsScoredInOrder)
+ boolean fillFields, boolean trackDocScores, boolean trackMaxScore)
throws IOException {
if (sort.fields.length == 0) {
@@ -950,22 +621,12 @@ public abstract class TopFieldCollector
FieldValueHitQueue<Entry> queue = FieldValueHitQueue.create(sort.fields, numHits);
if (after == null) {
- if (docsScoredInOrder) {
- if (trackMaxScore) {
- return new ScoringMaxScoreCollector(queue, numHits, fillFields);
- } else if (trackDocScores) {
- return new ScoringNoMaxScoreCollector(queue, numHits, fillFields);
- } else {
- return new NonScoringCollector(queue, numHits, fillFields);
- }
+ if (trackMaxScore) {
+ return new ScoringMaxScoreCollector(queue, numHits, fillFields);
+ } else if (trackDocScores) {
+ return new ScoringNoMaxScoreCollector(queue, numHits, fillFields);
} else {
- if (trackMaxScore) {
- return new OutOfOrderScoringMaxScoreCollector(queue, numHits, fillFields);
- } else if (trackDocScores) {
- return new OutOfOrderScoringNoMaxScoreCollector(queue, numHits, fillFields);
- } else {
- return new OutOfOrderNonScoringCollector(queue, numHits, fillFields);
- }
+ return new NonScoringCollector(queue, numHits, fillFields);
}
} else {
if (after.fields == null) {
Modified: lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/TopScoreDocCollector.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/TopScoreDocCollector.java?rev=1652034&r1=1652033&r2=1652034&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/TopScoreDocCollector.java (original)
+++ lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/TopScoreDocCollector.java Thu Jan 15 10:19:28 2015
@@ -36,13 +36,7 @@ import org.apache.lucene.index.LeafReade
*/
public abstract class TopScoreDocCollector extends TopDocsCollector<ScoreDoc> {
- private abstract static class ScorerLeafCollector implements LeafCollector {
-
- final boolean scoreDocsInOrder;
-
- ScorerLeafCollector(boolean scoreDocsInOrder) {
- this.scoreDocsInOrder = scoreDocsInOrder;
- }
+ abstract static class ScorerLeafCollector implements LeafCollector {
Scorer scorer;
@@ -51,90 +45,52 @@ public abstract class TopScoreDocCollect
this.scorer = scorer;
}
- @Override
- public boolean acceptsDocsOutOfOrder() {
- return scoreDocsInOrder == false;
- }
-
}
private static class SimpleTopScoreDocCollector extends TopScoreDocCollector {
- private final boolean scoreDocsInOrder;
-
- SimpleTopScoreDocCollector(int numHits, boolean scoreDocsInOrder) {
+ SimpleTopScoreDocCollector(int numHits) {
super(numHits);
- this.scoreDocsInOrder = scoreDocsInOrder;
}
@Override
public LeafCollector getLeafCollector(LeafReaderContext context)
throws IOException {
final int docBase = context.docBase;
- if (scoreDocsInOrder) {
- return new ScorerLeafCollector(scoreDocsInOrder) {
+ return new ScorerLeafCollector() {
- @Override
- public void collect(int doc) throws IOException {
- float score = scorer.score();
-
- // This collector cannot handle these scores:
- assert score != Float.NEGATIVE_INFINITY;
- assert !Float.isNaN(score);
-
- totalHits++;
- if (score <= pqTop.score) {
- // Since docs are returned in-order (i.e., increasing doc Id), a document
- // with equal score to pqTop.score cannot compete since HitQueue favors
- // documents with lower doc Ids. Therefore reject those docs too.
- return;
- }
- pqTop.doc = doc + docBase;
- pqTop.score = score;
- pqTop = pq.updateTop();
+ @Override
+ public void collect(int doc) throws IOException {
+ float score = scorer.score();
+
+ // This collector cannot handle these scores:
+ assert score != Float.NEGATIVE_INFINITY;
+ assert !Float.isNaN(score);
+
+ totalHits++;
+ if (score <= pqTop.score) {
+ // Since docs are returned in-order (i.e., increasing doc Id), a document
+ // with equal score to pqTop.score cannot compete since HitQueue favors
+ // documents with lower doc Ids. Therefore reject those docs too.
+ return;
}
+ pqTop.doc = doc + docBase;
+ pqTop.score = score;
+ pqTop = pq.updateTop();
+ }
- };
- } else {
- return new ScorerLeafCollector(scoreDocsInOrder) {
-
- @Override
- public void collect(int doc) throws IOException {
- float score = scorer.score();
-
- // This collector cannot handle NaN
- assert !Float.isNaN(score);
-
- totalHits++;
- if (score < pqTop.score) {
- // Doesn't compete w/ bottom entry in queue
- return;
- }
- doc += docBase;
- if (score == pqTop.score && doc > pqTop.doc) {
- // Break tie in score by doc ID:
- return;
- }
- pqTop.doc = doc;
- pqTop.score = score;
- pqTop = pq.updateTop();
- }
-
- };
- }
+ };
}
}
private static class PagingTopScoreDocCollector extends TopScoreDocCollector {
- private final boolean scoreDocsInOrder;
private final ScoreDoc after;
private int collectedHits;
- PagingTopScoreDocCollector(int numHits, boolean scoreDocsInOrder, ScoreDoc after) {
+ PagingTopScoreDocCollector(int numHits, ScoreDoc after) {
super(numHits);
- this.scoreDocsInOrder = scoreDocsInOrder;
this.after = after;
this.collectedHits = 0;
}
@@ -153,65 +109,34 @@ public abstract class TopScoreDocCollect
public LeafCollector getLeafCollector(LeafReaderContext context) throws IOException {
final int docBase = context.docBase;
final int afterDoc = after.doc - context.docBase;
- if (scoreDocsInOrder) {
- return new ScorerLeafCollector(scoreDocsInOrder) {
- @Override
- public void collect(int doc) throws IOException {
- float score = scorer.score();
-
- // This collector cannot handle these scores:
- assert score != Float.NEGATIVE_INFINITY;
- assert !Float.isNaN(score);
-
- totalHits++;
-
- if (score > after.score || (score == after.score && doc <= afterDoc)) {
- // hit was collected on a previous page
- return;
- }
-
- if (score <= pqTop.score) {
- // Since docs are returned in-order (i.e., increasing doc Id), a document
- // with equal score to pqTop.score cannot compete since HitQueue favors
- // documents with lower doc Ids. Therefore reject those docs too.
- return;
- }
- collectedHits++;
- pqTop.doc = doc + docBase;
- pqTop.score = score;
- pqTop = pq.updateTop();
+ return new ScorerLeafCollector() {
+ @Override
+ public void collect(int doc) throws IOException {
+ float score = scorer.score();
+
+ // This collector cannot handle these scores:
+ assert score != Float.NEGATIVE_INFINITY;
+ assert !Float.isNaN(score);
+
+ totalHits++;
+
+ if (score > after.score || (score == after.score && doc <= afterDoc)) {
+ // hit was collected on a previous page
+ return;
}
- };
- } else {
- return new ScorerLeafCollector(scoreDocsInOrder) {
- @Override
- public void collect(int doc) throws IOException {
- float score = scorer.score();
-
- // This collector cannot handle NaN
- assert !Float.isNaN(score);
-
- totalHits++;
- if (score > after.score || (score == after.score && doc <= afterDoc)) {
- // hit was collected on a previous page
- return;
- }
- if (score < pqTop.score) {
- // Doesn't compete w/ bottom entry in queue
- return;
- }
- doc += docBase;
- if (score == pqTop.score && doc > pqTop.doc) {
- // Break tie in score by doc ID:
- return;
- }
- collectedHits++;
- pqTop.doc = doc;
- pqTop.score = score;
- pqTop = pq.updateTop();
+
+ if (score <= pqTop.score) {
+ // Since docs are returned in-order (i.e., increasing doc Id), a document
+ // with equal score to pqTop.score cannot compete since HitQueue favors
+ // documents with lower doc Ids. Therefore reject those docs too.
+ return;
}
- };
- }
+ collectedHits++;
+ pqTop.doc = doc + docBase;
+ pqTop.score = score;
+ pqTop = pq.updateTop();
+ }
+ };
}
}
@@ -225,8 +150,8 @@ public abstract class TopScoreDocCollect
* <code>numHits</code>, and fill the array with sentinel
* objects.
*/
- public static TopScoreDocCollector create(int numHits, boolean docsScoredInOrder) {
- return create(numHits, null, docsScoredInOrder);
+ public static TopScoreDocCollector create(int numHits) {
+ return create(numHits, null);
}
/**
@@ -239,23 +164,23 @@ public abstract class TopScoreDocCollect
* <code>numHits</code>, and fill the array with sentinel
* objects.
*/
- public static TopScoreDocCollector create(int numHits, ScoreDoc after, boolean docsScoredInOrder) {
+ public static TopScoreDocCollector create(int numHits, ScoreDoc after) {
if (numHits <= 0) {
throw new IllegalArgumentException("numHits must be > 0; please use TotalHitCountCollector if you just need the total hit count");
}
if (after == null) {
- return new SimpleTopScoreDocCollector(numHits, docsScoredInOrder);
+ return new SimpleTopScoreDocCollector(numHits);
} else {
- return new PagingTopScoreDocCollector(numHits, docsScoredInOrder, after);
+ return new PagingTopScoreDocCollector(numHits, after);
}
}
ScoreDoc pqTop;
// prevents instantiation
- private TopScoreDocCollector(int numHits) {
+ TopScoreDocCollector(int numHits) {
super(new HitQueue(numHits, true));
// HitQueue implements getSentinelObject to return a ScoreDoc, so we know
// that at this point top() is already initialized.
Modified: lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/TotalHitCountCollector.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/TotalHitCountCollector.java?rev=1652034&r1=1652033&r2=1652034&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/TotalHitCountCollector.java (original)
+++ lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/TotalHitCountCollector.java Thu Jan 15 10:19:28 2015
@@ -34,9 +34,4 @@ public class TotalHitCountCollector exte
public void collect(int doc) {
totalHits++;
}
-
- @Override
- public boolean acceptsDocsOutOfOrder() {
- return true;
- }
}
Modified: lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/Weight.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/Weight.java?rev=1652034&r1=1652033&r2=1652034&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/Weight.java (original)
+++ lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/Weight.java Thu Jan 15 10:19:28 2015
@@ -79,11 +79,6 @@ public abstract class Weight {
* Returns a {@link Scorer} which scores documents in/out-of order according
* to <code>scoreDocsInOrder</code>.
* <p>
- * <b>NOTE:</b> even if <code>scoreDocsInOrder</code> is false, it is
- * recommended to check whether the returned <code>Scorer</code> indeed scores
- * documents out of order (i.e., call {@link #scoresDocsOutOfOrder()}), as
- * some <code>Scorer</code> implementations will always return documents
- * in-order.<br>
* <b>NOTE:</b> null can be returned if no documents will be scored by this
* query.
*
@@ -108,15 +103,6 @@ public abstract class Weight {
*
* @param context
* the {@link org.apache.lucene.index.LeafReaderContext} for which to return the {@link Scorer}.
- * @param scoreDocsInOrder
- * specifies whether in-order scoring of documents is required. Note
- * that if set to false (i.e., out-of-order scoring is required),
- * this method can return whatever scoring mode it supports, as every
- * in-order scorer is also an out-of-order one. However, an
- * out-of-order scorer may not support {@link Scorer#nextDoc()}
- * and/or {@link Scorer#advance(int)}, therefore it is recommended to
- * request an in-order scorer if use of these
- * methods is required.
* @param acceptDocs
* Bits that represent the allowable docs to match (typically deleted docs
* but possibly filtering other documents)
@@ -125,7 +111,7 @@ public abstract class Weight {
* passes them to a collector.
* @throws IOException if there is a low-level I/O error
*/
- public BulkScorer bulkScorer(LeafReaderContext context, boolean scoreDocsInOrder, Bits acceptDocs) throws IOException {
+ public BulkScorer bulkScorer(LeafReaderContext context, Bits acceptDocs) throws IOException {
Scorer scorer = scorer(context, acceptDocs);
if (scorer == null) {
@@ -193,19 +179,4 @@ public abstract class Weight {
}
}
}
-
- /**
- * Returns true iff this implementation scores docs only out of order. This
- * method is used in conjunction with {@link Collector}'s
- * {@link LeafCollector#acceptsDocsOutOfOrder() acceptsDocsOutOfOrder} and
- * {@link #bulkScorer(org.apache.lucene.index.LeafReaderContext, boolean, Bits)} to
- * create a matching {@link Scorer} instance for a given {@link Collector}, or
- * vice versa.
- * <p>
- * <b>NOTE:</b> the default implementation returns <code>false</code>, i.e.
- * the <code>Scorer</code> scores documents in-order.
- */
- public boolean scoresDocsOutOfOrder() {
- return false;
- }
}
Modified: lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/package.html
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/package.html?rev=1652034&r1=1652033&r2=1652034&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/package.html (original)
+++ lucene/dev/branches/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/package.html Thu Jan 15 10:19:28 2015
@@ -443,8 +443,8 @@ on the built-in available scoring models
given the Query.
</li>
<li>
- {@link org.apache.lucene.search.Weight#bulkScorer(org.apache.lucene.index.LeafReaderContext, boolean, org.apache.lucene.util.Bits)
- scorer(LeafReaderContext context, boolean scoreDocsInOrder, Bits acceptDocs)} —
+ {@link org.apache.lucene.search.Weight#bulkScorer(org.apache.lucene.index.LeafReaderContext, org.apache.lucene.util.Bits)
+ scorer(LeafReaderContext context, Bits acceptDocs)} —
Construct a new {@link org.apache.lucene.search.BulkScorer BulkScorer} for this Weight. See <a href="#bulkScorerClass">The BulkScorer Class</a>
below for help defining a BulkScorer. This is an optional method, and most queries do not implement it.
</li>
Modified: lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/index/TestOmitTf.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/index/TestOmitTf.java?rev=1652034&r1=1652033&r2=1652034&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/index/TestOmitTf.java (original)
+++ lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/index/TestOmitTf.java Thu Jan 15 10:19:28 2015
@@ -437,10 +437,6 @@ public class TestOmitTf extends LuceneTe
protected void doSetNextReader(LeafReaderContext context) throws IOException {
docBase = context.docBase;
}
- @Override
- public boolean acceptsDocsOutOfOrder() {
- return true;
- }
}
/** test that when freqs are omitted, that totalTermFreq and sumTotalTermFreq are -1 */
Modified: lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/search/JustCompileSearch.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/search/JustCompileSearch.java?rev=1652034&r1=1652033&r2=1652034&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/search/JustCompileSearch.java (original)
+++ lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/search/JustCompileSearch.java Thu Jan 15 10:19:28 2015
@@ -52,11 +52,6 @@ final class JustCompileSearch {
public void setScorer(Scorer scorer) {
throw new UnsupportedOperationException(UNSUPPORTED_MSG);
}
-
- @Override
- public boolean acceptsDocsOutOfOrder() {
- throw new UnsupportedOperationException(UNSUPPORTED_MSG);
- }
}
Modified: lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/search/MultiCollectorTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/search/MultiCollectorTest.java?rev=1652034&r1=1652033&r2=1652034&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/search/MultiCollectorTest.java (original)
+++ lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/search/MultiCollectorTest.java Thu Jan 15 10:19:28 2015
@@ -27,18 +27,11 @@ public class MultiCollectorTest extends
private static class DummyCollector extends SimpleCollector {
- boolean acceptsDocsOutOfOrderCalled = false;
boolean collectCalled = false;
boolean setNextReaderCalled = false;
boolean setScorerCalled = false;
@Override
- public boolean acceptsDocsOutOfOrder() {
- acceptsDocsOutOfOrderCalled = true;
- return true;
- }
-
- @Override
public void collect(int doc) throws IOException {
collectCalled = true;
}
@@ -70,7 +63,6 @@ public class MultiCollectorTest extends
Collector c = MultiCollector.wrap(new DummyCollector(), null, new DummyCollector());
assertTrue(c instanceof MultiCollector);
final LeafCollector ac = c.getLeafCollector(null);
- assertTrue(ac.acceptsDocsOutOfOrder());
ac.collect(1);
c.getLeafCollector(null);
c.getLeafCollector(null).setScorer(null);
@@ -93,13 +85,11 @@ public class MultiCollectorTest extends
DummyCollector[] dcs = new DummyCollector[] { new DummyCollector(), new DummyCollector() };
Collector c = MultiCollector.wrap(dcs);
LeafCollector ac = c.getLeafCollector(null);
- assertTrue(ac.acceptsDocsOutOfOrder());
ac.collect(1);
ac = c.getLeafCollector(null);
ac.setScorer(null);
for (DummyCollector dc : dcs) {
- assertTrue(dc.acceptsDocsOutOfOrderCalled);
assertTrue(dc.collectCalled);
assertTrue(dc.setNextReaderCalled);
assertTrue(dc.setScorerCalled);
Modified: lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/search/TestBoolean2.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/search/TestBoolean2.java?rev=1652034&r1=1652033&r2=1652034&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/search/TestBoolean2.java (original)
+++ lucene/dev/branches/lucene_solr_5_0/lucene/core/src/test/org/apache/lucene/search/TestBoolean2.java Thu Jan 15 10:19:28 2015
@@ -130,11 +130,14 @@ public class TestBoolean2 extends Lucene
};
public void queriesTest(Query query, int[] expDocNrs) throws Exception {
- TopScoreDocCollector collector = TopScoreDocCollector.create(1000, false);
+ // The asserting searcher will sometimes return the bulk scorer and
+ // sometimes return a default impl around the scorer so that we can
+ // compare BS1 and BS2
+ TopScoreDocCollector collector = TopScoreDocCollector.create(1000);
searcher.search(query, null, collector);
ScoreDoc[] hits1 = collector.topDocs().scoreDocs;
- collector = TopScoreDocCollector.create(1000, true);
+ collector = TopScoreDocCollector.create(1000);
searcher.search(query, null, collector);
ScoreDoc[] hits2 = collector.topDocs().scoreDocs;
@@ -282,13 +285,13 @@ public class TestBoolean2 extends Lucene
}
TopFieldCollector collector = TopFieldCollector.create(sort, 1000,
- false, true, true, true);
+ false, true, true);
searcher.search(q1, null, collector);
ScoreDoc[] hits1 = collector.topDocs().scoreDocs;
collector = TopFieldCollector.create(sort, 1000,
- false, true, true, false);
+ false, true, true);
searcher.search(q1, null, collector);
ScoreDoc[] hits2 = collector.topDocs().scoreDocs;