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ę!
'path' musi być' addresses' aw 'filtr geo_distance' trzeba mieć' ' "addresses.location" zamiast po prostu' ' "location" Przepraszam – Val
próbowałem tego, wraz z ".location". – marklar
Czy możesz spróbować odpowiedzi poniżej? – Val