搜索引擎-应用篇(地理位置查询)

2023-11-05

一、背景

查询附近的洗车店

二、原理探究

像Redis和ES都支持GEO来存储地理位置。

GEO类型
  • 地理点(geo_point),即经纬度查询,
  • 地理形状查询(geo_shape),即支持点、线、圈、多边形查询
GeoHash

GeoHash 原理探究
Elasticsearch:理解 Elastic Maps 中的 geohash 及其聚合

Elasticsearch的默认等级是9,也就是精准到4.8米左右。

Elasticsearch官方并不建议我们修改精度,这可能会导致系统大幅度的变慢,在实际开发过程中,测试将精度等级调整至11级,查询多边形交叠数据返回时长高达4-8秒,难以应用生产环境。
在这里插入图片描述

三、实战

(1)创建索引
PUT my_location
{
  "mappings": {
    "properties": {
      "location":{
        "type": "geo_point"
      }
    }
  }
}
(2)插入数据

数据范围要求:

  • 纬度范围是-9090之间,经度范围是-180180之间。
  • 经纬度数据都是浮点数或字符串
  • 最大精度:小数点后7位。(常用小数点后6位即可。)
POST my_location/_bulk
{"index":{"_id":2}}
{"text":"上海站","location":{"lat":31.256224,"lon":121.462311}}
{"index":{"_id":3}}
{"text":"五一广场","location":"POINT (121.460186 31.251281)"}
{"index":{"_id":4}}
{"text":"交通公园","location":"31.253531,121.473939"}
{"index":{"_id":5}}
{"text":"万业远景大厦","location":[121.448215,31.26229]}

查询分为filter和query

  • 使用query来搜索geo_point数据效率相对会慢一些。
  • 建议使用filter来过滤geo_point数据
(3)查询(某个矩形框内)

在这里插入图片描述

GET /my_location/_search
{
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": {
        "geo_bounding_box": {
          "location": {
            "top_left": {
              "lat": 31.265395,
              "lon": 121.444075
            },
            "bottom_right": {
              "lat": 31.253845,
              "lon": 121.468417
            }
          }
        }
      }
    }
  }
}
(4)查询某个点附近 X 千米 - 附近搜索

pin就是指定当前的经纬度
distance是距离
geo_distance是圆圈的形式

GET my_location/_search
{
  "query": {
    "bool": {
      "must": [
        {"match_all": {}}
      ],
      "filter": [
        {
          "geo_distance": {
            "distance": "2000km",
            "location": {
              "lat": 40.73,
              "lon": -74.1
            }
          }
        }
      ]
    }
  }
}
(5)聚合分析 - 重点
  • unit是距离单位,常用单位有:米(m),千米(km),英里(mi)
  • distance_type是统计算法:sloppy_arc默认算法、arc最高精度、plane最高效率
GET /hotel_app/_doc/_search
{
  "size": 0,// 这个意思是我不想看到统计的元数据信息
  "aggs": { //统计
    "agg_by_pin": { //统计的名字
      "geo_distance": { //圆圈的形式做统计
        "distance_type": "arc",//统计的类型 arc是最高精度 plane是最高效率
        "field": "pin", //字段名
        "origin": { // 原始的位置,就好比我用这个点做统计
          "lat": 40,
          "lon": -70
        },
        "unit": "mi", //指定单位是mi ,就是英里
        "ranges": [ //根据范围统计
          {    //距离0~80范围的
            "to": 80
          },
          {  //80~300范围的数据
            "from": 80,
            "to": 300
          },
          {  // 300~1000范围的数据
            "from": 300,
            "to": 1000
          }
        ]
      }
    }
  }
}

四、参考链接&案例

【DSL】
附近的门店
ES7.16.2高级搜索之geo_point地理位置(四)
图灵学院 ElasticSearch课程
【GEO】
GeoHash实现
【JAVA API】
Springboot整合ES地理位置查询
【Redis】
spring-boot-redis-geo

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

搜索引擎-应用篇(地理位置查询) 的相关文章

随机推荐

  • 【放苹果】m个苹果放到n个盘子中

    m个相同的苹果 放在n个相同的盘子中 由于相同 使用排列组合的方法不好处理 这里选用递归调用的方式解决问题 8个苹果 放在3个盘子里 8个苹果 放在2个盘子 5个苹果 放在2个盘子 每盘已经放入1个苹果 2个苹果 放在2个盘子里 每盘已经放
  • 设置linux防火墙的的脚本,Linux开启防火墙并设置策略脚本

    bash bash 现有规则全部注销 iptables P INPUT ACCEPT iptables F 全部进入端口禁止 iptables P INPUT DROP 开启ping和snmp iptables A INPUT i lo j
  • uniapp封装promise接口

    uniapp封装promise接口 uni app题拱了uni requet 方法 发起网络请求 首先在根目录里创建一个request文件夹 在里面创建request js文件 在文件里编写发起网络请求的代码 在全局main js中配置 在
  • vue项目使用vue-quill-editor,光标位置控制(已解决)

    查了网上很多资料使用 都没有解决 故记录在此 全局引入 import Vue from vue import VueQuillEditor from vue quill editor require styles import quill
  • [重点]call、apply和bind的区别以及源码解析

    前言 在前端面试中 最常见的面试题 this的指向问题 如何改变this指向 call apply和bind的区别以及源码解析 如果面试官问到this的指向问题 那么你去引导面试官 让他问你如何改变this指向 call apply和bin
  • Wazuh检测反弹shell

    Wazuh通过在agent服务器上执行指定的命令 并收集命令结果 可以在一定程度上发现反弹shell的入侵行为 目前有2中常见的检测方法 一种是通过netstat输出网络连接中的shell进程来识别 另一种是通过ps输出进程信息中的反弹sh
  • 光纤中的多种光学模式芯径_「涨知识」你想知道的光纤常识都在这里了,看不看随你...

    光纤已经成为远距离有线信号传输的主要手段 安装 维护光纤也是弱电人的基本功 光纤中涉及的理论知识 组件和铺设要点都很多 我们在这里作了一些梳理 三种光 不是所有的光都能用于光纤中信号传播 光线中主要使用三种波长的光 850 nm 1300
  • Zotero文献导入到Endnote

    1 2 导入的时候 请选择
  • STM32 DAC + DMA + TIM 输出正弦波,三角波,方波信号

    硬件平台 STM32F4 库类型 标准库 参考 二代示波器教程 第12章 示波器设计 DAC信号发生器的实现 DAC框图如下 通过TIM触发DAC转换 转换完成后通过DMA输出 DMA通道框图 DAC输出阻抗的问题 DAC集成了2个输出缓存
  • matlab练习程序(弧形、圆柱投影的复原)

    前一段介绍了从矩形图像到圆柱的正向投影 看这里和这里 今天介绍如何从已经投影的图像反映射到原图像上 本来此种变换一定是需要数学公式的 不过这里只是用了一个很简单的方式来完成反映射 具体就把每一列有像素数据的长度拉伸到原图像的高就行了 原图像
  • html网页超链接

    HTML网页超链接可以通过a标签来添加超链接 其语法是 a href target self title a 它的两个属性值分别是href用来设置网页目标地址 target是用来设置打开超链接的方式 a href 网址 链接地址 targe
  • 字体子集化fontmin应用

    const fm require fontmin const f 字体名称 ttf const fontmin new fm fontmin src f use fm glyph text 天地玄黄 宇宙洪荒 use fm ttf2svg
  • 二、图像二值化方法(python)---阈值全局固定、大津法

    文章目录 阈值全局固定 利用python实现阈值全局固定时的二值化 效果图 大津法OTSU 利用Python实现大津法 效果图如下 图像二值化也叫做图像阈值化处理 通过设定某个阈值为门限 把多灰度级的图像转化为仅仅有两个极端的灰度级 0和2
  • C/C++编程笔记:如何将字符串转换为数字,数字转换为字符串?

    通常 或更具体地说 在竞争性编程中 有许多情况需要将数字转换为字符串或将字符串转换为数字 但是缺乏某些必不可少的工具的知识使我们不得不这样做 本文介绍了一些实现此任务的方法 将字符串转换为数字 方法1 使用stringstream类或ssc
  • 【转】探索推荐引擎内部的秘密

    from http www ibm com developerworks cn web 1103 zhaoct recommstudy1 index html ca drs 赵 晨婷 软件工程师 IBM 马 春娥 软件工程师 IBM 简介
  • 基于API调用管理的SDN应用层DDoS攻击防御机制

    摘要 软件定义网络 SDN software defined network 针对北向接口安全研究少 加之缺乏严格的访问控制 身份认证及异常调用检测等机制 导致攻击者有机会开发恶意的应用程序 造成北向应用程序接口 API applicati
  • Ubuntu中最简单好用截图工具shutter安装

    题记 在ubuntu中 shutter截图工具是我目前使用过最简单好用的截图神器 安装 直接在ubuntu软件市场中搜索下载 然后安装即可了
  • 软件测试工程师必备的10个测试技术体系(零基础入行测试必学)

    很多测试新手在刚开始学习软件测试的时候都不知道该如何开始 以及软件测试需要掌握哪些必备的知识点 以下是根据个人总结 粗略整理的一份软件测试学习大纲 基本涵盖了软件测试工程师需要掌握的全部技能 希望给准备学习测试的朋友提供一点指引和帮助 PS
  • 八大排序算法-堆排序

    在说堆排序之前 要先说明二叉堆的概念 因为堆排序就是通过二叉堆来实现的 注 以下说会用堆来作二叉堆的简称 至于堆的定义 大家可以自行查阅 在了解完堆之后 我们知道堆有大根堆和小根堆的不同 我们先了解堆排序的思想 之后用一个大根堆来实现代码
  • 搜索引擎-应用篇(地理位置查询)

    一 背景 查询附近的洗车店 二 原理探究 像Redis和ES都支持GEO来存储地理位置 GEO类型 地理点 geo point 即经纬度查询 地理形状查询 geo shape 即支持点 线 圈 多边形查询 GeoHash GeoHash 原