ElasticSearch 地理位置聚合

Elasticsearch地理位置总结 翻译版本:https://es.xiaoleilu.com/310_Geopoints/00_Intro.html 官方原文:https://www.elastic.co/guide/en/elasticsearch/guide/current/geoloc.html本文只是针对这些内容通过具体的例子用java来实现其具体细节,如果只想看java实现部分,请直接往下面代码实现部分看地理坐标点(ge 阅读详情
好久没有写东西了。正好这两天刚忙完,就抽个时间把之前弄的东西总结下。供自己温故。当然也如果能对朋友们有所帮助。那是再好不过!
先说说弄了这么久es的一些小感受吧。
1.随着es使用的深入。发现我在做一个项目的时候最初希望将这个项目涉及到的type全部放到一个index下。但是当项目的深入后发现同样的一个字段可能在不同的type下,它的类型可能是string,也有可能是int(数字)型 。比如我常用的status这个字段。(所有的表都是基于原来的mysql数据库同步过去) 在30多个表中,其中2到3个表它的类型是string其他的表都是int。这样就导致需要将这个status指定一个别名。在所有用到这几个表的数据的时候都需要将别名重新改成status。这样无形中则增加了很多麻烦。
2.由于将所有type都放到一个index下。发现我们在项目中会遇到意想不到一些问题。比如分词方式,我遇到的问题是按照名称去做聚合。可是前期并不知情,就将name这个字段用了ik分词。大家都知道用了分词的字段聚合的结果就不是你想要的了。es字段属性设置好之后又没有办法去修改。就只有删除库重新建。
3.就是删除index的时候。数据都在一个index下你本来只有一个字段定义错了。但是没办法修改就只有备份然后删除index 重新创建。这样代价太大。
接下来就就是正题了。
查询stang_cbid的文档,title中包含“测试”,同时发布日期大于2017-05-01,按照pubtime 汇总并排序。
{
    "query": {
        "bool": {
            "filter": [
                {
                    "match_phrase": {
                        "title": "测试"
                    }
                    },
                    {
                        "range":{
                            "pubtime":{
                                "gte":"2017-05-01"
                            }
                        }
                    }
            ]
        }
    },"sort": [
       {
          "pubtime": {
             "order": "desc"
          }
       }
    ]
    ,
    "aggs":{
        "group":{
                "terms":{
                "field":"pubtime"   
                }
        }
    }
}

局部更新数据:

post /index/type/_id/_update
{
    "doc":{
    "filed1":"value",
    "filed2":"value"
    }
}

bool条件过滤并以坐标点距离排序

{
    "query" : {
        "bool": {
            "must": [
                {
                    "match_phrase": {
                      "projectname": "隧道"
                   }
               }
                ,
               {
                   "match_phrase": {
                      "area_id": "26"
                   }

               }
            ]
        }
    }, "sort" : [   
        {
            "_geo_distance" : {
                "location" :"31.88,106.25",
                "order" : "asc",
                "unit" : "km"
            }
        }
    ]
}

分组查询:(注意用于分组的filed(字段) index属性为“not_analyzed”不被分析)

{
    "query": {
        "bool": {
            "must": [
               {
                   "term": {
                  "type": {
                     "value": 2
                  }
               }

               },
                              {
                   "term": {
                  "area_id": {
                     "value": 26
                  }
               }

               }
            ]
        }
    }, 
    "aggs": {
        "top_tags": {
            "terms": {
                "field": "standards",
                "size": 20
            },
            "aggs": {
                "too": {
                    "top_hits": {
                        "_source": {

                        },
                        "size" : 1
                    }
                }
            }
        }
    }
}

我们要计算地理位置。首先我们需要设置字段的类型为geo_point.
如下:
“properties”: {
“location”:{
“type”: “geo_point”
}
}
我es的版本是2.4.1。type里面找不到这个类型。但是设置上了还是正确的类型。
存放的形式有3总
json体:”location”:{“lat”:30.23422,”lon”:107.23151}
数组:[30.123,104.21543]
String:{“30.34”,”121.343654”}
所有类型都是latitude在前,longitude在后。
下面是java 的代码:
1.给定一个坐标范围,查询落在这个范围内的所有文档,并指定返回的参数名称。

  public Map map_tunnel(Map map) {
        ElasticsearchUtil eu = new ElasticsearchUtil("123");
        String indexname = "test";
        int from = 0;
        List list = new ArrayList<>();
        String name = "";
        try{
            name = map.get("name").toString();
        }catch(Exception e){
            name = null;
        }
        String[] fileds = new String[]{};
        SearchResponse searchResponse = null;
        QueryBuilder qb = QueryBuilders.geoBoundingBoxQuery("location").topLeft(Double.parseDouble(map.get("lat1").toString()), Double.parseDouble(map.get("lon1").toString())).bottomRight(Double.parseDouble(map.get("lat2").toString()), Double.parseDouble(map.get("lon2").toString())).ignoreMalformed(true);
        //ignoreMalformed忽略畸形数据
        if (null != name) {
            switch (name) {
                case "plan":
                    name = "stang_plan_project";
                    fileds = new String[]{"id", "latitude", "longitude", "projectaddress", "projectname"};
                    break;
                case "work":
                    name = "stang_work_project";
                    fileds = new String[]{"id", "latitude", "longitude", "projectaddress", "projectname"};
                    break;
                case "tunnel":
                    name = "stang_tunnel";
                    fileds = new String[]{"id", "latitude", "longitude", "address", "name", "section", "status", "type"};
                    break;
                default:
                    break;
            }
            if (name.contains("tunnel")) {
                BoolQueryBuilder filterqb = QueryBuilders.boolQuery();
                filterqb.mustNot(QueryBuilders.matchQuery("type", 2));
                filterqb.filter(QueryBuilders.matchQuery("status", 3));
                QueryBuilder qbss = QueryBuilders.queryFilter(filterqb);
                searchResponse = eu.searchCompanySetSourceFiled(indexname, name, qb, qbss, fileds, from, maxSize);
            } else {
                searchResponse = eu.searchCompanySetSourceFiled(indexname, name, qb, fileds, from, maxSize);
            }
        } else {
            name = "stang_tunnel";
            fileds = new String[]{"id", "latitude", "longitude", "address", "name", "section", "status", "type","forid"};
            QueryBuilder qbss = QueryBuilders.boolQuery().mustNot(QueryBuilders.matchQuery("type", 2));
            searchResponse = eu.searchCompanySetSourceFiled(indexname, name, qb, qbss, fileds, from, maxSize);
        }
        try {
            SearchHits hits = searchResponse.getHits();
            for (SearchHit hit : hits) {
                map = new HashMap<>();
                map = hit.getSource();
                list.add(map);
            }
            Map tmap = new HashMap<>();
            tmap.put("ext", list);
            tmap.put("state", true);
            tmap.put("message", "操作成功");
            return tmap;
        } catch (Exception e) {
            return OutData.softwareFormart();

        } finally {
            eu.close();
        }
    }

这个是searchCompanySetSourceFiled方法。(这个方法其实没什么好多说的。)

    public SearchResponse searchCompanySetSourceFiled(String indexname, String type, QueryBuilder queryBuilder, String[] fileds, int from, int pageSize) {
        SearchResponse searchResponse = null;
        try {
            searchResponse = client.prepareSearch(indexname).setTypes(new String[]{type}).setQuery(queryBuilder).setFetchSource(fileds, null).setFrom(from).setSize(pageSize).execute().actionGet();
            return searchResponse;
        } catch (Exception e) {
            return searchResponse;
        }
    }

得到的效果就是这样的:
这里写图片描述
简单解释下参数:lat1,lon1为给定的左上角的坐标,lat2,lon2为右下角的坐标。
geoBoundingBoxQuery:这个方法大致意思就是根据你传入的两个坐标点构建一盒子。只要是落在这个盒子或者矩形中的坐标点都会被查询出来。

2.计算两个坐标点之间的距离。

    public Map datalist(Map<String, Object> map) {
        String lat = map.get("lat").toString();
        String lon = map.get("lon").toString();
        map.remove("lat");
        map.remove("lon");
        int from = 0;
        try{
            from = Integer.parseInt(map.get("from").toString());
        }catch(Exception e){
            from = 0;
        }
        ElasticsearchUtil eu = new ElasticsearchUtil("123");
        BoolQueryBuilder bqb = QueryBuilders.boolQuery();
        try {
            if (!map.isEmpty()) {
                for (Entry<String, Object> vo : map.entrySet()) {
                    switch (vo.getKey()) {
                        case "type":
                            QueryBuilder term = QueryBuilders.matchQuery("type", vo.getValue());
                            bqb.must(term);
                            break;
                        case "status":
                            QueryBuilder term1 = QueryBuilders.matchQuery("status", vo.getValue());
                            bqb.must(term1);
                            break;
                        case "roadnetwork":
                            QueryBuilder term2 = QueryBuilders.matchQuery("roadnetwork", vo.getValue());
                            bqb.must(term2);
                            break;
                        case "name":
                            QueryBuilder term3 = QueryBuilders.matchPhraseQuery("name", vo.getValue());
                            bqb.must(term3);
                            break;
                        case "area_id":
                            QueryBuilder term4 = QueryBuilders.matchQuery("area_id", vo.getValue());
                            bqb.must(term4);
                            break;
                        default:
                            break;
                    }
                }
            } else {
                QueryBuilder term = QueryBuilders.matchAllQuery();
                bqb.should(term);
            }
            SortBuilder sb = SortBuilders.geoDistanceSort("location").point(Double.parseDouble(lat), Double.parseDouble(lon)).ignoreMalformed(true).unit(DistanceUnit.KILOMETERS).order(SortOrder.ASC);
            String indexname = "test";
            String[] fileds = {"address", "area_id", "city_id", "id", "latitude", "longitude", "name", "pic_url", "roadnetwork", "section", "status", "type", "length"};
            SearchResponse searchResponse = eu.geoDistanceSortSearchAndSetSourceFileds(indexname, "stang_tunnel", bqb, fileds, sb, from, pageSize);
            SearchHits hits = searchResponse.getHits();

            List lists = new ArrayList<>();
            for (SearchHit hit : hits) {
                map = new HashMap<>();
                map = hit.getSource();
                map.put("distance", OutData.formartDouble((double) hit.getSortValues()[0]));
                lists.add(map);
            }
            map = new HashMap<>();
            map.put("count", hits.getTotalHits());
            lists.add(map);
            return OutData.software_Formart(lists,pageSize);
        } catch (Exception e) {
            return OutData.softwareFormart();
        } finally {
            eu.close();
        }
    }

location:type中创建的类型为坐标点的字段的名称。
SortBuilders.geoDistanceSort():计算两个点之间的距离的函数
unit(DistanceUnit.KILOMETERS):设置现在的距离单位。
.order(SortOrder.ASC);排序方式(按照距离升序排列。即距离近的文档排在最前面.)
3.根据条件查询数据并计算坐标距离再聚合统计,效果和sql 的group by相似。

    public Map datagroup(Map<String, Object> map) {
        ElasticsearchUtil eu = new ElasticsearchUtil("123");
        int from = 0;
        String type = "stang_tunnel";
        try {
            from = (Integer.parseInt(map.get("page").toString()) - 1) * pageSize;
        } catch (Exception e) {
        }
        map.remove("page");
        String lat = map.get("lat").toString();
        String lon = map.get("lon").toString();
        map.remove("lat");
        map.remove("lon");
        String indexname = "test";
        BoolQueryBuilder bqb = QueryBuilders.boolQuery();
        try {
            if (!map.isEmpty()) {
                for (Entry<String, Object> vo : map.entrySet()) {
                    switch (vo.getKey()) {
                        case "type":
                            QueryBuilder term1 = QueryBuilders.matchPhraseQuery("type", vo.getValue());
                            bqb.must(term1);
                            break;
                        case "area_id":
                            QueryBuilder term2 = QueryBuilders.matchPhraseQuery(vo.getKey(), vo.getValue());
                            bqb.must(term2);
                            break;
                        default:
                            break;
                    }
                }
            } else {
                QueryBuilder term = QueryBuilders.matchAllQuery();
                bqb.must(term);
            }
            GeoPoint gp = GeoPoint.parseFromLatLon(lat + "," + lon);
            SortBuilder sbd = SortBuilders.geoDistanceSort("location").points(gp).unit(DistanceUnit.KILOMETERS).order(SortOrder.ASC);
            String[] fields = {"id", "area_id", "city_id", "name", "roadnetwork", "status"};
            //核心部分
            AbstractAggregationBuilder aab = AggregationBuilders.terms("group").field("name").size(100).subAggregation(AggregationBuilders.topHits("too").setFetchSource(true).setFetchSource(fields, null).setSize(1));
            SearchResponse searchResponse = eu.geoDistanceSortSearchAndSetSourceFileds(indexname, type, bqb, fields, sbd, aab, from, pageSize);
            SearchHits hits = searchResponse.getHits();
            List lists = new ArrayList<>();
            //核心部分
            Terms terms = searchResponse.getAggregations().get("group");
            List<Terms.Bucket> buckets = terms.getBuckets();
            for (Terms.Bucket bucket : buckets) {
                TopHits topHits = bucket.getAggregations().get("too");//获取子聚合中的参数。
                for (SearchHit hit : topHits.getHits()) {
                    map = new HashMap<>();
                    map = hit.getSource();
                    map.put("area", OutData.transArea(map.get("area_id").toString()));
                    map.put("city", eu.outCity("jjt", "stang_area", Integer.parseInt(map.get("city_id").toString())));
                }
                lists.add(map);
            }
            map = new HashMap<>();
            map.put("ext", lists);
            map.put("state", true);
            map.put("message", "操作成功");
        } catch (Exception e) {
            System.out.println(e.getMessage());
            map = OutData.softwareFormart();
        } finally {
            eu.close();
        }
        return map;
    }

AggregationBuilders.terms(“group”).field(“name”).size(100):外层聚合。
.subAggregation(AggregationBuilders.topHits(“too”).setFetchSource(true).setFetchSource(fields, null).setSize(1)):这个内层聚合里面的参数才是我们真正要取得的参数。size为1的目的是每个类别只需要返回条数据。因为是统计类别嘛。
setFetchSource():设置内部聚合返回的字段。
好了大体上也就这么多了。欢迎各位朋友赐教。

ElasticSearch根据经纬度实现点聚合 ElasticSearch根据经纬度实现点聚合 { "query": { "bool": { "should": //或, or关系 [ {"match":{"字段a":"条件内容a"}}, //字段和内容可以是一对一、一对多、多对多 {"match":{"字段a":"条件内容b"}}, {"match":{"字段b":"条件内容a"}} ] "must": //和,and关系 [ {"match":{"字段a":"内 阅读详情

相关推荐

实时搜索引擎Elasticsearch(4)——Aggregations (聚合)API的使用

本篇将介绍ES提供的聚合API的使用。ES提供的聚合功能可以用来进行简单的数据分析。本文仍然以上一篇提供的数据为例来讲解。

HinyLover的专栏 5万+

Elasticsearch之基于地理位置进行聚合分析

1、建立geo_point类型的mapping 第一个地理位置的数据类型,就是geo_point,geo_point,说白了,就是一个地理位置坐标点,包含了一个经度,一个维度,经纬度,就可以唯一定位一个地球上的坐标 PUT /my_index { "mappings": { "my_type": { "properties": { "location...

数据与算法架构提升之路专栏 2819

ElasticSearch的 geo point - 地理位置搜索和聚合分析

出自 图灵学院 ElasticSearch课程, 我自己学完了,整理了一下,然后给老师说的话,记录了一下,发了个博客 概述 ES支持地理位置的搜索和聚合分析,可实现在指定区域内搜索数据、搜索指定地点附近的数据、聚合分析指定地点附近的数据等操作。 ES中如果使用地理位置搜索的话,必须提供一个特殊的字段类型。GEO - geo_point。地理位置的坐标点。 1、定义geo point mapping ​ 如果需要使用地址坐标,则需要定义一个指定的mapping类型。具体如下: 使用什么数据可以确定,地球上的一

张俊杰 的博客 3962

用Elasticsearch搜索匹配功能实现基于地理位置的查询

用Elasticsearch搜索匹配功能实现基于地理位置的查询,查询附近的人,查询沿途加油站,查询沿途充电站方案

青鸟飞鱼 2201

Elasticsearch地理位置_elasticsearch location

地理距离排序可以对多个坐标点来使用,不管(这些坐标点)是在文档中还是排序参数中。使用 sort_mode 来指定是否需要使用位置集合的 最小(min),最大(max)或者平均(avg)距离。这样就可以返回离我的工作地和家最近的朋友这样的结果了。

2501_90207037的博客 850

Elasticsearch: 权威指南

序言 前言 基础入门 深入搜索 处理人类语言 聚合 地理位置 数据建模 管理、监控和部署

lgxzzz的博客 985

Elasticsearch(三)——Es搜索(简单使用、全文查询、复合查询)、地理位置查询、特殊查询、聚合操作、桶聚合、管道聚合

Elasticsearch(三)——Es搜索(简单使用、全文查询、复合查询)、地理位置查询、特殊查询、聚合操作、桶聚合、管道聚合

qq_41824825的博客 3万+

搜索引擎——让用户“秒找到“

本文介绍了搜索引擎的核心价值和技术实现。文章通过图书馆找书的场景类比,展示了从全表扫描、分类索引到搜索引擎的进化过程,解释了数据库模糊查询的局限性。Elasticsearch作为专业搜索引擎,提供了全文检索、相关性排序、中文分词等功能。技术部分详细讲解了ES的核心概念、数据结构,以及与Spring Boot的集成方法,包括文档定义、仓储接口和复杂查询实现。最后还介绍了全文搜索、聚合统计和地理位置搜索等高级功能,帮助开发者快速构建高效搜索服务。

通俗易懂学IT 87

Elasticsearch(Es搜索(简单使用、全文查询、复合查询)、地理位置查询、特殊查询、聚合操作、桶聚合、管道聚合)

match_phrase_prefix 是针对分片级别的查询,假设 max_expansions 为 1,可能返回多个文档,但是只有一个词,这是我们预期的结果。有的时候实际返回结果和我们预期结果并不一致,原因在于这个查询是分片级别的,不同的分片确实只返回了一个词,但是结果可能来自不同的分片,所以最终会看到多个词。换句话说,上面的查询和下面的查询等价。即 term 查询,就是根据词去查询,查询指定字段中包含给定单词的文档,term 查询不被解析,只有搜索的词和文档中的词精确匹配,才会返回文档。

weixin_43360488的博客 4050

阿里云大模型 ACP 认证教材内容突变?这些改动藏着通关密码,不看亏大!

【摘要】核心章节大换血,安全合规融入实战场景,大模型微调用数学深度解析,部署章节带来阿里云产品对比实战攻略,甚至整章内容被替换成藏满学习彩蛋的行业趋势指南。这些改动不仅重塑考试重点,更暗藏官方命题风向——安全合规考场景方案,微调原理考几何解析,部署设计考分析框架。无论你是数学小白还是部署新手,这篇攻略都将带你吃透变动逻辑,附赠急救包和考点清单,帮你抓住这些“隐形加分项”,速来解锁通关秘籍!

davidkorhenn的博客 1755

主流仿真软件Sigrity/HFSS/Siwave/Hyperlynx/ADS差异

在电子设计自动化(EDA)领域,各种仿真软件如Cadence Sigrity、Mentor Graphics的HyperLynx、Keysight的ADS以及ANSYS的SIwave等,都广泛应用于不同的应用场景中。综上所述,这些EDA仿真软件在各自的应用场景中发挥着重要作用,帮助工程师在设计阶段就能够评估和优化电子产品的性能,提高设计的可靠性和效率。:Sigrity由全球最大的EDA公司Cadence推出,Cadence还推出了Orcad和Allegro等著名软件。:由安捷伦(现是德科技)公司开发。

Geektec的专栏 9402

ElasticSearch从入门到精通--第六话(补充篇:Docker启动es、Kibana、IK分词器使用、地理位置、分数查询设置、聚合)

ElasticSearch从入门到精通--第六话(补充篇:Docker启动es、Kibana、IK分词器使用、地理位置、分数查询设置、聚合)

鸢尾_的博客 1169

stata 代码实现熵值法计算 含常见问题解答

2.标准化①正向指标②负向指标。

m0_74825360的博客 1217

从CRUD到高级搜索:Easy-ES让Elasticsearch开发效率提升10倍的实战指南

**痛点直击**: 使用原生Elasticsearch Client需要编写19行代码才能完成简单查询,而业务需求却要求你在3天内上线全文检索功能。索引创建、字段映射、分词配置、复杂查询构建...这些繁琐步骤是否让你望而却步? **本文价值**: 读完本文后,你将掌握: - 5分钟实现Elasticsearch CRUD操作的零魔法值方案 - 全自动索引托管技术,彻底告别手动维护索引的痛

gitblog_01404的博客 419

在Proteus中用80C51模拟4线SPI点亮OLED屏幕

在Proteus里用80C51模拟4线SPI控制OLED屏幕使其显示图案(汇编实现)。

Connor3093的博客 5003

多核异构处理器核间通信:从共享内存到RPMsg协议的实战解析

在多核异构处理器架构中,核间通信是实现高效协同计算的核心技术。其基本原理是通过共享内存作为数据交换的物理媒介,配合硬件信号机制实现同步与通知。从技术价值看,它解决了不同架构核心间的数据共享与指令协同问题,是释放异构计算潜力的关键。在应用场景上,该技术广泛应用于智能物联网设备、汽车电子和工业控制等领域,用于连接高性能应用处理器与实时微控制器。本文以典型的ARM Cortex-A与Cortex-M组合为例,深入剖析了基于共享内存和RPMsg协议的通信机制,涵盖了从硬件基础到软件协议栈的完整实现链路,并提供了针对

weixin_26969269的博客 447

【Elasticsearch】Geohash聚合

聚合。

risc123456的博客 175

深入解析STM32官方库:.c/.h文件功能与应用场景

本文深入解析了STM32官方库中.c和.h文件的核心功能与应用场景。详细剖析了stm32f10x.h、启动文件、外设驱动文件等关键组件的作用,并通过LED闪烁实战演示了如何构建工程、配置文件和调用库函数。文章旨在帮助开发者理解官方库的架构,掌握高效使用技巧,从而降低STM32开发门槛,提升开发效率与代码质量。

weixin_29189377的博客 351

进阶-第77_elasticsearch高手进阶_学习使用geo point地理位置数据类型

这一讲开始,后面会跟着几讲内容,将地理位置相关的知识给大家讲解一下 主要是es支持基于地理位置的搜索,和聚合分析的 举个例子,比如说,我们后面就会给大家演示一下,你现在如果说做了一个酒店o2o app,让你的用户在任何地方,都可以根据当前所在的位置,找到自己身边的符合条件的一些酒店,那么此时就完全可以使用es来实现,非常合适 我现在在上海某个大厦附近,我要搜索到距离我...

qq_35524586的博客 344

排列显示阿拉伯语、数字及英文时的处理方法

这段时间参与开发沙特阿拉伯的网站模板,模板使用的语言是阿拉伯语,其显示顺序为从右到左,而中文、数字及英文的显示顺序为从左到右 ,所以当遇到一行文字内既有阿拉伯语又有数字和英文时会出现语序混乱的问题,如 期待显示的文案为: 按顺序写入,对应的代码如以下,其中currency_pay为变量,值为356SAR <span>الدفع الفعلي:{{currency_pay}}</span> 显示为 الدفع الفعلي : 356SAR 金额356和货币符号SAR分开了,这样显

llq886的博客 5802

开尔文四线法与电桥(uΩ电阻检测)

本文介绍了开尔文四线法与电桥在电阻测量中的应用,特别是针对uΩ级别电阻的精确检测。讨论了基本电桥电路的工作原理,强调了开尔文四线法的优势,它能消除导线和接触电阻的影响。文中还提到了测试设备的介绍,包括不同级别的电阻测试,并详细阐述了uΩ级别电阻测试的步骤和注意事项。此外,对比了惠斯通电桥与开尔文电桥,强调了它们在电阻测量中的作用和计算方法。

让你爱上电路设计 7859

es教程——地图搜索

geo原理 geohashes geohashes值实际上是代表一个区域。 geohashes 是一种将经纬度编码成字符串的方式。   以经纬度值(116.389550, 39.928167)为例。   (1)首先对纬度进行编码, 纬度范围是[-90, 90],首先将该范围进行划分[-90, 0], [0, 90],然后可以确定 39.9 属于后一部分,所以标记为 1, 然后在对[0, 90]进行划分[0, 45], [45, 90] 可知39.9属于前一部分,所以标记为0, 此时纬度区间越来越接近39.9

HJHxHJH的博客 2051

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

从‘附近的人’到‘区域热力图’:手把手教你玩转Elasticsearch地理位置查询与聚合

本文详细介绍了Elasticsearch地理位置查询与聚合的实战应用,从数据建模、索引优化到精准距离查询、地理围栏和热力图生成。通过具体代码示例和性能优化策略,帮助开发者高效实现‘附近的人’和‘区域热力图’等LBS功能,提升Elasticsearch在位置服务中的应用效果。

weixin_42524708的博客 369

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

使用阿里云试用Elasticsearch学习:5. 地理位置

我们拿着纸质地图漫步城市的日子一去不返了。得益于智能手机,我们现在总是可以知道 自己所处的准确位置,也预料到网站会使用这些信息。我想知道从当前位置步行 5 分钟内可到的那些餐馆,对伦敦更大范围内的其他餐馆并不感兴趣。但地理位置功能仅仅是 Elasticsearch 的冰山一角,Elasticsearch 的妙处在于,它让你可以把地理位置、全文搜索、结构化搜索和分析结合到一起。

weixin_49131823的博客 1415

Elasticsearch 支持哪些地理位置操作?

这些操作使得Elasticsearch能够处理各种与地理位置相关的搜索和分析需求,适用于物流、共享出行、地图服务等多种应用场景。不仅学会如何编程,还将学会如何将AI技术应用到实际问题中,为您的职业生涯增添一笔宝贵的财富。,让人能紧跟时代的浪潮。从普通网站,到公众号、小程序,再到AI大模型网站。】里面有大量面试涉及的算法或数据结构编程题。有意找工作的同学,请参考博主的原创:《,目前已完成所有内容。或关注博主免费专栏【

借雨醉东风的博客 748

Elasticsearch-查询

Elasticsearch 查询

qq_42551543的博客 1010
上一篇: ElasticSearch集群搭建问题
下一篇: ElasticSearch API 地理距离过滤器
Merlyj
博客等级 码龄10年 5粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值