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.
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
Je ne savais rien à propos de percolate jusqu'à présent, merci pour votre commentaire, je vais essayer de lire plus à ce sujet. – mhndev
Je suis allé de l'avant et vous a donné un indice rapide à la solution. – Val