From dd8a6b3abcc90c50a16167054e2f3cdcee40c863 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wieland=20Sch=C3=B6bl?= Date: Tue, 22 Jun 2021 11:36:59 +0200 Subject: [PATCH] feat: support geo shape filter --- package.json | 1 + src/storage/elasticsearch/common.ts | 21 +++++++++++++++++++++ src/storage/elasticsearch/query.ts | 11 ++++++++++- 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index f14197e9..e1af111f 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,7 @@ "express-prometheus-middleware": "1.2.0", "express-promise-router": "4.1.0", "fs-extra": "9.1.0", + "geojson": "0.5.0", "got": "11.8.2", "moment": "2.29.1", "morgan": "1.10.0", diff --git a/src/storage/elasticsearch/common.ts b/src/storage/elasticsearch/common.ts index 8b4517d7..53f0884b 100644 --- a/src/storage/elasticsearch/common.ts +++ b/src/storage/elasticsearch/common.ts @@ -24,6 +24,7 @@ import { // @elastic/elasticsearch package // tslint:disable-next-line:no-implicit-dependencies import {NameList} from 'elasticsearch'; +import {Polygon} from 'geojson'; /** * An elasticsearch aggregation bucket @@ -418,6 +419,26 @@ export interface ESGeoDistanceFilter { geo_distance: ESGeoDistanceFilterArguments; } +/** + * An Elasticsearch geo shape filter + * @see https://www.elastic.co/guide/en/elasticsearch/reference/5.6/query-dsl-geo-shape-query.html + */ +export interface ESGeoShapeFilter { + [fieldName: string]: { + /** + * Relation of the two shapes + * + * @see https://www.elastic.co/guide/en/elasticsearch/reference/5.6/query-dsl-geo-shape-query.html#_spatial_relations + */ + relation: 'intersects' | 'disjoint' | 'within' | 'contains'; + + /** + * Geo Shape + */ + shape: Polygon; + }; +} + /** * Filter arguments for an elasticsearch boolean filter * @see https://www.elastic.co/guide/en/elasticsearch/reference/5.6/query-dsl-bool-query.html diff --git a/src/storage/elasticsearch/query.ts b/src/storage/elasticsearch/query.ts index 012f0679..e4f14e86 100644 --- a/src/storage/elasticsearch/query.ts +++ b/src/storage/elasticsearch/query.ts @@ -28,7 +28,7 @@ import { import { ElasticsearchConfig, ESDateRange, - ESDateRangeFilter, ESGenericRange, ESNumericRangeFilter, + ESDateRangeFilter, ESGenericRange, ESGeoShapeFilter, ESNumericRangeFilter, ESRangeFilter, ScriptSort, } from './common'; @@ -177,6 +177,15 @@ export function buildFilter(filter: SCSearchFilter): dateRangeFilter.range[filter.arguments.field] = dateRangeObject; return dateRangeFilter; + case 'geo': + const geoShapeObject: ESGeoShapeFilter = { + [filter.arguments.field]: { + shape: filter.arguments.shape, + relation: filter.arguments.spatialRelation, + }, + }; + + return geoShapeObject; } }