Térinformatikai támogatás az ElasticSearch alkalmazásban

1.Bevezetés

Az Elasticsearch leginkább a teljes szöveges keresési képességeiről ismert, de teljes térinformatikai támogatást is nyújt.

Az Elasticsearch beállításáról és az első lépésekről ebben az előző cikkben találhatunk többet.

Vessünk egy pillantást arra, hogyan menthetjük el a geo-adatokat az Elasticsearch alkalmazásban, és hogyan tudunk ezekben az adatokban keresni geo-lekérdezések segítségével.

2. Földrajzi adattípus

A geo-lekérdezések engedélyezéséhez manuálisan kell létrehoznunk az index hozzárendelését, és kifejezetten be kell állítanunk a mező leképezést.

A dinamikus leképezés nem fog működni a földrajzi típusok leképezésének beállítása közben.

Az Elasticsearch kétféle módon jeleníti meg a geodatákat:

  1. Földrajzi-hosszúsági párok geo-point mezőt használva
  2. Alatt meghatározott összetett forma GeoJSON geo-alakú mezőtípus használatával

Vizsgáljuk meg alaposabban a fenti kategóriákat:

2.1. Geo Point adattípus

A geo-point mezőtípus szélességi és hosszúsági párokat fogad el, amelyek a következőkre használhatók:

  • Keressen pontokat a központi ponttól egy bizonyos távolságon belül
  • Keressen pontokat egy mezőben vagy egy sokszögben
  • Összesítse a dokumentumokat földrajzilag vagy a központi ponttól való távolság szerint
  • Rendezze a dokumentumokat távolság szerint

Az alábbiakban bemutatunk egy mintatérképet a mező számára a geo-pont adatok mentéséhez:

PUT / index_name {"leképezések": {"TYPE_NAME": {"tulajdonságok": {"hely": {"type": "geo_point"}}}}}

Amint a fenti példából láthatjuk, típus mert elhelyezkedés mező az geo_point . Így most megadhatjuk a szélességi és hosszúsági párokat a elhelyezkedés a hely mezőben.

2.2. Geo Shape Adattípus

nem úgy mint geo-pont, földrajzi alak biztosítja a funkciót olyan összetett alakzatok mentésére és keresésére, mint a sokszög és a téglalap. Földrajzi forma adattípust kell használni, ha olyan dokumentumokban akarunk keresni, amelyek földrajzi pontokon kívüli alakzatokat tartalmaznak.

Vizsgáljuk meg a földrajzi alak adattípusának leképezését:

PUT / index_name {"leképezések": {"TYPE_NAME": {"tulajdonságok": {"hely": {"type": "geo_shape"}}}}}

Az Elasticsearch legújabb verziói háromszög alakú hálóvá bontják a megadott földrajzi alakzatot. A hivatalos dokumentáció szerint ez szinte tökéletes térbeli felbontást biztosít.

3. A földrajzi pont adatainak mentésének különböző módjai

3.1. Szélességi és hosszúsági objektum

PUT index_név / index_típus / 1 {"hely": {"lat": 23.02, "lon": 72.57}}

Itt geo-pont elhelyezkedés objektumként mentésre kerül a szélességi kör és hosszúság mint kulcsokat.

3.2. Földrajzi hosszúság és hosszúság pár

{"hely": "23.02,72.57"}

Itt, elhelyezkedés szélességi és hosszúsági párként van kifejezve, egyszerű karakterlánc formátumban. Felhívjuk figyelmét, hogy a szélességi és hosszúsági sorrend karakterlánc formátumban.

3.3. Geo Hash

{"location": "tsj4bys"}

Geo-point adatokat geo-hash formájában is megadhatunk, amint az a fenti példában látható. Az online eszközt használhatjuk a szélesség és hosszúság geo hash-vá konvertálására.

3.4. Földrajzi szélességi tömb

{"hely": [72.57, 23.02]}

A szélességi és hosszúsági sorrend megfordul, ha a szélességet és hosszúságot tömbként adjuk meg. Kezdetben a szélességi és hosszúsági párokat mind stringben, mind tömbben használták, később azonban megfordították, hogy megfeleljenek a GeoJSON által használt formátumnak.

4. A földrajzi adatok mentésének különböző módjai

4.1. Pont

POST / index / type {"hely": {"type": "pont", "koordináták": [72.57, 23.02]}}

Itt a geo alakú típus, amelyet megpróbálunk beilleszteni, a pont. Kérjük, vessen egy pillantást a elhelyezkedés mezőben van egy beágyazott objektum, amely mezőkből áll típus és koordináták. Ezek a metamezők segítenek az Elasticsearch számára a földrajzi alak és a tényleges adatok azonosításában.

4.2. LineString

POST / index / type {"hely": {"type": "vonalvezetés", "koordináták": [[77.57, 23.02], [77.59, 23.05]]}}

Itt beillesztjük vonalvezetés földrajzi alak. A koordináták vonalvezetés két pontból áll, azaz kezdő és végpont. LineString A földrajzi forma nagyon hasznos a navigációhoz.

4.3. Poligon

POST / index / type {"hely": {"type": "sokszög", "koordináták": [[[10.0, 0.0], [11.0, 0.0], [11.0, 1.0], [10.0, 1.0], [ 10,0, 0,0]]]}}

Itt beillesztjük poligon földrajzi alak. Kérjük, vessen egy pillantást a koordináták a fenti példában első és utolsó a sokszög koordinátáinak mindig meg kell egyezniük, azaz egy zárt sokszöggel.

Az Elasticsearch más GeoJSON struktúrákat is támogat. A többi támogatott formátum teljes listája az alábbiak szerint alakul:

  • MultiPoint
  • MultiLineString
  • MultiPolygon
  • GeometryCollection
  • Boríték
  • Kör

A fent támogatott formátumokra találhatunk példákat a hivatalos ES webhelyen.

Minden szerkezet esetében a belső típus és koordináták kötelező mezők. Ezenkívül az Elasticsearch bonyolult felépítése miatt a földrajzi mezők rendezése és visszakeresése jelenleg nem lehetséges. Így a földrajzi mezők lekérésének egyetlen módja a forrásmező.

5. ElasticSearch Geo Query

Most, hogy tudjuk, hogyan kell beilleszteni a földrajzi alakzatokat tartalmazó dokumentumokat, merüljünk el a rekordok beolvasásában a földrajzi lekérdezések segítségével. Mielőtt azonban elkezdenénk használni a Geo Queries alkalmazást, a következő API függvényekre lesz szükségünk a Java API támogatásához a Geo Queries számára:

 org.locationtech.spatial4j spatial4j 0.7 com.vividsolutions jts 1.13 xerces xercesImpl 

Megkereshetjük a fenti függőségeket a Maven Central adattárában is.

Az Elasticsearch különböző típusú földrajzi lekérdezéseket támogat, amelyek a következők:

5.1. Geo Shape Query

Ehhez szükség van a geo_shape feltérképezése.

Hasonló geo_shape típus, geo_shape GeoJSON struktúrát használ a dokumentumok lekérdezéséhez.

Az alábbiakban bemutatunk egy lekérdezésmintát az összes eső dokumentum lekérésére belül megadott bal és jobb alsó koordináták:

{"query": {"bool": {"must": {"match_all": {}}, "filter": {"geo_shape": {"region": {"shape": {"type": "boríték "," koordináták ": [[75.00, 25.0], [80.1, 30.2]]}," reláció ":" a "}}}}}}}

Itt, kapcsolat meghatározza térkapcsolati operátorok keresési időben használták.

Az alábbiakban a támogatott operátorok listája található:

  • INTERSECTS - (alapértelmezett) minden olyan dokumentumot visszaad, amelynek geo_shape mező keresztezi a lekérdezés geometriáját
  • KÜLÖNÁLLÓ - visszakeres minden olyan dokumentumot, amelynek geo_shape A mezőnek nincs semmi közös vonása a lekérdezés geometriájával
  • BELÜL - megkap minden dokumentumot, amelynek geo_shape mező a lekérdezés geometriáján belül van
  • TARTALMAZZA - visszaad minden olyan dokumentumot, amelynek geo_shape mező a lekérdezés geometriáját tartalmazza

Hasonlóképpen lekérdezhetünk különböző GeoJSON alakzatok segítségével.

A fenti lekérdezés Java kódja az alábbi:

Koordináta topLeft = új Koordináta (74, 31.2); Koordináta bottomRight = új Koordináta (81.1, 24); GeoShapeQueryBuilder qb = QueryBuilders.geoShapeQuery ("régió", új EnvelopeBuilder (topLeft, bottomRight) .buildGeometry ()); qb.relation (ShapeRelation.INTERSECTS);

5.2. Geo Bounding Box Query

A Geo Bounding Box lekérdezés az összes dokumentum lekérésére szolgál a pont helye alapján. Az alábbiakban bemutatunk egy mintát a határoló doboz lekérdezésére:

{"query": {"bool": {"must": {"match_all": {}}, "filter": {"geo_bounding_box": {"location": {"bottom_left": [28.3, 30.5], " top_right ": [31.8, 32.12]}}}}}}

Java kód a felső határoló mező lekérdezéséhez az alábbi:

QueryBuilders .geoBoundingBoxQuery ("hely"). SetCorners (31.8, 30.5, 28.3, 32.12);

A Geo Bounding Box lekérdezés hasonló formátumokat támogat, mint nálunk geo_point adattípus. A támogatott formátumokra vonatkozó lekérdezések a hivatalos oldalon találhatók.

5.3. Geo Distance Query

A földrajzi távolság lekérdezése az összes olyan dokumentum szűrésére szolgál, amelyek a pont megadott tartományával érkeznek.

Itt egy minta geo_distance lekérdezés:

{"query": {"bool": {"must": {"match_all": {}}, "filter": {"geo_distance": {"distance": "10miles", "location": [31.131,29.976 ]}}}}}

És itt van a Java-kód a fenti lekérdezéshez:

QueryBuilders .geoDistanceQuery ("hely") .pont (29.976, 31.131) .távolság (10, DistanceUnit.MILES);

Hasonló geo_point, A földrajzi távolság lekérdezése többféle formátumot is támogat a helykoordináták átadásához. A támogatott formátumokról további részletek a hivatalos oldalon találhatók.

5.4. Geo Poligon Lekérdezés

Lekérdezés az összes olyan rekord szűrésére, amelyeknek pontjai vannak az adott pontok sokszögén belül.

Nézzünk meg gyorsan egy mintakérdést:

{"query": {"bool": {"must": {"match_all": {}}, "filter": {"geo_polygon": {"location": {"points": [{"lat": 22,733 , "lon": 68.859}, {"lat": 24.733, "lon": 68.859}, {"lat": 23, "lon": 70.859}]}}}}}}

És a lekérdezés Java kódjánál:

List allPoints = new ArrayList (); allPoints.add (új GeoPoint (22.733, 68.859)); allPoints.add (új GeoPoint (24.733, 68.859)); allPoints.add (új GeoPoint (23, 70.859)); QueryBuilders.geoPolygonQuery ("hely", allPoints);

A Geo Polygon Query az alább említett formátumokat is támogatja:

  • lat-long mint tömb: [lon, lat]
  • lat-hosszú, mint egy karakterlánc: „lat, lon”
  • geo hash

geo_point Az adattípus kötelező a lekérdezés használatához.

6. Következtetés

Ebben a cikkben különféle leképezési lehetőségeket tárgyaltunk a földrajzi adatok indexeléséhez, azaz geo_point és geo_shape.

A tárolás különböző módjait is átéltük geo-adatok végül geo-lekérdezéseket és Java API-t figyeltünk meg az eredmények szűrésére geo lekérdezések segítségével.

Mint mindig, a kód is elérhető ebben a GitHub projektben.


$config[zx-auto] not found$config[zx-overlay] not found