您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
elasticSearch地理查询
发布时间:2021-09-07 19:28:17编辑:雪饮阅读()
ElasticSearch地理查询这些查询处理地理位置和地理点。这些查询有助于查找任何位置附近的学校或任何其他地理对象。需要使用地理位置数据类型。
这里以一个最简单的提供一个point点然后提供一个距离n查询这个point点附近nKM范围的其它point点。
那么要使用上面这个功能,首先你需要有point点,这个point点的文档有一种特殊的字段类型存储经纬度即geo_point类型。
那么这个geo_point类型必须在point文档所属索引中有映射支持才可以,所以接下来就建立一个支持geo_point类型的索引
请求正文:
{
"mappings": {
"properties": {
"pin": {
"properties": {
"location": {
"type": "geo_point"
}
}
}
}
}
}
响应正文:
{
"acknowledged": true,
"shards_acknowledged": false,
"index": "my_locations"
}
建立完成支持geo_point类型的索引之后,接下来就需要建立拥有geo_point类型字段的文档了
请求正文:
{
"pin": {
"location": {
"lat": 40.12,
"lon": -71.34
}
}
}
响应正文:
{
"_index": "my_locations",
"_type": "_doc",
"_id": "1",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}
这里虽然只建立了一个point文档,但是也可以用来进行地理查询。我们查询时候输入的point经纬度和上面这个point文档的经纬度只要相差的值非常之小,并且我们查询距离范围内时候这个距离值又设置的非常的大,那么要查询出结果自然是没有问题的。
那么上面的维度lat是40.12,那么我们要查的”这个点”附近范围的其它点时候,”这个点”的维度我们就设置40,那么同理”这个点”的经度我们设置为-71,那么最后这个附近范围内,假设就是200km范围内吧。
请求正文:
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_distance": {
"distance": "200km",
"pin.location": {
"lat": 40,
"lon": -70
}
}
}
}
}
}
响应正文:
{
"took": 903,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1.0,
"hits": [
{
"_index": "my_locations",
"_type": "_doc",
"_id": "1",
"_score": 1.0,
"_source": {
"pin": {
"location": {
"lat": 40.12,
"lon": -71.34
}
}
}
}
]
}
}
注意:在一些老的文档上面有讲创建一个geo_point类型字段,可以如:
"location":[28.5733056, 77.0122136]
这样,然后映射的地方是这样:
"location":{
"type":"geo_point"
}
那么实际上这种在我这个elasticsearch-7.14.0-windows-x86_64上面测试是行不通的。
老文档参考如:https://www.bootwiki.com/elasticsearch/elasticsearch-query-dsl.html
那么新文档中geo_point类型字段像是这里就是:
"pin": {
"location": {
"lat": 40.12,
"lon": -71.34
}
}
然后映射是这样:
"pin": {
"properties": {
"location": {
"type": "geo_point"
}
}
}
关键字词:elasticSearch,地理查询