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

news2024/11/9 9:45:42

目录

一、开发环境

二、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 创建 SSLContext
                SSLContext 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半径查询

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

	@Resource
    private 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;
	}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1808885.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[AI Google] 使用 Gemini 取得更多成就:试用 1.5 Pro 和更多智能功能

总结 Google 正在为超过 35 种语言的 Gemini Advanced 订阅者推出 Gemini 1.5 Pro。此次更新包括 100 万个 token 的上下文窗口、改进的数据分析功能和增强的多模态图像理解。新功能包括用于自然对话的 Gemini Live、先进的规划工具和可定制的 Gems。更新还集成了更多 Google …

基于STM32开发的智能农业监控系统

目录 引言环境准备智能农业监控系统基础代码实现&#xff1a;实现智能农业监控系统 4.1 土壤湿度传感器数据读取4.2 温湿度传感器数据读取4.3 水泵与风扇控制4.4 用户界面与数据可视化应用场景&#xff1a;农业环境监测与管理问题解决方案与优化收尾与总结 1. 引言 随着智能…

SkyWalking之P0核心业务场景输出调用链路应用

延伸扩展&#xff1a;XX核心业务场景 路由标签打标、传播、检索 链路标签染色与传播 SW: SkyWalking的简写 用户请求携带HTTP头信息X-sw8-correlation “X-sw8-correlation: key1value1,key2value2,key3value3” 网关侧读取解析HTTP头信息X-sw8-correlation&#xff0c;然后通过…

Navicat导入json文件(json文件数据导入到MySQL表中)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

在Modelarts上微调量化Llama3,并用docker部署

本文概述 本文先使用llama-factory去微调llama3大模型&#xff0c;然后使用llama.cpp去量化模型并打包为docker部署到服务器上让qq机器人能够调用服务&#xff0c;实现qq群内问答。 效果展示 环境准备 本文使用华为云的Modelarts的notebook去进行的模型微调 ubuntu20.04&#x…

揭开FFT时域加窗的奥秘

FFT – Spectral Leakage 假设用于ADC输出数据分析的采样点数为N&#xff0c;而采样率为Fs&#xff0c;那我们就知道&#xff0c;这种情况下的FFT频谱分辨率为δf&#xff0c;那么δfFs/N。如果此时我们给ADC输入一个待测量的单频Fin&#xff0c;如果此时Fin除以δf不是整数&a…

IP地址冲突检测(Address Conflict Detect)记录

学习目标&#xff1a; 提示&#xff1a;ACD(IP地址冲突检测)原理学习与抓包分析 学习记录&#xff1a; 1、Address Conflict Detection地址冲突检测&#xff0c;简称ACD。RFC 5227提出ACD机制。其中ACD将arp request分为ARP probe和ARP announcement两种&#xff1b; ACD定义…

数据中心网络运维探讨

数据中心网络运维探讨 数据中心网络运维通过科学的网络架构设计、实时监控管理、智能化运维工具和全面的安全防护&#xff0c;确保网络的高效、安全运行。它不仅提升了运维效率和网络可靠性&#xff0c;还保障了业务的连续性和数据安全。随着技术的不断进步&#xff0c;智能化…

常见机器学习的原理及优略势

有监督 一、线性回归&#xff08;Linear Regression) 1. 算法原理 线性回归&#xff08;Linear Regression&#xff09;是一种基本的回归算法&#xff0c;它通过拟合一个线性模型来预测连续型目标变量。线性回归模型的基本形式是&#xff1a;y w1 * x1 w2 * x2 … wn * …

在python中关于元组的操作

创建元组 如上图所示&#xff0c;a&#xff08;&#xff09;和b tuple(),,这两种方式都可以创建出元组。 在创建元组的时候&#xff0c;指定初始值 如上图所示&#xff0c;也可以在创建元组的时候&#xff0c;指定初始值。 同列表一样元组中的元素也可以是任意类型的。 同列…

Map深度学习

Map Map是一个键值对的集合&#xff0c;和object类似&#xff0c;Map作为构造函数&#xff0c;可以通过全局对象获取到。需要通过new操作创建实例对象&#xff0c;直接调用会报错。Map构造函数接受一个iterable类型的函数&#xff0c;用来初始化Map。 var m new Map([[1, &qu…

pyrouge(ROUGE-1.5.5)的安装步骤和使用说明(适用于Linux 系统)

摘要&#xff1a;本文讲解了如何配置和使用文本摘要的评价指标ROUGE(linux 系统)。 ✅ NLP 研 1 选手的学习笔记 简介&#xff1a;小王&#xff0c;NPU&#xff0c;2023级&#xff0c;计算机技术 研究方向&#xff1a;摘要生成、大语言模型生成 文章目录 一、为啥要写这篇博客&…

Redis 双写一致原理篇

前言 我们都知道,redis一般的作用是顶在mysql前面做一个"带刀侍卫"的角色,可以缓解mysql的服务压力,但是我们如何保证数据库的数据和redis缓存中的数据的双写一致呢,我们这里先说一遍流程,然后以流程为切入点来谈谈redis和mysql的双写一致性是如何保证的吧 流程 首先…

flink源码系列:RPC通信

这里写目录标题 1. 本节课目的2.开始本节内容2.1.RPC概念3.2.大数据组件常见的RPC实现技术3.3.Pekko&#xff08;Akka&#xff09;3.3.1. Akka、Pekko基本概念3.3.2.Pekko Demo事例3.3.2.1.PekkoData 类3.3.2.2.PekkoRpcReceiverActor类3.3.2.3.PekkoRpcSenderActor 类3.3.2.4.…

传感器展会|2024厦门传感器与应用技术展览会

传感器展会|2024厦门传感器与应用技术展览会 时间&#xff1a;2024年11月1-3日 地点&#xff1a;厦门国际会展中心 XISE EXPO展会介绍&#xff1a; 2024中国&#xff08;厦门&#xff09;国际传感器与应用技术展览会将于2024年11月1-3日在厦门国际会展中心举行&#xf…

基于标定数据将3D LiDAR点云与相机图像对齐(含C++版本代码)

这段C代码演示了如何将Velodyne激光雷达的点云数据投影到相机图像上。该过程涉及以下主要步骤: 读取并解析来自文件的标定数据&#xff0c;包括P2矩阵、R0_rect矩阵和Tr_velo_to_cam矩阵。这些矩阵用于将激光雷达点云从Velodyne坐标系转换到相机坐标系。从二进制文件中读取Velo…

10.1 Go Goroutine

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

解密Spring Boot:深入理解条件装配与条件注解

文章目录 一、条件装配概述1.1 条件装配的基本原理1.2 条件装配的作用 二、常用注解2.1 ConditionalOnClass2.2 ConditionalOnBean2.3 ConditionalOnProperty2.4 ConditionalOnExpression2.5 ConditionalOnMissingBean 三、条件装配的实现原理四、实际案例 一、条件装配概述 1…

SpringBoot中实现一个通用Excel导出功能

SpringBoot中实现一个通用Excel导出功能 文章目录 SpringBoot中实现一个通用Excel导出功能这个导出功能的特色看效果代码解析1、依赖2、Excel 入参(ExcelExportRequest)3、Excel 出参(ExcelExportResponse)4、ExcelExportField5、ExcelExportUtils 工具类6、ExcelHead 头部…

LeetCode1318或运算的最小翻转次数

题目描述 给你三个正整数 a、b 和 c。你可以对 a 和 b 的二进制表示进行位翻转操作&#xff0c;返回能够使按位或运算 a OR b c 成立的最小翻转次数。「位翻转操作」是指将一个数的二进制表示任何单个位上的 1 变成 0 或者 0 变成 1 。 解析 这一题就按位依次比较就行了。取这…