[ES三周年]Springboot 实现 ES-SQL 的流程 天天热文
2023-03-13 04:21:27 来源:腾讯云
背景
记录一个最近半年犯了两次的低级编码错误,校验某个字符串信息为枚举类的某实例时,写成了:枚举类的实例.equals(字符串)
,结果总是 false
,打印信息貌似正确,实际执行结果总是不达预期,仔细看看代码才发现问题。本文记录本周开发工作中遇到的几个小问题,Bug 是无法完全消除的,只能尽量减少。
ES 连接及时关闭
查看某进程的端口占用时,看到好多正连接着的 ES 连接对象,普通的 Java Web 应用,没有后台任务,怎么会保持这么多连接呢?
【资料图】
问题分析:代码有缺陷,有些请求使用 ES 进行数据查询完成后,没有关闭 ES 连接对象。ES 连接不关闭,有什么问题呢?
Linux 的每个连接都会创建一个文件句柄,毫无疑问,Socket 连接用完后不关闭,会导致端口资源泄漏。
jackson 序列化异常
在将 ElasticSearch 的 Response
对象序列化时碰到一个异常信息:
Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.elasticsearch.common.text.Text and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: org.elasticsearch.action.search.SearchResponse["hits"]->org.elasticsearch.search.SearchHits["hits"]->org.elasticsearch.search.SearchHit[0]->org.elasticsearch.search.SearchHit["shard"]->org.elasticsearch.search.SearchShardTarget["nodeIdText"])
有两种解决办法:
定义一个配置类,设置 jackson 的序列化配置属性。通过 SpringBoot 的全局配置spring.jackson.serialization.FAIL_ON_EMPTY_BEANS
设置为 false ,该配置默认为 true ,这个方式更方便。ElasticSearch 执行 SQL 的 Java 实现
回到文章标题说的问题,ElasticSearch 6 以后的版本支持 SQL 语句检索了,如何用 Java 代码实现 ES SQL 检索呢?
第一 Part,基础知识。先搞明白需求及相关的技术支持,主要如下:
ElasticSearch-SQL 功能,区分 GitHub 上的一个插件和 ElasticSearch 自身的支持能力。ES 6 以后内置了X-Pack 组件,提供了 Elasticsearch SQL 能力,就是说不用安装插件就可以使用 ES SQL 能力了。而网上很多都是介绍 ElasticSearch SQL 插件安装的,却不曾想 ES 已经内置了。ES 6 与 ES 8 的 Rest API 的语法不一样,8 以上的版本语句是/_xpack/_sql?format=
,但是旧版本是 /_xpack/sql?format=
,版本依赖问题有时候挺坑的。网上大量的资料,估计都是来自官网,全都是 /_xpack/_sql?format=
,结果我测试用的环境是 ES6 的,一直报错。第二 Part,Java 实现 ES-SQL 操作的几种方法:
Rest API 请求/_xpack/sql?format=
。JDBC-ES ,这个功能是收费的。确定方案一。
第三 Part,使用 elasticsearch-rest-high-level-client
包的 RestAPI 客户端工具可以实现 ES-SQL 的操作。基本思路是构建一个 RestClient 对象,请求路径为 /_xpack/_sql?format=json
这个用 txt 的时候,总是得不到结果,用 json 就没问题。
重要源代码如下:
// ES 连接信息构造RestClientBuilder restClientBuilder = null;if (hasPwd) {final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();/** 设置 ES 认证信息 */ credentialsProvider.setCredentials(AuthScope.ANY,new UsernamePasswordCredentials(userName, password));restClientBuilder = RestClient.builder(https) .setHttpClientConfigCallback(httpAsyncClientBuilder -> httpAsyncClientBuilder.setDefaultCredentialsProvider(credentialsProvider));} else { restClientBuilder = RestClient.builder(https)}// xpack-sql 请求构造String searchIndex = "/_xpack/sql?format=json";Request request = new Request("POST", searchIndex);request.setJsonEntity(queryJsonString);RestClient restClient = restClientBuilder.build();try { Response response = restClient.performRequest(request); String body = EntityUtils.toString(response.getEntity()); // TODO 处理 ES 响应结果} catch (IOException e) {}
ToDesk 服务占据高 CPU
电脑一直占据大量的 CPU,top 看是 ToDesk 进程,执行下面的操作好了:
sudo launchctl unload /Library/LaunchDaemons/com.youqu.todesk.service.plist复制代码
我碰到的问题,绝对不是个例,百度是个好东西,面向百度编程也没什么不好啊!
启示录
如何用 Java 实现 ES-SQL 检索流程呢?《ES SQL 检索的 Java 实现流程》,该文给的启示是直接用 Rest API 方式访问 _xpack/sql
,那就是简单了底层就是 URLConnection
。
而 ES 自身有 RestHighLevelClient 等一些列的 API,怎么用它来实现 _xpack/sql
请求呢?自己用 RestTemplate 实现倒是可以,问题是如果 ES 有认证怎么办呢?
《java 连接带认证的 elasticsearch》 这篇文章又给了我启示,用 RestClient
连接 ES 访问特定的 URL 完成。
关键词:
为你推荐
-
[ES三周年]Springboot 实现 ES-SQL 的流程 天天热文
-
降雪即将来袭,黑龙江省交管局发布交通安全提示
-
变形记作文我是一朵云500字六年级_变形记作文我是一朵云
-
焦点要闻:lv包保养_包保养
-
焦点快播:全新的丰田Innova HyCross配备了运动型TRD套件
-
失业保险个人和单位缴纳比例2021(失业保险个人和单位缴费比例)
-
商标注册标记怎么打_注册商标是怎么打出来的呀|热点
-
北京到合肥航班时刻表_北京到合肥的火车时刻表
-
全球观速讯丨桑树结果可以剪枝吗_桑树结果后能不能剪枝呢
-
有沟必火百科_有沟必火的意思是什么 环球资讯
-
小儿肺炎不输液行么_小儿肺炎不输液能好吗|当前通讯
-
对焦模式af和mf的区别_对焦模式af mf af mf
-
关于埃及的小说 焦点信息
-
北京购物去哪里比较实惠_北京购物去哪里
-
卡塔尔财团入主巴黎后11年投14.84亿欧欧冠仅1次决赛1次四强-世界热资讯
-
宝来丽-当前消息
-
世界观点:宝马中国回应降价传闻:市场指导价没有变动
-
法媒:拜登将公布2024财年预算案 拟提高对富人征税
-
长沙景点大全图_长沙景点大全
-
湖州吴兴产投8亿元私募债券项目状态更新为“已反馈”|世界视讯
推荐内容
- [ES三周年]Springboot 实现 ES-SQL 的流程 天天热文
- 降雪即将来袭,黑龙江省交管局发布交通安全提示
- 变形记作文我是一朵云500字六年级_变形记作文我是
- 焦点要闻:lv包保养_包保养
- 焦点快播:全新的丰田Innova HyCross配备了运动
- 失业保险个人和单位缴纳比例2021(失业保险个人和
- 商标注册标记怎么打_注册商标是怎么打出来的呀|热
- 北京到合肥航班时刻表_北京到合肥的火车时刻表
- 全球观速讯丨桑树结果可以剪枝吗_桑树结果后能不
- 有沟必火百科_有沟必火的意思是什么 环球资讯
- 小儿肺炎不输液行么_小儿肺炎不输液能好吗|当前通
- 对焦模式af和mf的区别_对焦模式af mf af mf
- 关于埃及的小说 焦点信息
- 北京购物去哪里比较实惠_北京购物去哪里
- 卡塔尔财团入主巴黎后11年投14.84亿欧欧冠仅1次决
- 宝来丽-当前消息
- 世界观点:宝马中国回应降价传闻:市场指导价没有
- 法媒:拜登将公布2024财年预算案 拟提高对富人征税
- 长沙景点大全图_长沙景点大全
- 湖州吴兴产投8亿元私募债券项目状态更新为“已反
- 邓婕穿衣真不简单,拼接“渔网”裙配亮片内搭,高
- 花腰新娘演员表_花腰新娘|世界热头条
- 抗竦 每日视讯
- 全球短讯!业绩预告披露不准确、实控人及其关联方
- 世界看点:UP青年·两会有我丨90后人大代表下“竹
- 魔兽世界7.0超远视距宏哪个好_魔兽世界7.0超远视
- 具俊晔新广告登上公交车,大小 S 激动发文!网
- 环球观点:沈阳民生携手MED-EL人工耳蜗:重拾健康
- 广哈通信盘中异动 股价振动9.6% 上涨6.54%
- 名人传作者简介300字作品_名人传作者简介300字-天
- 【新视野】五街镇巾帼联盟举办“三八”节主题活动
- 时尚的多面性,诠释多面的“她们”
- 英语四级考试时间分配建议_英语四级考试时间 全
- 我是你想不到的无关痛痒全文(我是你想不到的无关
- 焦点热文:事业单位基本退休费有哪些?
- 机打发票打印机安装教程_发票打印机怎么安装_全球
- 糖猫智能电话手表K1二维码怎么匹配
- 女性清洁度三度是什么意思_白带清洁度三度|当前快
- 全球资讯:棉竹
- 当前视讯!亚太股份:轮毂电机前几年均在黑河和欧
油气
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
经济
-
迈克是英文男子名,Michael的昵称,也可以代表扩音器、麦克风、话筒、送话器的意思。扩音器顾名思义就是将声音进行放大,传播的更远的意思
-
中新网通辽10月18日电 (记者 张林虎)18日,记者从内蒙古自治区通辽市奈曼旗公安局获悉,国家一级保护动物--梅花鹿误入当地村民羊群,
-
中新网杭州10月18日电 (王题题 胡燕婕)云天收夏色,浅秋正渐浓。10月18日,浙江杭州市西湖游船有限公司推出的惠民多站点“西湖环湖游
-
中新网福州10月18日电 (记者 龙敏 王东明)福州市晋安区官方18日晚间通报,18日14时47分,晋安区岳峰镇化工路爱摩轮商业广场项目摩天
-
中新网兰州10月18日电 (闫姣 艾庆龙 吉翔)“红山白土头,黄河向西流。”不少人疑问,天下黄河向东流,为何甘肃永靖县这段黄河却向西