我该如何解决“无法找到geo_point字段[pin.location]”

时间:2019-08-29 08:14:48

标签: python elasticsearch

所以我有一个地图点索引,我需要在其中添加一些数据。但是似乎没有将我的数据注册为pin.location的有效输入。

我已经尽力从https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-geo-distance-query.html 仍然不起作用

这是我设置索引的地方:

mappings = {
    "mappings": {
        "properties": {
            "pin": {
                "properties": {
                    "location": {
                        "type": "geo_point"
                    }
                }
            },
            "index.mapping.single_type": False
        }
    }
}
es = Elasticsearch([{'host': 'localhost', 'port': 9200}])
if not es.indices.exists(index="groups_map"):
    es.indices.create(index='groups_map', body=mappings)
es.index(index='groups_map', id=data["id"], doc_type='groups_map', body=data, request_timeout=30)

这是数据:

data = {
        "pin": {
               "properties": {"location": {
                              "type": "geo_point",
                              'lat': request.POST['source_lat'],
                              'lon': request.POST['source_lon']}
                    }

                },
         "id": instance.id,

        }

这是我的查询数据,这里只是一本包含经纬度值的字典

 query = {
        "bool": {
            "must": {
                "match_all": {}
            },
            "filter": {
                "geo_distance": {
                    "distance": "12km",
                    "pin.location": {
                        "lat": data["lat"],
                        "lon": data["lon"]
                    }
                }
            }
        }
    }
return es.search(index="groups_map", body={"query": query}, size=20)

这是我得到的全部错误: elasticsearch.exceptions.RequestError:RequestError(400,'search_phase_execution_exception','找不到geo_point字段[pin.location]')

1 个答案:

答案 0 :(得分:2)

问题在于您的数据不正确,因为您需要拔出properties键。您的数据应如下所示。

data = {
    "pin": {
         "location": {
               'lat': request.POST['source_lat'],
               'lon': request.POST['source_lon']
         }
    },
    "id": instance.id,
}

注意:索引新数据之前,您需要删除并重新创建索引。