Geospatial queries for Point and LineString
How to perform 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))"';