You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ds...@apache.org on 2015/08/06 19:55:57 UTC
svn commit: r1694546 - in /lucene/dev/branches/branch_5x: ./ lucene/
lucene/queries/ lucene/queries/src/java/org/apache/lucene/queries/function/
lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/
lucene/queries/src/java/org/apache/lu...
Author: dsmiley
Date: Thu Aug 6 17:55:56 2015
New Revision: 1694546
URL: http://svn.apache.org/r1694546
Log:
LUCENE-6720: new FunctionRangeQuery wrapper around ValueSourceScorer.
And ValueSourceScorer improvements.
Added:
lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/FunctionRangeQuery.java
- copied unchanged from r1694543, lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/FunctionRangeQuery.java
lucene/dev/branches/branch_5x/lucene/queries/src/test/org/apache/lucene/queries/function/TestFunctionRangeQuery.java
- copied unchanged from r1694543, lucene/dev/trunk/lucene/queries/src/test/org/apache/lucene/queries/function/TestFunctionRangeQuery.java
Removed:
lucene/dev/branches/branch_5x/lucene/spatial/src/java/org/apache/lucene/spatial/util/ValueSourceFilter.java
Modified:
lucene/dev/branches/branch_5x/ (props changed)
lucene/dev/branches/branch_5x/lucene/ (props changed)
lucene/dev/branches/branch_5x/lucene/CHANGES.txt (contents, props changed)
lucene/dev/branches/branch_5x/lucene/queries/ (props changed)
lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/FunctionQuery.java
lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/FunctionValues.java
lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/ValueSourceScorer.java
lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/DocTermsIndexDocValues.java
lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/DoubleDocValues.java
lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/IntDocValues.java
lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/LongDocValues.java
lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/EnumFieldSource.java
lucene/dev/branches/branch_5x/lucene/queries/src/test/org/apache/lucene/queries/function/TestFieldScoreQuery.java
lucene/dev/branches/branch_5x/lucene/spatial/ (props changed)
lucene/dev/branches/branch_5x/lucene/spatial/src/java/org/apache/lucene/spatial/vector/PointVectorStrategy.java
lucene/dev/branches/branch_5x/solr/ (props changed)
lucene/dev/branches/branch_5x/solr/core/ (props changed)
lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/ (props changed)
lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/FunctionRangeQuery.java
Modified: lucene/dev/branches/branch_5x/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/CHANGES.txt?rev=1694546&r1=1694545&r2=1694546&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/CHANGES.txt (original)
+++ lucene/dev/branches/branch_5x/lucene/CHANGES.txt Thu Aug 6 17:55:56 2015
@@ -6,11 +6,19 @@ http://s.apache.org/luceneversions
======================= Lucene 5.4.0 =======================
+New Features
+
+* LUCENE-6720: New FunctionRangeQuery wrapper around ValueSourceScorer
+ (returned from ValueSource/FunctionValues.getRangeScorer()). (David Smiley)
+
Optimizations
* LUCENE-6708: TopFieldCollector does not compute the score several times on the
same document anymore. (Adrien Grand)
+* LUCENE-6720: ValueSourceScorer, returned from
+ FunctionValues.getRangeScorer(), now uses TwoPhaseIterator. (David Smiley)
+
======================= Lucene 5.3.0 =======================
New Features
Modified: lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/FunctionQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/FunctionQuery.java?rev=1694546&r1=1694545&r2=1694546&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/FunctionQuery.java (original)
+++ lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/FunctionQuery.java Thu Aug 6 17:55:56 2015
@@ -29,16 +29,14 @@ import org.apache.lucene.search.IndexSea
import org.apache.lucene.search.Query;
import org.apache.lucene.search.Scorer;
import org.apache.lucene.search.Weight;
-import org.apache.lucene.util.Bits;
/**
* Returns a score for each document based on a ValueSource,
* often some function of the value of a field.
*
- * <b>Note: This API is experimental and may change in non backward-compatible ways in the future</b>
- *
- *
+ * @see ValueSourceScorer
+ * @lucene.experimental
*/
public class FunctionQuery extends Query {
final ValueSource func;
Modified: lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/FunctionValues.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/FunctionValues.java?rev=1694546&r1=1694545&r2=1694546&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/FunctionValues.java (original)
+++ lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/FunctionValues.java Thu Aug 6 17:55:56 2015
@@ -17,8 +17,9 @@ package org.apache.lucene.queries.functi
* limitations under the License.
*/
-import org.apache.lucene.search.*;
import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.search.Explanation;
+import org.apache.lucene.search.Scorer;
import org.apache.lucene.util.BytesRefBuilder;
import org.apache.lucene.util.mutable.MutableValue;
import org.apache.lucene.util.mutable.MutableValueFloat;
@@ -136,10 +137,23 @@ public abstract class FunctionValues {
return Explanation.match(floatVal(doc), toString(doc));
}
+ /**
+ * Yields a {@link Scorer} that matches all documents,
+ * and that which produces scores equal to {@link #floatVal(int)}.
+ */
public ValueSourceScorer getScorer(IndexReader reader) {
- return new ValueSourceScorer(reader, this);
+ return new ValueSourceScorer(reader, this) {
+ @Override
+ public boolean matches(int doc) {
+ return true;
+ }
+ };
}
+ /**
+ * Yields a {@link Scorer} that matches documents with values between the specified range,
+ * and that which produces scores equal to {@link #floatVal(int)}.
+ */
// A RangeValueSource can't easily be a ValueSource that takes another ValueSource
// because it needs different behavior depending on the type of fields. There is also
// a setup cost - parsing and normalizing params, and doing a binary search on the StringIndex.
@@ -165,7 +179,7 @@ public abstract class FunctionValues {
if (includeLower && includeUpper) {
return new ValueSourceScorer(reader, this) {
@Override
- public boolean matchesValue(int doc) {
+ public boolean matches(int doc) {
float docVal = floatVal(doc);
return docVal >= l && docVal <= u;
}
@@ -174,7 +188,7 @@ public abstract class FunctionValues {
else if (includeLower && !includeUpper) {
return new ValueSourceScorer(reader, this) {
@Override
- public boolean matchesValue(int doc) {
+ public boolean matches(int doc) {
float docVal = floatVal(doc);
return docVal >= l && docVal < u;
}
@@ -183,7 +197,7 @@ public abstract class FunctionValues {
else if (!includeLower && includeUpper) {
return new ValueSourceScorer(reader, this) {
@Override
- public boolean matchesValue(int doc) {
+ public boolean matches(int doc) {
float docVal = floatVal(doc);
return docVal > l && docVal <= u;
}
@@ -192,7 +206,7 @@ public abstract class FunctionValues {
else {
return new ValueSourceScorer(reader, this) {
@Override
- public boolean matchesValue(int doc) {
+ public boolean matches(int doc) {
float docVal = floatVal(doc);
return docVal > l && docVal < u;
}
Modified: lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/ValueSourceScorer.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/ValueSourceScorer.java?rev=1694546&r1=1694545&r2=1694546&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/ValueSourceScorer.java (original)
+++ lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/ValueSourceScorer.java Thu Aug 6 17:55:56 2015
@@ -20,71 +20,74 @@ package org.apache.lucene.queries.functi
import java.io.IOException;
import org.apache.lucene.index.IndexReader;
-import org.apache.lucene.index.MultiFields;
+import org.apache.lucene.search.DocIdSetIterator;
import org.apache.lucene.search.Scorer;
-import org.apache.lucene.util.Bits;
+import org.apache.lucene.search.TwoPhaseIterator;
/**
* {@link Scorer} which returns the result of {@link FunctionValues#floatVal(int)} as
- * the score for a document.
+ * the score for a document, and which filters out documents that don't match {@link #matches(int)}.
+ * This Scorer has a {@link TwoPhaseIterator}. This is similar to {@link FunctionQuery},
+ * but this one has no {@link org.apache.lucene.search.Weight} normalization factors/multipliers
+ * and that one doesn't filter either.
+ * <p>
+ * Note: If the scores are needed, then the underlying value will probably be
+ * fetched/computed twice -- once to filter and next to return the score. If that's non-trivial then
+ * consider wrapping it in an implementation that will cache the current value.
+ * </p>
+ *
+ * @see FunctionQuery
+ * @lucene.experimental
*/
-public class ValueSourceScorer extends Scorer {
- protected final IndexReader reader;
- private int doc = -1;
- protected final int maxDoc;
+public abstract class ValueSourceScorer extends Scorer {
protected final FunctionValues values;
- protected boolean checkDeletes;
- private final Bits liveDocs;
+ private final TwoPhaseIterator twoPhaseIterator;
+ private final DocIdSetIterator disi;
+ //TODO use LeafReaderContext not IndexReader?
protected ValueSourceScorer(IndexReader reader, FunctionValues values) {
- super(null);
- this.reader = reader;
- this.maxDoc = reader.maxDoc();
+ super(null);//no weight
this.values = values;
- setCheckDeletes(true);
- this.liveDocs = MultiFields.getLiveDocs(reader);
+ this.twoPhaseIterator = new TwoPhaseIterator(DocIdSetIterator.all(reader.maxDoc())) { // no approximation!
+ @Override
+ public boolean matches() throws IOException {
+ return ValueSourceScorer.this.matches(docID());
+ }
+ };
+ this.disi = TwoPhaseIterator.asDocIdSetIterator(twoPhaseIterator);
}
- public IndexReader getReader() {
- return reader;
- }
-
- public void setCheckDeletes(boolean checkDeletes) {
- this.checkDeletes = checkDeletes && reader.hasDeletions();
- }
+ /** Override to decide if this document matches. It's called by {@link TwoPhaseIterator#matches()}. */
+ public abstract boolean matches(int doc);
- public boolean matches(int doc) {
- return (!checkDeletes || liveDocs.get(doc)) && matchesValue(doc);
- }
-
- public boolean matchesValue(int doc) {
- return true;
+ @Override
+ public TwoPhaseIterator asTwoPhaseIterator() {
+ return twoPhaseIterator;
}
@Override
public int docID() {
- return doc;
+ return disi.docID();
}
@Override
public int nextDoc() throws IOException {
- for (; ;) {
- doc++;
- if (doc >= maxDoc) return doc = NO_MORE_DOCS;
- if (matches(doc)) return doc;
- }
+ return disi.nextDoc();
}
@Override
public int advance(int target) throws IOException {
- // also works fine when target==NO_MORE_DOCS
- doc = target - 1;
- return nextDoc();
+ return disi.advance(target);
}
@Override
public float score() throws IOException {
- return values.floatVal(doc);
+ // (same as FunctionQuery, but no qWeight) TODO consider adding configurable qWeight
+ float score = values.floatVal(disi.docID());
+ // Current Lucene priority queues can't handle NaN and -Infinity, so
+ // map to -Float.MAX_VALUE. This conditional handles both -infinity
+ // and NaN since comparisons with NaN are always false.
+ return score > Float.NEGATIVE_INFINITY ? score : -Float.MAX_VALUE;
}
@Override
@@ -94,6 +97,6 @@ public class ValueSourceScorer extends S
@Override
public long cost() {
- return maxDoc;
+ return disi.cost();
}
}
Modified: lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/DocTermsIndexDocValues.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/DocTermsIndexDocValues.java?rev=1694546&r1=1694545&r2=1694546&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/DocTermsIndexDocValues.java (original)
+++ lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/DocTermsIndexDocValues.java Thu Aug 6 17:55:56 2015
@@ -19,9 +19,9 @@ package org.apache.lucene.queries.functi
import java.io.IOException;
-import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.index.DocValues;
import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.index.SortedDocValues;
import org.apache.lucene.queries.function.FunctionValues;
import org.apache.lucene.queries.function.ValueSource;
@@ -124,7 +124,7 @@ public abstract class DocTermsIndexDocVa
return new ValueSourceScorer(reader, this) {
@Override
- public boolean matchesValue(int doc) {
+ public boolean matches(int doc) {
int ord = termsIndex.getOrd(doc);
return ord >= ll && ord <= uu;
}
Modified: lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/DoubleDocValues.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/DoubleDocValues.java?rev=1694546&r1=1694545&r2=1694546&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/DoubleDocValues.java (original)
+++ lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/DoubleDocValues.java Thu Aug 6 17:55:56 2015
@@ -106,7 +106,7 @@ public abstract class DoubleDocValues ex
if (includeLower && includeUpper) {
return new ValueSourceScorer(reader, this) {
@Override
- public boolean matchesValue(int doc) {
+ public boolean matches(int doc) {
double docVal = doubleVal(doc);
return docVal >= l && docVal <= u;
}
@@ -115,7 +115,7 @@ public abstract class DoubleDocValues ex
else if (includeLower && !includeUpper) {
return new ValueSourceScorer(reader, this) {
@Override
- public boolean matchesValue(int doc) {
+ public boolean matches(int doc) {
double docVal = doubleVal(doc);
return docVal >= l && docVal < u;
}
@@ -124,7 +124,7 @@ public abstract class DoubleDocValues ex
else if (!includeLower && includeUpper) {
return new ValueSourceScorer(reader, this) {
@Override
- public boolean matchesValue(int doc) {
+ public boolean matches(int doc) {
double docVal = doubleVal(doc);
return docVal > l && docVal <= u;
}
@@ -133,7 +133,7 @@ public abstract class DoubleDocValues ex
else {
return new ValueSourceScorer(reader, this) {
@Override
- public boolean matchesValue(int doc) {
+ public boolean matches(int doc) {
double docVal = doubleVal(doc);
return docVal > l && docVal < u;
}
Modified: lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/IntDocValues.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/IntDocValues.java?rev=1694546&r1=1694545&r2=1694546&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/IntDocValues.java (original)
+++ lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/IntDocValues.java Thu Aug 6 17:55:56 2015
@@ -103,7 +103,7 @@ public abstract class IntDocValues exten
return new ValueSourceScorer(reader, this) {
@Override
- public boolean matchesValue(int doc) {
+ public boolean matches(int doc) {
int val = intVal(doc);
// only check for deleted if it's the default value
// if (val==0 && reader.isDeleted(doc)) return false;
Modified: lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/LongDocValues.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/LongDocValues.java?rev=1694546&r1=1694545&r2=1694546&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/LongDocValues.java (original)
+++ lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/LongDocValues.java Thu Aug 6 17:55:56 2015
@@ -112,7 +112,7 @@ public abstract class LongDocValues exte
return new ValueSourceScorer(reader, this) {
@Override
- public boolean matchesValue(int doc) {
+ public boolean matches(int doc) {
long val = longVal(doc);
// only check for deleted if it's the default value
// if (val==0 && reader.isDeleted(doc)) return false;
Modified: lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/EnumFieldSource.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/EnumFieldSource.java?rev=1694546&r1=1694545&r2=1694546&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/EnumFieldSource.java (original)
+++ lucene/dev/branches/branch_5x/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/EnumFieldSource.java Thu Aug 6 17:55:56 2015
@@ -20,9 +20,9 @@ package org.apache.lucene.queries.functi
import java.io.IOException;
import java.util.Map;
-import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.index.DocValues;
import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.index.NumericDocValues;
import org.apache.lucene.queries.function.FunctionValues;
import org.apache.lucene.queries.function.ValueSourceScorer;
@@ -143,7 +143,7 @@ public class EnumFieldSource extends Fie
return new ValueSourceScorer(reader, this) {
@Override
- public boolean matchesValue(int doc) {
+ public boolean matches(int doc) {
int val = intVal(doc);
// only check for deleted if it's the default value
// if (val==0 && reader.isDeleted(doc)) return false;
Modified: lucene/dev/branches/branch_5x/lucene/queries/src/test/org/apache/lucene/queries/function/TestFieldScoreQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/queries/src/test/org/apache/lucene/queries/function/TestFieldScoreQuery.java?rev=1694546&r1=1694545&r2=1694546&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/queries/src/test/org/apache/lucene/queries/function/TestFieldScoreQuery.java (original)
+++ lucene/dev/branches/branch_5x/lucene/queries/src/test/org/apache/lucene/queries/function/TestFieldScoreQuery.java Thu Aug 6 17:55:56 2015
@@ -20,6 +20,7 @@ package org.apache.lucene.queries.functi
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.search.IndexSearcher;
+import org.apache.lucene.search.Query;
import org.apache.lucene.search.QueryUtils;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
@@ -59,7 +60,7 @@ public class TestFieldScoreQuery extends
// Test that FieldScoreQuery returns docs in expected order.
private void doTestRank (ValueSource valueSource) throws Exception {
- FunctionQuery functionQuery = new FunctionQuery(valueSource);
+ Query functionQuery = getFunctionQuery(valueSource);
IndexReader r = DirectoryReader.open(dir);
IndexSearcher s = newSearcher(r);
log("test: "+ functionQuery);
@@ -92,7 +93,7 @@ public class TestFieldScoreQuery extends
// Test that FieldScoreQuery returns docs with expected score.
private void doTestExactScore (ValueSource valueSource) throws Exception {
- FunctionQuery functionQuery = new FunctionQuery(valueSource);
+ Query functionQuery = getFunctionQuery(valueSource);
IndexReader r = DirectoryReader.open(dir);
IndexSearcher s = newSearcher(r);
TopDocs td = s.search(functionQuery,1000);
@@ -108,4 +109,14 @@ public class TestFieldScoreQuery extends
r.close();
}
+ protected Query getFunctionQuery(ValueSource valueSource) {
+ if (random().nextBoolean()) {
+ return new FunctionQuery(valueSource);
+ } else {
+ Integer lower = (random().nextBoolean() ? null : 1);//1 is the lowest value
+ Integer upper = (random().nextBoolean() ? null : N_DOCS); // N_DOCS is the highest value
+ return new FunctionRangeQuery(valueSource, lower, upper, true, true);//will match all docs based on the indexed data
+ }
+ }
+
}
Modified: lucene/dev/branches/branch_5x/lucene/spatial/src/java/org/apache/lucene/spatial/vector/PointVectorStrategy.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/spatial/src/java/org/apache/lucene/spatial/vector/PointVectorStrategy.java?rev=1694546&r1=1694545&r2=1694546&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/spatial/src/java/org/apache/lucene/spatial/vector/PointVectorStrategy.java (original)
+++ lucene/dev/branches/branch_5x/lucene/spatial/src/java/org/apache/lucene/spatial/vector/PointVectorStrategy.java Thu Aug 6 17:55:56 2015
@@ -25,7 +25,7 @@ import com.spatial4j.core.shape.Shape;
import org.apache.lucene.document.DoubleField;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.FieldType;
-import org.apache.lucene.queries.function.FunctionQuery;
+import org.apache.lucene.queries.function.FunctionRangeQuery;
import org.apache.lucene.queries.function.ValueSource;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
@@ -40,8 +40,6 @@ import org.apache.lucene.spatial.Spatial
import org.apache.lucene.spatial.query.SpatialArgs;
import org.apache.lucene.spatial.query.SpatialOperation;
import org.apache.lucene.spatial.query.UnsupportedSpatialOperation;
-import org.apache.lucene.spatial.util.CachingDoubleValueSource;
-import org.apache.lucene.spatial.util.ValueSourceFilter;
/**
* Simple {@link SpatialStrategy} which represents Points in two numeric {@link
@@ -152,80 +150,19 @@ public class PointVectorStrategy extends
} else if (shape instanceof Circle) {
Circle circle = (Circle)shape;
Rectangle bbox = circle.getBoundingBox();
- ValueSourceFilter vsf = new ValueSourceFilter(
- new QueryWrapperFilter(makeWithin(bbox)),
- makeDistanceValueSource(circle.getCenter()),
- 0,
- circle.getRadius() );
- return new ConstantScoreQuery(vsf);
+ Query approxQuery = makeWithin(bbox);
+ BooleanQuery.Builder bqBuilder = new BooleanQuery.Builder();
+ FunctionRangeQuery vsRangeQuery =
+ new FunctionRangeQuery(makeDistanceValueSource(circle.getCenter()), 0.0, circle.getRadius(), true, true);
+ bqBuilder.add(approxQuery, BooleanClause.Occur.FILTER);//should have lowest "cost" value; will drive iteration
+ bqBuilder.add(vsRangeQuery, BooleanClause.Occur.FILTER);
+ return new ConstantScoreQuery(bqBuilder.build());
} else {
throw new UnsupportedOperationException("Only Rectangles and Circles are currently supported, " +
"found [" + shape.getClass() + "]");//TODO
}
}
- //TODO this is basically old code that hasn't been verified well and should probably be removed
- public Query makeQueryDistanceScore(SpatialArgs args) {
- // For starters, just limit the bbox
- Shape shape = args.getShape();
- if (!(shape instanceof Rectangle || shape instanceof Circle)) {
- throw new UnsupportedOperationException("Only Rectangles and Circles are currently supported, " +
- "found [" + shape.getClass() + "]");//TODO
- }
-
- Rectangle bbox = shape.getBoundingBox();
-
- if (bbox.getCrossesDateLine()) {
- throw new UnsupportedOperationException( "Crossing dateline not yet supported" );
- }
-
- ValueSource valueSource = null;
-
- Query spatial = null;
- SpatialOperation op = args.getOperation();
-
- if( SpatialOperation.is( op,
- SpatialOperation.BBoxWithin,
- SpatialOperation.BBoxIntersects ) ) {
- spatial = makeWithin(bbox);
- }
- else if( SpatialOperation.is( op,
- SpatialOperation.Intersects,
- SpatialOperation.IsWithin ) ) {
- spatial = makeWithin(bbox);
- if( args.getShape() instanceof Circle) {
- Circle circle = (Circle)args.getShape();
-
- // Make the ValueSource
- valueSource = makeDistanceValueSource(shape.getCenter());
-
- ValueSourceFilter vsf = new ValueSourceFilter(
- new QueryWrapperFilter( spatial ), valueSource, 0, circle.getRadius() );
-
- spatial = new FilteredQuery( new MatchAllDocsQuery(), vsf );
- }
- }
- else if( op == SpatialOperation.IsDisjointTo ) {
- spatial = makeDisjoint(bbox);
- }
-
- if( spatial == null ) {
- throw new UnsupportedSpatialOperation(args.getOperation());
- }
-
- if( valueSource != null ) {
- valueSource = new CachingDoubleValueSource(valueSource);
- }
- else {
- valueSource = makeDistanceValueSource(shape.getCenter());
- }
- Query spatialRankingQuery = new FunctionQuery(valueSource);
- BooleanQuery.Builder bq = new BooleanQuery.Builder();
- bq.add(spatial,BooleanClause.Occur.MUST);
- bq.add(spatialRankingQuery,BooleanClause.Occur.MUST);
- return bq.build();
- }
-
/**
* Constructs a query to retrieve documents that fully contain the input envelope.
*/
@@ -254,21 +191,6 @@ public class PointVectorStrategy extends
true);//inclusive
}
- /**
- * Constructs a query to retrieve documents that fully contain the input envelope.
- */
- private Query makeDisjoint(Rectangle bbox) {
- if (bbox.getCrossesDateLine())
- throw new UnsupportedOperationException("makeDisjoint doesn't handle dateline cross");
- Query qX = rangeQuery(fieldNameX, bbox.getMinX(), bbox.getMaxX());
- Query qY = rangeQuery(fieldNameY, bbox.getMinY(), bbox.getMaxY());
-
- BooleanQuery.Builder bq = new BooleanQuery.Builder();
- bq.add(qX,BooleanClause.Occur.MUST_NOT);
- bq.add(qY,BooleanClause.Occur.MUST_NOT);
- return bq.build();
- }
-
}
Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/FunctionRangeQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/FunctionRangeQuery.java?rev=1694546&r1=1694545&r2=1694546&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/FunctionRangeQuery.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/FunctionRangeQuery.java Thu Aug 6 17:55:56 2015
@@ -17,6 +17,9 @@
package org.apache.solr.search;
+import java.io.IOException;
+import java.util.Map;
+
import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.queries.function.FunctionValues;
import org.apache.lucene.queries.function.ValueSource;
@@ -24,9 +27,6 @@ import org.apache.lucene.queries.functio
import org.apache.lucene.search.IndexSearcher;
import org.apache.solr.search.function.ValueSourceRangeFilter;
-import java.io.IOException;
-import java.util.Map;
-
// This class works as either a normal constant score query, or as a PostFilter using a collector
public class FunctionRangeQuery extends SolrConstantScoreQuery implements PostFilter {
final ValueSourceRangeFilter rangeFilt;
@@ -53,7 +53,8 @@ public class FunctionRangeQuery extends
@Override
public void collect(int doc) throws IOException {
- if (doc<maxdoc && scorer.matches(doc)) {
+ assert doc < maxdoc;
+ if (scorer.matches(doc)) {
leafDelegate.collect(doc);
}
}