直接上代码,包括多种geo相关查询===>>>矩形/多边形/距离/距离排序/距离分段聚合/geo_shape内含-相交-相离
@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class VehicleEntpApplicationTests {static {System.setProperty("es.set.netty.runtime.available.processors", "false");}@AutowiredElasticsearchTemplate elasticsearchTemplate;//"************************矩形************************"/* GET /entp/entp_search{"post_filter": {"geo_bounding_box": {"geo": {"top_left": {"lat": 31.73,"lon": 104.1},"bottom_right": {"lat": 10.01,"lon": 141.12}}}}}*/@Testpublic void boundingBoxQuery() throws Exception {GeoBoundingBoxQueryBuilder filterBuilder = QueryBuilders.geoBoundingBoxQuery("geo").setCorners(new GeoPoint(31.73, 104.1), new GeoPoint(10.01, 141.12));NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withIndices("entp").withTypes("entp").withFilter(filterBuilder).build();System.out.println(filterBuilder.toString());List<EntpResourceVO> vos = elasticsearchTemplate.queryForList(searchQuery, EntpResourceVO.class);}//"************************多边形************************"/*{"post_filter": {"geo_polygon": {"geo": {"points": [{"lat": 22,"lon": 88}, {"lat": 11,"lon": 111}, {"lat": 33,"lon": 133}]}}}
}*/@Testpublic void polygonQuery() throws Exception {List<GeoPoint> geoPoints = new ArrayList<>();geoPoints.add(new GeoPoint(11, 111));geoPoints.add(new GeoPoint(22, 88));geoPoints.add(new GeoPoint(33, 133));GeoPolygonQueryBuilder filterBuilder = QueryBuilders.geoPolygonQuery("geo", geoPoints);NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withIndices("entp").withTypes("entp").withFilter(filterBuilder).build();System.out.println(filterBuilder.toString());List<EntpResourceVO> vos = elasticsearchTemplate.queryForList(searchQuery, EntpResourceVO.class);}//"************************距离排序************************"/*GET /entp/_search
{"from": 0,"size": 10,"query": {"match_phrase_prefix": {"entpAddr.chinese": {"query": "云南","boost": 1.0}}},"sort": [{"_geo_distance": {"geo": [{"lat": 25.0,"lon": 102.0}],"unit": "km","distance_type": "plane","order": "asc"}}, {"_score": {"order": "desc"}}]
}*/@Testpublic void geoDistanceSortQuery() throws Exception {QueryBuilder query = QueryBuilders.matchPhrasePrefixQuery("entpAddr.chinese", "云南");GeoDistanceSortBuilder sortBuilder = SortBuilders.geoDistanceSort("geo", 25, 110).unit(DistanceUnit.KILOMETERS).order(SortOrder.ASC).geoDistance(GeoDistance.PLANE);//elasticsearchTemplate的API不便获得到距离,需要用原生的transportClientSearchRequestBuilder requestBuilder = (elasticsearchTemplate.getClient()).prepareSearch("entp").setTypes("entp").setQuery(query).setFrom(0).setSize(10).addSort(sortBuilder).addSort("_score", SortOrder.DESC);//先相关度再距离二级排序System.out.println(requestBuilder.toString());Arrays.stream(requestBuilder.get().getHits().getHits()).forEach(searchHit -> {BigDecimal bigDecimal = new BigDecimal((double) searchHit.getSortValues()[0]);double distance = bigDecimal.setScale(1, BigDecimal.ROUND_HALF_DOWN).doubleValue();});}//"************************距离查询************************"/*GET / entp / _search
{"post_filter": {"geo_distance": {"distance": "1000km","geo": {"lat": 30,"lon": 110}}}
}*/@Testpublic void geoDistanceQuery() throws Exception {GeoDistanceQueryBuilder filterBuilder = QueryBuilders.geoDistanceQuery("geo").distance(1000, DistanceUnit.KILOMETERS).point(30, 110);NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withIndices("entp").withTypes("entp").withFilter(filterBuilder).build();System.out.println(filterBuilder.toString());List<EntpResourceVO> vos = elasticsearchTemplate.queryForList(searchQuery, EntpResourceVO.class);}//"************************分段聚合************************"/*
GET /entp/_search
{"size": 0,"aggs": {"groupCount": {"geo_distance": {"field": "geo",   "origin": {            //源坐标    "lat": 30,"lon": 110},"ranges": [                  //分段{"to" : 300},{"from": 300,"to": 600},{"from": 600}],"unit": "km",               "distance_type": "arc"    //平面or球面  }}}
}*/@Testpublic void geoAggExample() throws Exception {GeoDistanceAggregationBuilder agg = AggregationBuilders.geoDistance("groupCount", new GeoPoint(30, 110)).field("geo").addUnboundedTo("300KM以下", 300).addRange("300-600KM", 300, 600).addUnboundedFrom("600KM以上", 600).distanceType(GeoDistance.ARC).unit(DistanceUnit.KILOMETERS);SearchRequestBuilder requestBuilder = (elasticsearchTemplate.getClient()).prepareSearch("entp").setTypes("entp").addAggregation(agg).setSize(0);System.out.println(requestBuilder.toString());InternalGeoDistance internalGeoDistance = requestBuilder.get().getAggregations().get("groupCount");List buckets = internalGeoDistance.getBuckets();buckets.forEach(o -> {long docCount = ((InternalRange.Bucket) o).getDocCount();});}//"************************geo_shape内含-相交-相离************************"/**/@Testpublic void geoShapeQuery() throws Exception {// 1.查询针对的不是普通的字段,而是一种特殊的图形数据,是多个geo_point组成的,// 2. 用该API可以计算点线面形状的输入与ES内的geo_shape类型的内含-相交-相离关系。// ShapeRelation.WITHIN内含 ShapeRelation.INTERSECTS相交 ShapeRelation.DISJOINT相离// 3.需要加入两个依赖/*.<dependency><groupId>org.locationtech.jts</groupId><artifactId>jts-core</artifactId><version>1.16.1</version></dependency><dependency><groupId>org.locationtech.spatial4j</groupId><artifactId>spatial4j</artifactId><version>0.7</version></dependency>*///4.数据准备/*PUT /example
{"mappings": {"example": {"properties": {"myGeoShape": {"type": "geo_shape"                    }}}}
}POST /example/example
{"myGeoShape" : {"type" : "polygon","coordinates" : [[ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ]]}
}*///5.需求举例//点面,如电子围栏,机车(点输入)闯入电子围栏触发报警//ShapeBuilder pointBuilder = new PointBuilder(33, 111); //线面,新修公路(线输入)线路计划合理性计算,尽量与较多的村庄相交或内含//ShapeBuilder pointBuilder = new LineStringBuilder(new CoordinatesBuilder().coordinate(11,22).coordinate(33,44));// 点面位置关系//面面,如汶川多个村庄(在ES中表现为多个坐标组成的多边形),地震震中(面输入)(x,y) r=100Km,计算波及的村庄ShapeBuilder circleBuilder = new CircleBuilder().center(100.0, 0.0).radius(100, DistanceUnit.KILOMETERS);GeoShapeQueryBuilder filterBuilder = QueryBuilders.geoShapeQuery("myGeoShape", circleBuilder).relation(ShapeRelation.WITHIN);SearchRequestBuilder requestBuilder = (elasticsearchTemplate.getClient()).prepareSearch("example").setTypes("example").setSearchType(SearchType.DFS_QUERY_THEN_FETCH).setQuery(filterBuilder).setFrom(0).setSize(10);Arrays.stream(requestBuilder.get().getHits().getHits()).forEach(searchHit -> {Map<String, Object> source = searchHit.getSourceAsMap();System.out.println(source);});}
}

elasticsearch geo DSL 和API对比学习-矩形/多边形/距离/距离排序/距离分段聚合/geo_shape内含-相交-相离相关推荐

  1. MySQLi学习笔记 :二(  排序查询,聚合函数,分组查询,分页查询) 约束     多表之间的关系   范式     数据库的备份和还原

    # DQL:查询语句     1. 排序查询         * 语法:order by 子句             * order by 排序字段1 排序方式1 ,  排序字段2 排序方式2... ...

  2. java程序员学C#基本语法两个小时搞定(对比学习)

    对于学习一门新的语言,关键是学习新语言和以前掌握的语言的区别,但是也不要让以前语言的东西,固定了自己的思维模式,多看一下新的语言的编程思想. 1.引包 using System;java用import ...

  3. es6 dsl与sql对比

    [README] 1.本文总结了 dsl 与 sql的对比写法: 2.es采用 7.2.1 版本: [1]创建es索引 1)新建一个数据库事务执行日志索引 put localhost:9200/txl ...

  4. 丹琦女神新作:对比学习,简单到只需要Dropout两下

    文 | 花小花Posy 上周把 <对比学习有多火?文本聚类都被刷爆了...>分享到卖萌屋的群里后,遭到了群友们一波嫌弃安利. 小伙伴们表示,插入替换的数据增强方式已经Out了,SimCSE ...

  5. 【ElasticSearch】使用 _validate API 在不执行查询的情况下验证查询

    1.概述 转载:使用 _validate API 在不执行查询的情况下验证查询 我们知道有的 Elasticsearch 的查询是非常耗时的.我们可以使用 _validate API 来对我们的 DS ...

  6. Elastic Search Java API(文档操作API、Query DSL查询API)、es搜索引擎实战demo

    elastic search实战小demo:https://github.com/simonsfan/springboot-quartz-demo,分支:feature_es 之前在 Elastic ...

  7. ElasticSearch整合SpringBoot的API操作

    在我们熟悉了 es 的基本rest 的操作之后,我们将使用SpringBoot进行整合,进一步熟悉Java API的相关操作. 1.创建一个标准的Springboot项目,引入Boot相关依赖之后,还 ...

  8. 第三章 Elasticsearch Query DSL -- 查询

    第三章 Elasticsearch Query DSL -- 查询 摘要 查询和过滤的上下文(context) 相关性得分 查询上下文 过滤上下文 示例(下面这些查询参数,后续会详述) 全文查询 in ...

  9. 知识图谱-生物信息学-医学顶刊论文(Bioinformatics-2022)-SGCL-DTI:用于DTI预测的监督图协同对比学习

    14.(2022.5.21)Bioinformatics-SGCL-DTI:用于DTI预测的监督图协同对比学习 论文标题: Supervised graph co-contrastive learni ...

最新文章

  1. C++ limits头文件
  2. 类的属性、类的方法、类的内置方法
  3. 一篇RxJava友好的文章(一)
  4. android java和c混合编程_C/C++在Java、Android和Objective-C三大平台下实现混合编程
  5. c语言链表排序交换节点,链表节点排序问题
  6. 思达BI软件StyleIntelligence实例教程—柱状数据对比分析图
  7. java弹出子窗口_java实现点击按钮事件弹出子窗口
  8. php 监听 扫描枪,Android监听扫描枪内容(一)
  9. 云计算机基础架构,云计算基础架构的解决方案
  10. 深富策略:险资密集调研 周期股板块能否崛起?
  11. AUC与ROC曲线面积的意义(细扒sklearn的AUC计算方法)
  12. 沁恒微USB蓝牙单片机CH573F初步熟悉
  13. 国内顶尖网页游戏制作人和主策划名单(转)
  14. Facebook:Novi数字钱包“已经准备好进入市场”
  15. 2018宁夏网络赛 B Goldbach (米勒拉宾素数测试)
  16. Java基础新手上路篇
  17. 数组遍历产生的索引越界问题
  18. uni-app 实现自定义拍摄头像功能
  19. 个人项目-地铁出行路线
  20. 北京大学20--年接收推荐免试攻读研究生个人陈述

热门文章

  1. JS脚本实现模拟按钮点击:批量抓取百度推广中的关键词建议
  2. 六、Hystrix详解三:Hystrix的健康监测
  3. python彩色七段数码管绘制
  4. 从零开始学 Web 之 移动Web(九)微金所案例
  5. 卸载程序时总是 显示“请等待当前程序完成卸载或更改”!
  6. oracle中execute是什么意思,oracle中EXECUTEIMMEDIATE是什么意思?如何使用,请用自己......
  7. 跨时钟域信号处理(二)——异步fifo的Verilog实现(附同步fifo的实现)
  8. easyExcel导入excel实现动态进度条
  9. 查看ip地址 通过域名
  10. HTML 5 音频与视频标签