首页 > 其他分享 >elasticsearch存储经纬度且按照范围进行查询

elasticsearch存储经纬度且按照范围进行查询

时间:2024-05-21 17:19:43浏览次数:26  
标签:存储 经纬度 xxx content elasticsearch location test geo id

elasticsearch存储经纬度且按照范围进行查询

背景: 我在客户那边有很多舆情事件数据,数据里面包含的是有经纬度的,项目需求是用户在系统中输入一个地址,系统就可以查询到该地址100米 500米 1000米范围内的事件信息,当然了还可以输入事件的关键信息做模糊查询,所以我选择了使用es来存储引擎。

第一步: 创建ES索引

以下索引是测试环境数据

{
    "settings": {
        "number_of_shards": 3,
        "number_of_replicas": 1
    },
    "mappings": {
        "properties": {
            "content": {
                "type": "text",
                "analyzer": "ik_max_word"
            },
            "location": {
                "type": "geo_point"
            },
            "id": {
                "type": "keyword"
            }
        }
    }
}

第一步: 数据同步

我使用flinkSQL搭配袋鼠云的chunjun来将数据库里面的事件数据写入到ES
下面是我写的flinkSQL脚本

-- 数据库表
CREATE TABLE `location_test` (
  `id` VARCHAR,
  `content` VARCHAR COMMENT '内容',
  `lon` VARCHAR COMMENT '经度',
  `lat` VARCHAR COMMENT '纬度'
) WITH (
  'connector' = 'mysql-x',
  'url' = 'jdbc:mysql://127.0.0.1:3306/xxx?useSSL=false&useInformationSchema=true&nullCatalogMeansCurrent=true&characterEncoding=UTF-8',
  'table-name' = 'location_test',
  'username' = 'xxx',
  'password' = 'xxx',
  'scan.fetch-size' = '1024'
);

-- es索引
CREATE TABLE `location_geo_test` (
  `id` VARCHAR COMMENT '主键',
  `content` VARCHAR COMMENT '内容',
  `location` ROW< `lon` VARCHAR, `lat` VARCHAR > COMMENT '经纬度',
  PRIMARY KEY (`id`) NOT ENFORCED
) WITH (
  'connector' = 'elasticsearch7-x',
  'hosts' = '127.0.0.1:15287',
  'index' = 'location_geo_test',
  'username' = 'xxx',
  'password' = 'xxx',
  'sink.bulk-flush.max-actions' = '1024',
  'sink.bulk-flush.interval' = '2000',
  'sink.bulk-flush.max-size' = '5mb'
);

INSERT INTO `location_geo_test`
(SELECT `id`,
    `content`,
      (`lat`, `lon`)
  FROM `location_test`);

flink任务执行完毕之后 查询es数据

{
    "took": 15,
    "timed_out": false,
    "_shards": {
        "total": 6,
        "successful": 6,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 3,
            "relation": "eq"
        },
        "max_score": 1.0,
        "hits": [
            {
                "_index": "location_geo_test",
                "_type": "_doc",
                "_id": "2",
                "_score": 1.0,
                "_source": {
                    "location": {
                        "lon": "120.165269",
                        "lat": "30.312568"
                    },
                    "id": "2",
                    "content": "杭州市xxx"
                }
            },
            {
                "_index": "location_geo_test",
                "_type": "_doc",
                "_id": "3",
                "_score": 1.0,
                "_source": {
                    "location": {
                        "lon": "120.163325",
                        "lat": "30.271001"
                    },
                    "id": "3",
                    "content": "杭州市xxx"
                }
            },
            {
                "_index": "location_geo_test",
                "_type": "_doc",
                "_id": "1",
                "_score": 1.0,
                "_source": {
                    "location": {
                        "lon": "120.165269",
                        "lat": "30.312568"
                    },
                    "id": "1",
                    "content": "杭州市xxx"
                }
            }
        ]
    }
}

第三步: 查询

{
    "query": {
        "geo_distance": {
            "location": {
                "lon": 120.165269,
                "lat": 30.312568
            },
            "distance": 1,
            "distance_type": "arc"
        }
    }
}

结果

{
    "took": 5,
    "timed_out": false,
    "_shards": {
        "total": 6,
        "successful": 6,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 2,
            "relation": "eq"
        },
        "max_score": 1.0,
        "hits": [
            {
                "_index": "location_geo_test",
                "_type": "_doc",
                "_id": "2",
                "_score": 1.0,
                "_source": {
                    "location": {
                        "lon": "120.165269",
                        "lat": "30.312568"
                    },
                    "id": "2",
                    "content": "杭州市xxx"
                }
            },
            {
                "_index": "location_geo_test",
                "_type": "_doc",
                "_id": "1",
                "_score": 1.0,
                "_source": {
                    "location": {
                        "lon": "120.165269",
                        "lat": "30.312568"
                    },
                    "id": "1",
                    "content": "杭州市xxx"
                }
            }
        ]
    }
}

标签:存储,经纬度,xxx,content,elasticsearch,location,test,geo,id
From: https://www.cnblogs.com/sxxs/p/18204565

相关文章

  • ES(Elasticsearch)入门-深入索引操作
    1.创建索引使用PUT请求。结构PUT/${index_name}//索引名称{"settings":{...索引相关的配置项目,如何:分配个数副分片个数等},"mappings":{...数据的结构}}-----------------------------------实例---------------------------......
  • Kubernetes 数据存储:从理论到实践的全面指南
    本文深入解析Kubernetes(K8S)数据存储机制,探讨其架构、管理策略及最佳实践。文章详细介绍了K8S数据存储的基础、架构组成、存储卷管理技巧,并通过具体案例阐述如何高效、安全地管理数据存储,同时展望了未来技术趋势。关注【TechLeadCloud】,分享互联网架构、云服务技术的全......
  • 字节面试:百亿级存储,怎么设计?只是分库分表?
    文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面试必备+大厂必备+涨薪必备免费赠送:《尼恩技术圣经+高并发系列PDF》,帮你实现技术自由,完成职业升级,薪......
  • 【Azure Storage Account】Azure 存储服务计算Blob的数量和大小的Python代码
    问题描述介绍一段Python脚本,可以在微软云中国区使用。用于计算AzureStorageAccount中Container中Blob类型文件的数量和大小,脚本中允许按照容器,层(热/冷/归档),前缀,软删除/非软删除来计算数量和容量大小,默认使用的时间为以Blob的最后修改时间作为参考。执行结果参考: 参数......
  • 自动化部署elasticsearch三节点集群
    什么是Elasticsearch?Elasticsearch是一个开源的分布式搜索和分析引擎,构建在ApacheLucene的基础上。它提供了一个分布式多租户的全文搜索引擎,具有实时分析功能。Elasticsearch最初是用于构建全文搜索引擎,但它的功能已经扩展到包括日志分析、应用程序性能监控、地理信息系统等......
  • SQLSERVER存储过程
    一、截取字符串第几个字符后的第几个元素CREATEfunctionfunc_StrSplitIndex(@strvarchar(1024),--要分割的字符串@splitvarchar(10),--分隔符号@indexint--取第几个元素)returnsvarchar(1024)asbegindeclare@locationintdeclare@startintdeclare@nex......
  • Springboot Data Jdbc实体类json格式存储
    日常需求中有些需求需要在某字段存储json格式数据,例如日志审计接口传参数据等1.首先我们得保证数据库字段为text或者json2.设置读转换和写转换器importcom.fasterxml.jackson.databind.ObjectMapper;importorg.springframework.core.convert.converter.Converter;importo......
  • 使用 Spacesniffer 找回 48G 系统存储空间的总结
    前言Spacesniffer是一个免费的文件扫描工具,通过使用树状图可视化布局,可以立即了解大文件夹的位置,帮助用户处理找到这些文件夹当前系统C盘空间清理后系统C盘空间下载Spacesniffer下载地址:https://spacesniffer.en.softonic.com/download使用管理员身份启动Spacesniffe......
  • redis存储之序列化问题
    1.问题描述:在SpringBoot集成Redis过程中,添加进redisf的内容如下2.出现这种情况的原因(1) 键和值都是通过Spring提供的Serializer序列化到数据库的(2) RedisTemplate默认使用的是JdkSerializationRedisSerializer,StringRedisTemplate默认使用的是StringRedisSerializer3.解......
  • 数据库中了解的知识点:视图、触发器、事务、存储过程、函数、流程控制、索引
    【视图】1什么是视图?2视图就是通过查询得到一张虚拟表,然后保存下来,下次可以直接用3其实视图也是表45为什么要用视图?6如果要频繁的操作一张虚拟表,就可以制作成视图,下次可以直接操作78如何操作9#固定语法10createview......