2016-03-31 7 views
0

Verwenden von Python 2.7 und elasticsearch-py.Wie filtere ich nach Geo-Distanz in elasticsearch-py?

die folgende JSON Gegeben:

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

Und die folgende Abbildung:

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

Wie würde ich die Orte innerhalb von 10 km von Breitengraden bekommen 40, Längengrad -70? Mein Versuch ist wie folgt:

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

Dies ist jedoch der folgende Fehler zu werfen:

... 
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') 

Nicht, dass beherrschen noch mit ES, so dass ich eine harte Zeit Vorstellungsvermögen haben, was Schema sollte ich verwenden um dieses Problem anzugehen.

Was gibt?

Antwort

1

Das Problem ist in Ihrem Mapping. Hier ist die feste Version

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

Hallo, vielen Dank für die Antwort. Es wirft immer noch den gleichen Fehler auf, auch wenn ich das Mapping bereits korrigiert habe. Lass es mich mit 'curl' testen. Vielleicht ist "elasticsearch-py" das Problem. – Manhattan

+0

Bitte überprüfen Sie das aktualisierte Mapping. Haben Sie Dokumente nach dem Ändern des Mappings neu indiziert? – Rahul

+0

+1: Dies hat mich auf eine halbe Antwort hingewiesen: die Zuordnung ist in der Tat falsch und das wird mir helfen. Ich stoße jedoch auf einen etwas neuen, aber damit verbundenen Fehler: Wie kann ich Datensätze ohne die Eigenschaft 'Addresses' einfügen, da diese Zuordnung für alle anderen Einträge mit der Eigenschaft 'Addresses' erforderlich ist? Ist es eine andere Zuordnungseigenschaft, die ich als optional festlegen muss? – Manhattan

Verwandte Themen