Geospatial queries for Point
and LineString
Performing geospatial queries for Point
and LineString
.
Defining schemas for geospatial Point
and LineString
types
Define the schema for geospatial fields types. For example:
<?xml version="1.0" ?>
<schema name="spatial-no-jts" version="1.5">
<types>
<fieldType name="string" class="solr.StrField" />
<fieldType name="boolean" class="solr.BoolField" />
<!-- When geo="false", indicate worldBounds using ENVELOPE(minX, maxX, maxY, minY) notation -->
<fieldType name="rpt"
class="solr.SpatialRecursivePrefixTreeFieldType"
geo="false"
worldBounds="ENVELOPE(-1000, 1000, 1000, -1000)"
maxDistErr="0.001"
distanceUnits="degrees" />
</types>
<fields>
<field name="id" type="string" indexed="true" stored="true" />
<field name="point" type="rpt" indexed="true" stored="true" />
<field name="linestring" type="rpt" indexed="true" stored="true" />
</fields>
<uniqueKey>id</uniqueKey>
</schema>
Apache Solr™ geospatial field types
For Solr geospatial field types, declare each geospatial field type in the table schema. For example:
CREATE TABLE test (
id text PRIMARY KEY,
point 'PointType', linestring 'LineStringType');
Inserting or updating geospatial data
To insert or update data in the database, specify geotypes in the INSERT
or UPDATE
command.
For example:
INSERT INTO test (id, point, linestring) VALUES ('1', 'POINT(5 50)', 'LINESTRING (30 10, 10 30, 40 40)' ); INSERT INTO test (id, point, linestring) VALUES ('2', 'POINT(100 100)', 'LINESTRING (50 20, 20 40, 50 50)' );
Querying geospatial data
Find points within a 10 unit radius from point (4, 49):
SELECT * FROM test WHERE solr_query=' {"q":"*:*", "fq":"point:\"IsWithin(BUFFER(POINT(4.0 49.0), 10.0))\""}';
Find linestring that contains the point (10, 30):
SELECT * FROM test WHERE solr_query='linestring:"Intersects(POINT(10 30))"';
See this tutorial for details on how to index and query geospatial Polygons
and MultiPolygons
.