2017-01-13 18 views
7

Korzystamy z usługi Elasticsearch zarządzanej przez AWS, a ostatnio zaktualizowaliśmy ją z wersji 1.5 do wersji 2.3. Korzystamy z pakietu elasticsearch-dsl w pythonie, aby budować nasze zapytania i udało się zmigrować większość naszych zapytań, ale geo_distance jest zepsute bez względu na to, co próbuję.Nie można zlokalizować zagnieżdżonego punktu po aktualizacji do elasticsearch 2.3

Mapowanie:

{ 
     'company': { 
      'properties': { 
       'id': {'type': 'integer'}, 
       'company_number': {'type': 'string'}, 
       'addresses': { 
        'type': 'nested', 
        'properties': { 
         'postcode': {'type': 'string', 'index': 'not_analyzed'}, 
         'location': {'type': 'geo_point'} 
        } 
       } 
      } 
     } 
} 

kod Python pracy z elasticsearch-dsl == 0.0.11

  test_location = '53.5411062377, -2.11485504709' 
      test_distance = "3miles" 
      location_filter = F("geo_distance", 
           location=test_location, 
           distance=test_distance) 
      query = query.filter("nested", 
           path="addresses", 
           filter=location_filter) 

Query wygenerowany przez bibliotekę:

{'query': {'filtered': {'filter': {'nested': {'filter': {'geo_distance': {'distance': u'3miles', 'location': '53.5411062377, -2.11485504709'}}, 'path': 'addresses'}}, 'query': {'match_all': {}}}}} 

Stworzyliśmy markę nowy indeks na nowym 2.3 z tym samym mapowaniem.

Po aktualizacji do elasticsearch-dsl == 2.1.0 i próbuje przekształcić filtrów zapytań:

geo_query = Q({"bool": { 
        "must": [ 
         { 
          "geo_distance": { 
           "distance": "test_distance", 
           "addresses__location": test_location, 
          } 
         }, 
        ] 
       }}) 

który generuje następujące zapytanie:

{'query': {'bool': {'must': [{'geo_distance': {'distance': '3 miles', u'addresses.location': {'lat': '53.5411062377', 'lon': '-2.11485504709'}}}]}}} 

Otrzymujemy następujący wyjątek:

RequestError: TransportError(400, u'search_phase_execution_exception', u'failed to find geo_point field [addresses.location]') 

Próbowałem odniesienia do pola jako "location", "addresses.location", "ad sukienki i używa starego, zagnieżdżonego typu zapytania. Nie mogę się dowiedzieć, czy mapowanie nie jest poprawne w wersji 2.3 lub jeśli konstruuję zapytanie błędnie.

Zapytanie

Q({'nested': {'filter': { 
         'geo_distance': {'distance': u'3miles', 'location': '53.5411062377, -2.11485504709'} 
        }, 
        'path': 'addresses.location'}}) 

generuje następujący błąd:

RequestError: TransportError(400, u'search_phase_execution_exception', u'[nested] nested object under path [addresses.location] is not of nested type') 

Chyba trzeba dodać lat_lon: true do mapowania dla zapytań geodistance do pracy, ale żaden z przykładów go mieć .

Każda pomoc byłaby bardzo ceniona, dziękuję!

+0

'path' musi być' addresses' aw 'filtr geo_distance' trzeba mieć' ' "addresses.location" zamiast po prostu' ' "location" Przepraszam – Val

+0

próbowałem tego, wraz z ".location". – marklar

+0

Czy możesz spróbować odpowiedzi poniżej? – Val

Odpowiedz

1

To powinno działać:

 test_location = '53.5411062377, -2.11485504709' 
     test_distance = "3miles" 
     location_query = Q("geo_distance", 
          addresses__location=test_location, 
          distance=test_distance) 
     query = query.filter("nested", 
          path="addresses", 
          query=location_query) 
+0

Spróbuję tak szybko, jak będę mógł! – marklar

+0

daj mi znać, jeśli to jeszcze nie zadziała, a my to wymyślimy. – Val

+0

Wygląda na to, że zadziałało, chociaż mogłem przysiąc, że już próbowałem! Myślałem, że przyczyną problemu nie było prawidłowe wysłanie mapowania podczas odtwarzania indeksu, ale tak czy inaczej teraz działa. Dziękuję bardzo za poświęcenie czasu na mój problem! – marklar