2017-08-15 4 views
1

J'ai environ 500 polygones fixes et je veux être en mesure de vérifier si de nombreux points sont dans lequel de ces polygones. peut-être que certains points se trouvent dans plusieurs de ces polygones et que certains d'entre eux ne font partie d'aucun polygone. Je sais que la geo_shape de elasticsearch peut m'aider mais comme je sais que je peux seulement, interroger un point pour savoir dans quel polygone il est.Trouver des polygones dont les points sont

donc par exemple pour 20 points que je dois vous connecter à ElasticSearch 20 fois (considérer rtt)

et si je charge tous les polygones dans mon processus et itérer sur les points et polygins il devrait être boucle imbriquée avec un nombre de 20 * 500 et dans chaque cycle, je devrais détecter si le point est dans le polygone ou non donc la vitesse d'exécution et aussi la quantité de mémoire dont ce script a besoin n'est pas ok je pense.

Quelqu'un peut-il m'aider avec une meilleure solution?

+0

Je pense que le meilleur moyen serait d'utiliser le type de mappage 'percolator' et de stocker une requête' geo_shape' par polygone. Ensuite, vous pouvez lancer une seule requête 'msearch' contenant une requête' percolate' pour chacun des points que vous voulez vérifier. Vous récupérerez pour chaque point, les polygones qui le contiennent. – Val

+0

Je ne savais rien à propos de percolate jusqu'à présent, merci pour votre commentaire, je vais essayer de lire plus à ce sujet. – mhndev

+0

Je suis allé de l'avant et vous a donné un indice rapide à la solution. – Val

Répondre

1

Je pense qu'un meilleur moyen serait d'utiliser le percolator mapping type. Tout d'abord, créez un index dans lequel vous stockez vos requêtes geo_shape (dans le type queries). Vous devez également définir la mise en correspondance de vos points (dans le type points) de sorte que ES sait ce qu'il est contre interroge:

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

Ensuite, vous pouvez indexer une requête geo_shape pour chacun de polygone déjà indexé. Ici, nous définissons une requête geo_shape pour chaque polygone que vous avez déjà stocké dans polygon-index:

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" 
        } 
       } 
      } 
    } 
} 

Enfin, vous pouvez émettre un msearch query unique contenant un percolate query pour chacun des points que vous souhaitez vérifier.

Une requête de percolation pour un seul point ressemblerait à ceci. Cette requête dit essentiellement: "trouvez-moi toutes les requêtes polygonales qui contiennent le point donné". Par conséquent, vous obtiendrez une liste de hits où chaque hit est une requête et contiendra l'ID du polygone (requête) qui correspond.

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

Alors maintenant, vous devez créer un de ceux pour chacun des points que vous voulez vérifier dans le format suivant:

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]}}}}} 
... 

vous récupérerez pour chaque point, les polygones qui contiennent il.