2017-08-15 2 views
1

Punkte Ich habe etwa 500 feste Polygone und ich möchte in der Lage sein zu überprüfen, ob viele Punkte in welchen dieser Polygone sind. vielleicht sind einige Punkte in vielen dieser Polygone und einige sind überhaupt nicht in einem Polygon. Ich weiß, dass elasticsearch geo_shape kann mir helfen, aber wie ich weiß, kann ich nur Abfrage einen Punkt für das Wissen, in welchem ​​Polygon es ist.Finden Sie Polygone, die innerhalb

so zum Beispiel für 20 Punkte sollte ich eine Verbindung 20-mal Elasticsearch (man denke an RTT)

und wenn ich alle Polygone in meinem Prozess zu laden und iterieren Punkte und polygins sollte es mit der Zählung der 20 * Schleife verschachtelt werden 500 und in jedem Zyklus sollte ich erkennen, ob der Punkt in Polygon oder nicht ist, so dass sowohl die Geschwindigkeit der Ausführung und auch die Menge an Speicher dieses Skript brauchen, ist nicht in Ordnung, denke ich.

kann mir irgendein Körper mit einer besseren Lösung helfen?

+0

Ich denke, ein besserer Weg wäre, den "Percolator" Mapping-Typ zu verwenden und eine "geo_shape" -Abfrage für jedes Polygon zu speichern. Als nächstes können Sie eine einzelne "msearch" -Abfrage mit einer "Perkolat" -Abfrage für jeden der Punkte, die Sie überprüfen möchten, ausgeben. Sie erhalten für jeden Punkt die Polygone, die ihn enthalten. – Val

+0

Ich wusste bis jetzt nichts über Perkolat, Danke für Ihren Kommentar Ich werde versuchen, mehr darüber zu lesen. – mhndev

+0

Ich ging voran und gab Ihnen einen kurzen Hinweis auf die Lösung. – Val

Antwort

1

Ich denke, ein besserer Weg wäre, die percolator mapping type zu verwenden. Erstellen Sie zuerst einen Index, in dem Sie Ihre geo_shape Abfragen speichern (unter queries). Sie müssen auch die Abbildung Ihrer Punkte (im points-Typ) zu definieren, so dass ES weiß, was es gegen abfragt:

PUT /my-index 
{ 
    "mappings": { 
     "points": { 
      "properties": { 
       "point": { 
        "type": "geo_shape" 
       } 
      } 
     }, 
     "queries": { 
      "properties": { 
       "query": { 
        "type": "percolator" 
       } 
      } 
     } 
    } 
} 

Dann können Sie Index ein geo_shape Abfrage für jedes Ihrer bereits indiziert Polygon. Hier sind die Definition wir eine geo_shape Abfrage für jedes Polygon, die Sie bereits in polygon-index gespeichert haben:

PUT /my-index/queries/query-id-for-polygon-id 
{ 
    "query" : { 
      "geo_shape": { 
       "location": { 
        "indexed_shape": { 
         "index": "polygon-index", 
         "type": "polygon-type", 
         "id": "polygon-id", 
         "path": "polygon-field" 
        } 
       } 
      } 
    } 
} 

Schließlich können Sie eine einzelne msearch query Ausgabe einer percolate query für jeden der Punkte enthält, die Sie überprüfen möchten.

Eine Perkolatabfrage für einen einzelnen Punkt würde so aussehen. Diese Abfrage sagt im Wesentlichen: "Finde alle Polygonabfragen, die den gegebenen Punkt enthalten". Als Ergebnis erhalten Sie eine Trefferliste, bei der jeder Treffer eine Abfrage ist und die ID des entsprechenden Polygons (Abfrage) enthält.

POST /my-index/_search 
{ 
    "query" : { 
     "percolate" : { 
      "field" : "query", 
      "document_type" : "points", 
      "document" : { 
       "point" : { 
        "type" : "point", 
        "coordinates" : [-77.03653, 38.897676] 
       } 
      } 
     } 
    } 
} 

So, jetzt müssen Sie einer von denen für jeden der Punkte, die Sie in folgendem Format überprüfen, erstellen möchten:

POST /my-index/_search 
{} 
{"query": {"percolate": {"field": "query", "document_type" : "points", "document" : {"point" : {"type" : "point","coordinates" : [-77.03653, 38.897676]}}}}} 
{} 
{"query": {"percolate": {"field": "query", "document_type" : "points", "document" : {"point" : {"type" : "point","coordinates" : [-77.03653, 38.897676]}}}}} 
{} 
{"query": {"percolate": {"field": "query", "document_type" : "points", "document" : {"point" : {"type" : "point","coordinates" : [-77.03653, 38.897676]}}}}} 
{} 
{"query": {"percolate": {"field": "query", "document_type" : "points", "document" : {"point" : {"type" : "point","coordinates" : [-77.03653, 38.897676]}}}}} 
... 

Sie werden wieder für jeden Punkt, die Polygone, die enthalten es.

Verwandte Themen