You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by iv...@apache.org on 2020/11/25 07:46:59 UTC
[lucene-solr] branch branch_8x updated: LUCENE-9606: Wrap boolean
queries generated by shape fields with a Constant score query (#2093)
This is an automated email from the ASF dual-hosted git repository.
ivera pushed a commit to branch branch_8x
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git
The following commit(s) were added to refs/heads/branch_8x by this push:
new b8239d2 LUCENE-9606: Wrap boolean queries generated by shape fields with a Constant score query (#2093)
b8239d2 is described below
commit b8239d2f799a668548d10a75ce8be3e652fef804
Author: Ignacio Vera <iv...@apache.org>
AuthorDate: Wed Nov 25 08:40:38 2020 +0100
LUCENE-9606: Wrap boolean queries generated by shape fields with a Constant score query (#2093)
---
lucene/CHANGES.txt | 2 ++
.../org/apache/lucene/document/LatLonShape.java | 3 ++-
.../java/org/apache/lucene/document/XYShape.java | 3 ++-
.../apache/lucene/document/TestLatLonShape.java | 28 ++++++++++++++++++++++
.../org/apache/lucene/document/TestXYShape.java | 28 ++++++++++++++++++++++
5 files changed, 62 insertions(+), 2 deletions(-)
diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt
index cebafc7..cd5117d 100644
--- a/lucene/CHANGES.txt
+++ b/lucene/CHANGES.txt
@@ -52,6 +52,8 @@ Bug Fixes
* LUCENE-9595: Make Component2D#withinPoint implementations consistent with ShapeQuery logic.
(Ignacio Vera)
+
+* LUCENE-9606: Wrap boolean queries generated by shape fields with a Constant score query. (Ignacio Vera)
Other
---------------------
diff --git a/lucene/core/src/java/org/apache/lucene/document/LatLonShape.java b/lucene/core/src/java/org/apache/lucene/document/LatLonShape.java
index 134b7d9..5e442dd 100644
--- a/lucene/core/src/java/org/apache/lucene/document/LatLonShape.java
+++ b/lucene/core/src/java/org/apache/lucene/document/LatLonShape.java
@@ -32,6 +32,7 @@ import org.apache.lucene.geo.Tessellator;
import org.apache.lucene.index.PointValues; // javadoc
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
+import org.apache.lucene.search.ConstantScoreQuery;
import org.apache.lucene.search.Query;
import static org.apache.lucene.geo.GeoEncodingUtils.encodeLatitude;
@@ -170,7 +171,7 @@ public class LatLonShape {
builder.add(new LatLonShapeQuery(field, QueryRelation.CONTAINS, geometry), BooleanClause.Occur.MUST);
}
}
- return builder.build();
+ return new ConstantScoreQuery(builder.build());
}
}
diff --git a/lucene/core/src/java/org/apache/lucene/document/XYShape.java b/lucene/core/src/java/org/apache/lucene/document/XYShape.java
index 7eb8403..fa24a78 100644
--- a/lucene/core/src/java/org/apache/lucene/document/XYShape.java
+++ b/lucene/core/src/java/org/apache/lucene/document/XYShape.java
@@ -31,6 +31,7 @@ import org.apache.lucene.geo.XYLine;
import org.apache.lucene.geo.XYPolygon;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
+import org.apache.lucene.search.ConstantScoreQuery;
import org.apache.lucene.search.Query;
import static org.apache.lucene.geo.XYEncodingUtils.encode;
@@ -132,7 +133,7 @@ public class XYShape {
for (int i = 0; i < xyGeometries.length; i++) {
builder.add(newGeometryQuery(field, queryRelation, xyGeometries[i]), BooleanClause.Occur.MUST);
}
- return builder.build();
+ return new ConstantScoreQuery(builder.build());
}
return new XYShapeQuery(field, queryRelation, xyGeometries);
}
diff --git a/lucene/core/src/test/org/apache/lucene/document/TestLatLonShape.java b/lucene/core/src/test/org/apache/lucene/document/TestLatLonShape.java
index 9773ffb..a712ac6 100644
--- a/lucene/core/src/test/org/apache/lucene/document/TestLatLonShape.java
+++ b/lucene/core/src/test/org/apache/lucene/document/TestLatLonShape.java
@@ -25,6 +25,7 @@ import org.apache.lucene.geo.GeoTestUtil;
import org.apache.lucene.geo.GeoUtils;
import org.apache.lucene.geo.LatLonGeometry;
import org.apache.lucene.geo.Line;
+import org.apache.lucene.geo.Point;
import org.apache.lucene.geo.Polygon;
import org.apache.lucene.geo.Rectangle;
import org.apache.lucene.geo.Tessellator;
@@ -36,6 +37,7 @@ import org.apache.lucene.index.RandomIndexWriter;
import org.apache.lucene.index.SerialMergeScheduler;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
+import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.util.IOUtils;
import org.apache.lucene.util.LuceneTestCase;
@@ -829,6 +831,32 @@ public class TestLatLonShape extends LuceneTestCase {
IOUtils.close(r, dir);
}
+ public void testContainsWrappingBooleanQuery() throws Exception {
+
+ double[] lats = new double[] {-30, -30, 30, 30, -30};
+ double[] lons = new double[] {-30, 30, 30, -30, -30};
+ Polygon polygon = new Polygon(lats, lons);
+
+ Directory dir = newDirectory();
+ RandomIndexWriter writer = new RandomIndexWriter(random(), dir);
+ Document document = new Document();
+ addPolygonsToDoc(FIELDNAME, document, polygon);
+ writer.addDocument(document);
+
+ //// search
+ IndexReader r = writer.getReader();
+ writer.close();
+ IndexSearcher s = newSearcher(r);
+
+ LatLonGeometry[] geometries = new LatLonGeometry[] { new Rectangle(0, 1, 0, 1), new Point(4, 4) };
+ // geometries within the polygon
+ Query q = LatLonShape.newGeometryQuery(FIELDNAME, QueryRelation.CONTAINS, geometries);
+ TopDocs topDocs = s.search(q, 1);
+ assertEquals(1, topDocs.scoreDocs.length);
+ assertEquals(1.0, topDocs.scoreDocs[0].score, 0.0);
+ IOUtils.close(r, dir);
+ }
+
public void testContainsIndexedGeometryCollection() throws Exception {
Directory dir = newDirectory();
RandomIndexWriter w = new RandomIndexWriter(random(), dir);
diff --git a/lucene/core/src/test/org/apache/lucene/document/TestXYShape.java b/lucene/core/src/test/org/apache/lucene/document/TestXYShape.java
index 3a90977..2bf27fe 100644
--- a/lucene/core/src/test/org/apache/lucene/document/TestXYShape.java
+++ b/lucene/core/src/test/org/apache/lucene/document/TestXYShape.java
@@ -25,12 +25,14 @@ import org.apache.lucene.geo.Tessellator;
import org.apache.lucene.geo.XYCircle;
import org.apache.lucene.geo.XYGeometry;
import org.apache.lucene.geo.XYLine;
+import org.apache.lucene.geo.XYPoint;
import org.apache.lucene.geo.XYPolygon;
import org.apache.lucene.geo.XYRectangle;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.RandomIndexWriter;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
+import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.util.IOUtils;
import org.apache.lucene.util.LuceneTestCase;
@@ -202,6 +204,32 @@ public class TestXYShape extends LuceneTestCase {
IOUtils.close(r, dir);
}
+ public void testContainsWrappingBooleanQuery() throws Exception {
+
+ float[] ys = new float[] {-30, -30, 30, 30, -30};
+ float[] xs = new float[] {-30, 30, 30, -30, -30};
+ XYPolygon polygon = new XYPolygon(xs, ys);
+
+ Directory dir = newDirectory();
+ RandomIndexWriter writer = new RandomIndexWriter(random(), dir);
+ Document document = new Document();
+ addPolygonsToDoc(FIELDNAME, document, polygon);
+ writer.addDocument(document);
+
+ //// search
+ IndexReader r = writer.getReader();
+ writer.close();
+ IndexSearcher s = newSearcher(r);
+
+ XYGeometry[] geometries = new XYGeometry[] { new XYRectangle(0, 1, 0, 1), new XYPoint(4, 4) };
+ // geometries within the polygon
+ Query q = XYShape.newGeometryQuery(FIELDNAME, QueryRelation.CONTAINS, geometries);
+ TopDocs topDocs = s.search(q, 1);
+ assertEquals(1, topDocs.scoreDocs.length);
+ assertEquals(1.0, topDocs.scoreDocs[0].score, 0.0);
+ IOUtils.close(r, dir);
+ }
+
public void testContainsIndexedGeometryCollection() throws Exception {
Directory dir = newDirectory();
RandomIndexWriter w = new RandomIndexWriter(random(), dir);