首页 > 其他分享 >elasticsearch基于地理位置的搜索

elasticsearch基于地理位置的搜索

时间:2022-11-25 15:37:06浏览次数:39  
标签:distance 地理位置 my lon 搜索 location lat elasticsearch geo


场景

 

现在基于地理位置的app层出不穷,支持地理位置的组件也有不少,Elasticsearch也不例外,并且ES可以把地理位置、全文搜索、结构化搜索和分析结合到一起,我们来看一下。

 

注意

本文章基于es7,用es6的话可能语法稍有不同,仅供参考

geo point数据类型

Elasticsearch基于地理位置的搜索,有一个专门的对象geo_point存储地理位置信息(经度,纬度),并且提供了一些基本的查询方法,如geo_bounding_box。

建立geo_point类型的mapping

PUT /my_geo
{
"mappings": {
"properties": {
"location": {
"type": "geo_point"
},
"name": {
"type": "text"
}
}
}
}

创建了一个my_geo索引,添加了一个字段location,它的类型是​​geo_point​​。

 

插入数据


#latitude:维度,longitude:经度
POST /my_geo/_doc
{
"name":"路人甲",
"location":{
"lat": 39.90279998006104,
"lon": 116.42703999493406
}
}

POST /my_geo/_doc
{
"name":"路人乙",
"location":{
"lat": 39.93367367974064,
"lon": 116.47845257733152
}
}


 

范围查询(3种方式)

1.geo_distance查询,根据当前位置的距离进行搜索,非常实用

查询5km范围内都有谁,​​filter​​​使用​​geo_distance​​​查询,我们定义距离​​distance​​​为5km,再指定geo类型的字段​​location​

POST /my_geo/_search
{
"query":{
"bool":{
"filter":{
"geo_distance":{
"distance":"5km",
"location":{
"lat":39.93031708627304,
"lon":116.4470385453491
}
}
}
}
}
}

结果发现:路人甲,路人乙都出来啦,你再试着改变举例3km看看效果呢?

 

2.geo_bounding_box查询,查询某个矩形的地理位置范围内的坐标点

POST /my_geo/_search
{
"query": {
"geo_bounding_box": {
"location": {
"top_left":{
"lon": 116,
"lat": 39.99
},
"bottom_right":{
"lon": 117,
"lat": 39.9
}
}
}
}
}


3.geo_polygon查询,查询三个点(三角形)范围内的坐标点

支持多边形,只是这个过滤器使用代价很大,尽量少用

POST /my_geo/_search
{
"query": {
"geo_polygon": {
"location": {
"points": [
{
"lon": 115,
"lat": 23
},
{
"lon": 113,
"lat": 25
},
{
"lon": 112,
"lat": 21
}
]
}
}
}
}

按距离排序

按从近到远排序

POST /my_geo/_search
{
"query": {
"bool": {
"filter": {
"geo_distance": {
"distance": "5km",
"location": {
"lat": 39.93031708627304,
"lon": 116.4470385453491
}
}
}
}
},
"sort": [
{
"_geo_distance": {
"location": {
"lat": 39.93031708627304,
"lon": 116.4470385453491
},
"order": "asc",
"unit": "m",
"distance_type": "plane"
}
}
]
}

_geo_distance: 固定写法,下面为指定位置的经纬度

unit: 距离的单位,m/km都行

distance_type: 计算距离的方式,sloppy_arc (默认值), arc (精准的) and plane (最快速的)

返回值:


{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : null,
"hits" : [
{
"_index" : "my_geo",
"_type" : "_doc",
"_id" : "kH1qEHQBfUQLnDXv35Mt",
"_score" : null,
"_source" : {
"name" : "路人乙",
"location" : {
"lat" : 39.93367367974064,
"lon" : 116.47845257733152
}
},
"sort" : [
2704.400492813901
]
},
{
"_index" : "my_geo",
"_type" : "_doc",
"_id" : "j31qEHQBfUQLnDXvfJOK",
"_score" : null,
"_source" : {
"name" : "路人甲",
"location" : {
"lat" : 39.90279998006104,
"lon" : 116.42703999493406
}
},
"sort" : [
3503.0165324004943
]
}
]
}
}


sort里面的内容,就是与当前位置的地面距离,单位是m。

 

统计我当前位置几个范围内人的数量

unit表示距离单位,常用的是mi和km。

distance_type表示计算距离的方式,sloppy_arc (默认值), arc (精准的) and plane (最快速的)。

POST /my_geo/_search
{
"size": 0,
"aggs": {
"group_by_distance": {
"geo_distance": {
"field": "location",
"origin": {
"lon": 39.933673679,
"lat": 116.47845257
},
"unit": "mi",
"distance_type": "arc",
"ranges": [
{"from": 0,"to": 1000},
{"from": 1000,"to": 2000},
{"from": 2000,"to": 5000}
]
}
}
}
}

 

标签:distance,地理位置,my,lon,搜索,location,lat,elasticsearch,geo
From: https://blog.51cto.com/u_6353447/5886789

相关文章

  • elasticsearch中query和filter区别
    区别在进行query的时候,除了完成匹配的过程,我们实际上在问“这个结果到底有多匹配我们的搜索关键词”。在所有的返回结果的后面都会有一个​​_score​​字段表示这个结果的......
  • elasticsearch中分析器的原理和使用
    概念分析(analysis)机制用于进行全文文本(FullText)的分词,以建立供搜索用的反向索引。 原理分析器的工作过程大概分成两步:分词(Tokenization):根据停止词把文本分割成很多的......
  • elasticsearch中倒排索引详解
    概念 Elasticsearch使用一种叫做倒排索引(invertedindex)的结构来做快速的全文搜索。倒排索引由在文档中出现的唯一的单词列表,以及对于每个单词在文档中的位置组成。 示......
  • elasticsearch中的基本概念和原理
    基本概念和原理ES其实就是基于lucene之上封装的一个分布式索引框架,所以lucene拥有的特性,它都是有的,同时因为它是基于分布式的,所以对很多的功能进行了扩展,要想掌握ES,......
  • LeetCode 240.搜索二维矩阵II(中等)
    题目描述:编写一个高效的算法来搜索 ​​m x n​​​ 矩阵​​matrix​​​中的一个目标值​​target​​。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的......
  • elasticsearch 之 histogram 直方图聚合
    目录1.简介2.bucket_key如何计算3.有一组数据,如何确定是落入到那个桶中4、需求4.1准备mapping4.2准备数据5、histogram聚合操作5.1、根据response_time聚合,间隔为55.1......
  • LeetCode 81.搜索旋转排序数组II
    LeetCode81.搜索旋转排序数组II题目链接:​​https://leetcode-cn.com/problems/search-in-rotated-sorted-array-ii/​​题目描述:已知存在一个按非降序排列的整数数组 n......
  • Vulhub ElasticSearch
    VulhubElasticSearch默认情况下,ElasticSearch使用两个端口监听外部TCP流量9200端口:用于所有通过HTTP协议进行的API调用。包括搜索、聚合、监控以及所有通过HTTP协议进行......
  • leetcode_Day2_35搜索插入位置
    1.题目  2.解一 主要思路:二分法,不多赘述,为题目所给标准解法。3.解二   主要思路:循环对比,自己想的,感觉写的非常冗余,内存占用和速度都很大。不过没学过算法,......
  • ElasticSearch中查询(排序、高亮、分页、Filter过滤、_source筛选)
    排序(sort)sort可以让我们按照不同的字段进行排序,并且通过order指定排序的方式asc升序desc倒序GETmy_index/_search{"query":{"match":{"title":......