我们使用AWS管理的Elasticsearch服务,最近从1.5升级到2.3.我们在python中使用elasticsearch-dsl包来构建我们的查询并设法迁移我们的大多数查询,但无论我尝试什么,geo_distance都会被破坏.
制图:
{ 'company': { 'properties': { 'id': {'type': 'integer'}, 'company_number': {'type': 'string'}, 'addresses': { 'type': 'nested', 'properties': { 'postcode': {'type': 'string', 'index': 'not_analyzed'}, 'location': {'type': 'geo_point'} } } } } }
Python代码使用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': {'filtered': {'filter': {'nested': {'filter': {'geo_distance': {'distance': u'3miles', 'location': '53.5411062377, -2.11485504709'}}, 'path': 'addresses'}}, 'query': {'match_all': {}}}}}
我们使用相同的映射在新的2.3上创建了一个全新的索引.
更新到elasticsearch-dsl == 2.1.0并尝试将过滤器转换为查询后:
geo_query = Q({"bool": { "must": [ { "geo_distance": { "distance": "test_distance", "addresses__location": test_location, } }, ] }})
这会生成以下查询:
{'query': {'bool': {'must': [{'geo_distance': {'distance': '3 miles', u'addresses.location': {'lat': '53.5411062377', 'lon': '-2.11485504709'}}}]}}}
我们得到以下异常:
RequestError: TransportError(400, u'search_phase_execution_exception', u'failed to find geo_point field [addresses.location]')
我尝试将该字段引用为"location","addresses.location","addresses"并使用旧的嵌套查询类型.我无法弄清楚映射是否在2.3中不再有效,或者我是否构造错误的查询.
查询
Q({'nested': {'filter': { 'geo_distance': {'distance': u'3miles', 'location': '53.5411062377, -2.11485504709'} }, 'path': 'addresses.location'}})
生成以下错误:
RequestError: TransportError(400, u'search_phase_execution_exception', u'[nested] nested object under path [addresses.location] is not of nested type')
我想我需要将lat_lon:True添加到地理坐标查询的映射中才能工作,但没有一个例子有它.
非常感谢任何帮助,谢谢!