Elasticsearch-经纬度查询(8.x)

2024-06-11 08:20

本文主要是介绍Elasticsearch-经纬度查询(8.x),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、开发环境

二、pom文件

三、ES配置文件

四、ES相关字段

五、ES半径查询


ES的字段类型:geo_point,可以实现以一个点为中心的半径查询(geo_distance query)

ES地理位置查询:

  • 半径查询(geo_distance query)
  • 查询指定矩形内的数据(geo_bounding_box query)
  • 查询指定多边形内的数据(geo_polygon query)

官方文档:Geo queries | Elasticsearch Guide [8.14] | Elastic

本案例实现以某个点的经纬,查询半径查询,并计算出其他点和中心点的距离

一、开发环境

工具版本
JDK21
SpringBoot3.2.4
ElasticSearch8.13.2

二、pom文件

        <!-- Elasticsearch Java API Client --><dependency><groupId>co.elastic.clients</groupId><artifactId>elasticsearch-java</artifactId><version>8.13.2</version></dependency>

三、ES配置文件

properties:

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;import java.util.List;/*** ES 配置属性** @author meng* @date 2024-05-07*/
@Data
@ConfigurationProperties(prefix = "es")
public class ElasticsearchProperties {/*** es 请求方式*/private String scheme;/*** es 集群host ip 地址*/private List<String> hosts;/*** es 账号*/private String username;/*** es 密码*/private String password;/*** es 连接超时时间*/private Integer connectTimeOut;/*** es socket 连接超时时间*/private Integer socketTimeOut;/*** es 请求超时时间*/private Integer connectionRequestTimeOut;/*** es 最大连接数*/private Integer maxConnectNum;/*** es 每个路由的最大连接数*/private Integer maxConnectNumPerRoute;
}

config:

import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import co.elastic.clients.transport.ElasticsearchTransport;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.ssl.TrustStrategy;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import javax.net.ssl.SSLContext;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.time.Duration;/*** ES 配置类,当 es.enable=true 时自动配置** @author meng* @date 2024-05-07*/
@Slf4j
@Configuration
@EnableConfigurationProperties(value = ElasticsearchProperties.class)
@ConditionalOnProperty(prefix = "es", name = "enable")
public class ElasticsearchConfig {@Bean(name = "ElasticsearchClient")public ElasticsearchClient initClient(ElasticsearchProperties elasticsearchProperties) {HttpHost[] esHosts = elasticsearchProperties.getHosts().stream().filter(StringUtils::isNotBlank).map(it -> {String[] split = it.split(":");return new HttpHost(split[0], Integer.parseInt(split[1]), elasticsearchProperties.getScheme());}).toArray(HttpHost[]::new);final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();credentialsProvider.setCredentials(AuthScope.ANY,new UsernamePasswordCredentials(elasticsearchProperties.getUsername(),elasticsearchProperties.getPassword()));RestClientBuilder restClientBuilder = RestClient.builder(esHosts);// 连接延时配置restClientBuilder.setRequestConfigCallback(requestConfigBuilder -> {requestConfigBuilder.setConnectTimeout(elasticsearchProperties.getConnectTimeOut());requestConfigBuilder.setSocketTimeout(elasticsearchProperties.getSocketTimeOut());requestConfigBuilder.setConnectionRequestTimeout(elasticsearchProperties.getConnectionRequestTimeOut());return requestConfigBuilder;});// HttpClient 连接数配置restClientBuilder.setHttpClientConfigCallback(httpClientBuilder -> {httpClientBuilder.setMaxConnTotal(elasticsearchProperties.getMaxConnectNum());httpClientBuilder.setMaxConnPerRoute(elasticsearchProperties.getMaxConnectNumPerRoute());return httpClientBuilder;});// 设置keepalive时间restClientBuilder.setHttpClientConfigCallback(requestConfig ->requestConfig.setKeepAliveStrategy((response, context) -> Duration.ofMinutes(3).toMillis()));// 忽略HTTPS方式链接,SSL证书、主机名验证器restClientBuilder.setHttpClientConfigCallback(httpAsyncClientBuilder -> {httpAsyncClientBuilder.disableAuthCaching();httpAsyncClientBuilder.setDefaultCredentialsProvider(credentialsProvider);try {// 创建一个信任所有证书的 TrustStrategy 策略TrustStrategy acceptTrustStrategy = (chain, authType) -> true;// 使用 SSLContextBuilder 创建 SSLContextSSLContext sslContext = SSLContextBuilder.create().loadTrustMaterial(null, acceptTrustStrategy).build();httpAsyncClientBuilder.setSSLContext(sslContext);} catch (NoSuchAlgorithmException | KeyStoreException | KeyManagementException e) {e.printStackTrace();}// 忽略主机名验证httpAsyncClientBuilder.setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE);return httpAsyncClientBuilder;});RestClient restClient = restClientBuilder.build();// 使用Jackson映射器创建传输层ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());ElasticsearchClient client = new ElasticsearchClient(transport);return client;}}

四、ES相关字段

五、ES半径查询

具体查询对象,可自行定义,本方法只提供思路,莫直接粘贴使用

	@Resourceprivate ElasticsearchClient esClient;/*** 功能描述: 根据经纬度判断十米内是否有poi数据** @Param: [request]* @Author: meng* @Date: 2024/6/6 19:57*/private PoiDTO getPoiNear(PoiRequest request) {if (Objects.isNull(request.getLongitude()) && Objects.isNull(request.getLatitude())) {return null;}// 中心点查询GeoLocation geoLocation = new GeoLocation.Builder().latlon(l -> l.lon(request.getLongitude().doubleValue()).lat(request.getLatitude().doubleValue())).build();GeoDistanceQuery geoDistanceQuery = GeoDistanceQuery.of(geoDis -> geoDis.field(PoiIndexConstant.LOCATION).location(geoLocation).distance(PoiIndexConstant.DISTANCE).distanceType(GeoDistanceType.Arc));// 排序List<SortOptions> sorts = new ArrayList<>();// 距离排序 米GeoDistanceSort geoDistanceSort = GeoDistanceSort.of(geoDis -> geoDis.field(PoiIndexConstant.LOCATION).location(geoLocation).order(SortOrder.Asc).unit(DistanceUnit.Meters));SortOptions sortOptions = SortOptions.of(sort -> sort.geoDistance(geoDistanceSort));sorts.add(sortOptions);SearchRequest.Builder searchRequestBuilder = new SearchRequest.Builder();searchRequestBuilder.index(PoiIndexConstant.INDEX_READ).query(query -> query.bool(builder -> builder.filter(f -> f.geoDistance(geoDistanceQuery)))).sort(sorts).size(CommonConstant.DEFAULT_NUM);// ES查询SearchRequest searchRequest = searchRequestBuilder.build();log.info("getPoiNear query:{}", searchRequest.toString());try {SearchResponse<PoiIndex> searchResponse = esClient.search(searchRequest, PoiIndex.class);// 未查到数据if (Objects.nonNull(searchResponse.hits().total()) && searchResponse.hits().total().value() == 0) {return null;}for (Hit<PoiIndex> hit : searchResponse.hits().hits()) {if (ObjectUtil.isNotNull(hit.source())) {PoiIndex poiIndex = BeanUtil.copyProperties(hit.source(), PoiIndex.class);return BeanUtil.copyProperties(poiIndex, PoiDTO.class);}}} catch (Exception e) {log.error("es searchRequest Exception:", e);throw new ServiceException("searchRequest Exception");}return null;}

这篇关于Elasticsearch-经纬度查询(8.x)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1050639

相关文章

浅谈mysql的sql_mode可能会限制你的查询

《浅谈mysql的sql_mode可能会限制你的查询》本文主要介绍了浅谈mysql的sql_mode可能会限制你的查询,这个问题主要说明的是,我们写的sql查询语句违背了聚合函数groupby的规则... 目录场景:问题描述原因分析:解决方案:第一种:修改后,只有当前生效,若是mysql服务重启,就会失效;

MySQL多列IN查询的实现

《MySQL多列IN查询的实现》多列IN查询是一种强大的筛选工具,它允许通过多字段组合快速过滤数据,本文主要介绍了MySQL多列IN查询的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析与优化1.

mybatis-plus 实现查询表名动态修改的示例代码

《mybatis-plus实现查询表名动态修改的示例代码》通过MyBatis-Plus实现表名的动态替换,根据配置或入参选择不同的表,本文主要介绍了mybatis-plus实现查询表名动态修改的示... 目录实现数据库初始化依赖包配置读取类设置 myBATis-plus 插件测试通过 mybatis-plu

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

《MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固通俗易懂版)》本文主要讲解了MySQL中的多表查询,包括子查询、笛卡尔积、自连接、多表查询的实现方法以及多列子查询等,通过实际例子和操... 目录复合查询1. 回顾查询基本操作group by 分组having1. 显示部门号为10的部门名,员

mysql关联查询速度慢的问题及解决

《mysql关联查询速度慢的问题及解决》:本文主要介绍mysql关联查询速度慢的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql关联查询速度慢1. 记录原因1.1 在一次线上的服务中1.2 最终发现2. 解决方案3. 具体操作总结mysql

mysql线上查询之前要性能调优的技巧及示例

《mysql线上查询之前要性能调优的技巧及示例》文章介绍了查询优化的几种方法,包括使用索引、避免不必要的列和行、有效的JOIN策略、子查询和派生表的优化、查询提示和优化器提示等,这些方法可以帮助提高数... 目录避免不必要的列和行使用有效的JOIN策略使用子查询和派生表时要小心使用查询提示和优化器提示其他常

ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法

《ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法》本文介绍了Elasticsearch的基本概念,包括文档和字段、索引和映射,还详细描述了如何通过Docker... 目录1、ElasticSearch概念2、ElasticSearch、Kibana和IK分词器部署

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

查询SQL Server数据库服务器IP地址的多种有效方法

《查询SQLServer数据库服务器IP地址的多种有效方法》作为数据库管理员或开发人员,了解如何查询SQLServer数据库服务器的IP地址是一项重要技能,本文将介绍几种简单而有效的方法,帮助你轻松... 目录使用T-SQL查询方法1:使用系统函数方法2:使用系统视图使用SQL Server Configu