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 2013/04/25 00:17:26 UTC
svn commit: r1471735 - in /lucene/dev/branches/branch_4x: ./ lucene/
lucene/facet/ lucene/facet/src/java/org/apache/lucene/facet/search/
lucene/facet/src/test/org/apache/lucene/facet/search/
Author: mikemccand
Date: Wed Apr 24 22:17:26 2013
New Revision: 1471735
URL: http://svn.apache.org/r1471735
Log:
LUCENE-4952: add method to force DrillSideways to keep all sub-scorers on the doc being collected
Added:
lucene/dev/branches/branch_4x/lucene/facet/src/test/org/apache/lucene/facet/search/AssertingSubDocsAtOnceCollector.java
- copied unchanged from r1471732, lucene/dev/trunk/lucene/facet/src/test/org/apache/lucene/facet/search/AssertingSubDocsAtOnceCollector.java
Modified:
lucene/dev/branches/branch_4x/ (props changed)
lucene/dev/branches/branch_4x/lucene/ (props changed)
lucene/dev/branches/branch_4x/lucene/CHANGES.txt
lucene/dev/branches/branch_4x/lucene/facet/ (props changed)
lucene/dev/branches/branch_4x/lucene/facet/src/java/org/apache/lucene/facet/search/DrillSideways.java
lucene/dev/branches/branch_4x/lucene/facet/src/java/org/apache/lucene/facet/search/DrillSidewaysQuery.java
lucene/dev/branches/branch_4x/lucene/facet/src/java/org/apache/lucene/facet/search/DrillSidewaysScorer.java
lucene/dev/branches/branch_4x/lucene/facet/src/test/org/apache/lucene/facet/search/TestDrillSideways.java
Modified: lucene/dev/branches/branch_4x/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/CHANGES.txt?rev=1471735&r1=1471734&r2=1471735&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/CHANGES.txt (original)
+++ lucene/dev/branches/branch_4x/lucene/CHANGES.txt Wed Apr 24 22:17:26 2013
@@ -33,6 +33,11 @@ New Features
emit multiple tokens one for each capture group in one or more patterns.
(Simon Willnauer, Clinton Gormley)
+* LUCENE-4952: Expose control (protected method) in DrillSideways to
+ force all sub-scorers to be on the same document being collected.
+ This is necessary when using collectors like
+ ToParentBlockJoinCollector with DrillSideways. (Mike McCandless)
+
======================= Lucene 4.3.0 =======================
Changes in backwards compatibility policy
Modified: lucene/dev/branches/branch_4x/lucene/facet/src/java/org/apache/lucene/facet/search/DrillSideways.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/facet/src/java/org/apache/lucene/facet/search/DrillSideways.java?rev=1471735&r1=1471734&r2=1471735&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/facet/src/java/org/apache/lucene/facet/search/DrillSideways.java (original)
+++ lucene/dev/branches/branch_4x/lucene/facet/src/java/org/apache/lucene/facet/search/DrillSideways.java Wed Apr 24 22:17:26 2013
@@ -209,7 +209,7 @@ public class DrillSideways {
drillSidewaysCollectors[idx++] = FacetsCollector.create(getDrillSidewaysAccumulator(dim, new FacetSearchParams(fsp.indexingParams, requests)));
}
- DrillSidewaysQuery dsq = new DrillSidewaysQuery(baseQuery, drillDownCollector, drillSidewaysCollectors, drillDownTerms);
+ DrillSidewaysQuery dsq = new DrillSidewaysQuery(baseQuery, drillDownCollector, drillSidewaysCollectors, drillDownTerms, scoreSubDocsAtOnce());
searcher.search(dsq, hitCollector);
@@ -300,6 +300,19 @@ public class DrillSideways {
return FacetsAccumulator.create(fsp, searcher.getIndexReader(), taxoReader);
}
+ /** Override this and return true if your collector
+ * (e.g., ToParentBlockJoinCollector) expects all
+ * sub-scorers to be positioned on the document being
+ * collected. This will cause some performance loss;
+ * default is false. Note that if you return true from
+ * this method (in a subclass) be sure your collector
+ * also returns false from {@link
+ * Collector#acceptsDocsOutOfOrder}: this will trick
+ * BooleanQuery into also scoring all subDocs at once. */
+ protected boolean scoreSubDocsAtOnce() {
+ return false;
+ }
+
/** Represents the returned result from a drill sideways
* search. */
public static class DrillSidewaysResult {
Modified: lucene/dev/branches/branch_4x/lucene/facet/src/java/org/apache/lucene/facet/search/DrillSidewaysQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/facet/src/java/org/apache/lucene/facet/search/DrillSidewaysQuery.java?rev=1471735&r1=1471734&r2=1471735&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/facet/src/java/org/apache/lucene/facet/search/DrillSidewaysQuery.java (original)
+++ lucene/dev/branches/branch_4x/lucene/facet/src/java/org/apache/lucene/facet/search/DrillSidewaysQuery.java Wed Apr 24 22:17:26 2013
@@ -39,12 +39,14 @@ class DrillSidewaysQuery extends Query {
final Collector drillDownCollector;
final Collector[] drillSidewaysCollectors;
final Term[][] drillDownTerms;
+ final boolean scoreSubDocsAtOnce;
- DrillSidewaysQuery(Query baseQuery, Collector drillDownCollector, Collector[] drillSidewaysCollectors, Term[][] drillDownTerms) {
+ DrillSidewaysQuery(Query baseQuery, Collector drillDownCollector, Collector[] drillSidewaysCollectors, Term[][] drillDownTerms, boolean scoreSubDocsAtOnce) {
this.baseQuery = baseQuery;
this.drillDownCollector = drillDownCollector;
this.drillSidewaysCollectors = drillSidewaysCollectors;
this.drillDownTerms = drillDownTerms;
+ this.scoreSubDocsAtOnce = scoreSubDocsAtOnce;
}
@Override
@@ -65,7 +67,7 @@ class DrillSidewaysQuery extends Query {
if (newQuery == baseQuery) {
return this;
} else {
- return new DrillSidewaysQuery(newQuery, drillDownCollector, drillSidewaysCollectors, drillDownTerms);
+ return new DrillSidewaysQuery(newQuery, drillDownCollector, drillSidewaysCollectors, drillDownTerms, scoreSubDocsAtOnce);
}
}
@@ -152,7 +154,7 @@ class DrillSidewaysQuery extends Query {
return new DrillSidewaysScorer(this, context,
baseScorer,
- drillDownCollector, dims);
+ drillDownCollector, dims, scoreSubDocsAtOnce);
}
};
}
Modified: lucene/dev/branches/branch_4x/lucene/facet/src/java/org/apache/lucene/facet/search/DrillSidewaysScorer.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/facet/src/java/org/apache/lucene/facet/search/DrillSidewaysScorer.java?rev=1471735&r1=1471734&r2=1471735&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/facet/src/java/org/apache/lucene/facet/search/DrillSidewaysScorer.java (original)
+++ lucene/dev/branches/branch_4x/lucene/facet/src/java/org/apache/lucene/facet/search/DrillSidewaysScorer.java Wed Apr 24 22:17:26 2013
@@ -43,17 +43,19 @@ class DrillSidewaysScorer extends Scorer
private static final int CHUNK = 2048;
private static final int MASK = CHUNK-1;
+ private final boolean scoreSubDocsAtOnce;
private int collectDocID = -1;
private float collectScore;
DrillSidewaysScorer(Weight w, AtomicReaderContext context, Scorer baseScorer, Collector drillDownCollector,
- DocsEnumsAndFreq[] dims) {
+ DocsEnumsAndFreq[] dims, boolean scoreSubDocsAtOnce) {
super(w);
this.dims = dims;
this.context = context;
this.baseScorer = baseScorer;
this.drillDownCollector = drillDownCollector;
+ this.scoreSubDocsAtOnce = scoreSubDocsAtOnce;
}
@Override
@@ -77,7 +79,6 @@ class DrillSidewaysScorer extends Scorer
// Position all scorers to their first matching doc:
baseScorer.nextDoc();
-
for(DocsEnumsAndFreq dim : dims) {
for(DocsEnum docsEnum : dim.docsEnums) {
if (docsEnum != null) {
@@ -113,15 +114,22 @@ class DrillSidewaysScorer extends Scorer
}
*/
- if (baseQueryCost < drillDownCost/10) {
+ //System.out.println("DS score " + scoreSubDocsAtOnce);
+ if (!scoreSubDocsAtOnce) {
+ if (baseQueryCost < drillDownCost/10) {
+ //System.out.println("baseAdvance");
+ doBaseAdvanceScoring(collector, docsEnums, sidewaysCollectors);
+ } else if (numDims > 1 && (dims[1].maxFreq < baseQueryCost/10)) {
+ //System.out.println("drillDownAdvance");
+ doDrillDownAdvanceScoring(collector, docsEnums, sidewaysCollectors);
+ } else {
+ //System.out.println("union");
+ doUnionScoring(collector, docsEnums, sidewaysCollectors);
+ }
+ } else {
+ // TODO: we should fallback to BS2 ReqOptSum scorer here
//System.out.println("baseAdvance");
doBaseAdvanceScoring(collector, docsEnums, sidewaysCollectors);
- } else if (numDims > 1 && (dims[1].maxFreq < baseQueryCost/10)) {
- //System.out.println("drillDownAdvance");
- doDrillDownAdvanceScoring(collector, docsEnums, sidewaysCollectors);
- } else {
- //System.out.println("union");
- doUnionScoring(collector, docsEnums, sidewaysCollectors);
}
}
Modified: lucene/dev/branches/branch_4x/lucene/facet/src/test/org/apache/lucene/facet/search/TestDrillSideways.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/facet/src/test/org/apache/lucene/facet/search/TestDrillSideways.java?rev=1471735&r1=1471734&r2=1471735&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/facet/src/test/org/apache/lucene/facet/search/TestDrillSideways.java (original)
+++ lucene/dev/branches/branch_4x/lucene/facet/src/test/org/apache/lucene/facet/search/TestDrillSideways.java Wed Apr 24 22:17:26 2013
@@ -642,6 +642,7 @@ public class TestDrillSideways extends F
String[][] drillDowns = new String[numDims][];
int count = 0;
+ boolean anyMultiValuedDrillDowns = false;
while (count < numDrillDown) {
int dim = random().nextInt(numDims);
if (drillDowns[dim] == null) {
@@ -651,6 +652,7 @@ public class TestDrillSideways extends F
} else {
int orCount = _TestUtil.nextInt(random(), 1, Math.min(5, dimValues[dim].length));
drillDowns[dim] = new String[orCount];
+ anyMultiValuedDrillDowns |= orCount > 1;
for(int i=0;i<orCount;i++) {
while (true) {
String value = dimValues[dim][random().nextInt(dimValues[dim].length)];
@@ -749,6 +751,22 @@ public class TestDrillSideways extends F
}
}, fsp);
+ // Also separately verify that DS respects the
+ // scoreSubDocsAtOnce method, to ensure that all
+ // subScorers are on the same docID:
+ if (!anyMultiValuedDrillDowns) {
+ // Can only do this test when there are no OR'd
+ // drill-down values, beacuse in that case it's
+ // easily possible for one of the DD terms to be on
+ // a future docID:
+ new DrillSideways(s, tr) {
+ @Override
+ protected boolean scoreSubDocsAtOnce() {
+ return true;
+ }
+ }.search(ddq, new AssertingSubDocsAtOnceCollector(), fsp);
+ }
+
SimpleFacetResult expected = slowDrillSidewaysSearch(s, requests, docs, contentToken, drillDowns, dimValues, filter);
Sort sort = new Sort(new SortField("id", SortField.Type.STRING));