2016-03-31 6 views
0

Utilisation de Python 2.7 et elasticsearch-py.Comment filtrer par géo-distance dans elasticsearch-py?

Compte tenu de la JSON suivante:

[ 
    { 
     "Name": 
     "Addresses": [ 
      "StreetAdd": "xxx", 
      "GeoLocation": { 
       "lat": xx, 
       "long": yy 
      } 
     ] 
    }, 
    { 
     // And so on. 
    } 
] 

Et le mapping suivant:

mapping = { 
    "mappings": { 
     "leads": { 
      "properties": { 
       "Addresses": { 
        "type": "nested", 
        "include_in_parent": "true", 
        "properties": { 
         "GeoLocation": "geo_point" 
        } 
       } 
      } 
     } 
    } 
} 

Comment pourrais-je obtenir les emplacements de 10 km de latitude 40, longitude -70? Ma tentative est la suivante:

search_body = { 
    "query" : { 
     "filtered": { 
      "query": { 
       "match_all" : { } 
      }, 
      "filter": { 
       "geo_distance": { 
        "distance": "10km", 
        "Addresses.GeoLocation": { 
         "lat": 40.0, 
         "lon": -70.0 
        } 
       } 
      } 
     } 
    }, 
    "size": 50 
} 

result = es.search(index=ES_INDEX, body=search_body, sort="Name:asc") 
for hit in result["hits"]["hits"]: 
    print hit["_source"]["Name"] 

Cependant, cela jette l'erreur suivante:

... 
C:\Users\xxx\AppData\Local\Continuum\Anaconda2\lib\site-packages\elasticsearch\connection\base.pyc in _raise_error(self, status_code, raw_data) 
    103    pass 
    104 
--> 105   raise HTTP_EXCEPTIONS.get(status_code, TransportError)(status_code, error_message, additional_info) 
    106 
    107 

RequestError: TransportError(400, u'search_phase_execution_exception') 

Pas encore que compétent avec ES, donc je vais avoir du mal à envisager ce schéma que je devrais utiliser aborder ce problème.

Ce qui donne?

Répondre

1

Le problème réside dans votre mappage. Voici la version corrigée

mapping = { 
    "mappings": { 
     "leads": { 
      "properties": { 
       "Addresses": { 
        "type": "nested", 
        "include_in_parent": "true", 
        "properties": { 
         "GeoLocation": { 
          "type":"geo_point" <-- Note the type here 
         } 
        } 
       } 
      } 
     } 
    } 
} 
+0

Salut, merci pour la réponse. Il lance toujours la même erreur, même si j'ai déjà corrigé le mapping. Laissez-moi le tester en utilisant curl. Peut-être que 'elasticsearch-py' est le problème. – Manhattan

+0

Veuillez vérifier le mappage mis à jour. Avez-vous réindexé des documents après avoir modifié le mappage? – Rahul

+0

+1: Cela m'a indiqué une demi-réponse: le mapping est en effet incorrect et cela m'aidera. Cependant, je rencontre une erreur quelque peu nouvelle mais liée: comment puis-je insérer des enregistrements sans la propriété 'Addresses' étant donné que ce mappage est requis pour toutes les autres entrées avec la propriété' Addresses'? Est-ce une autre propriété de mappage dont j'ai besoin pour la rendre facultative? – Manhattan