Java 实现 ElasticSearch-SQL 检索流程
创始人
2024-02-10 13:00:12
0

背景

记录一个最近半年犯了两次的低级编码错误,校验某个字符串信息为枚举类的某实例时,写成了:枚举类的实例.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"])

有两种解决办法:

  1. 定义一个配置类,设置 jackson 的序列化配置属性。
  2. 通过 SpringBoot 的全局配置 spring.jackson.serialization.FAIL_ON_EMPTY_BEANS 设置为 false ,该配置默认为 true ,这个方式更方便。

ElasticSearch 执行 SQL 的 Java 实现

回到文章标题说的问题,ElasticSearch 6 以后的版本支持 SQL 语句检索了,如何用 Java 代码实现 ES SQL 检索呢?

第一 Part,基础知识。 先搞明白需求及相关的技术支持,主要如下:

  1. ElasticSearch-SQL 功能,区分 GitHub 上的一个插件和 ElasticSearch 自身的支持能力。ES 6 以后内置了X-Pack 组件,提供了 Elasticsearch SQL 能力,就是说不用安装插件就可以使用 ES SQL 能力了。而网上很多都是介绍 ElasticSearch SQL 插件安装的,却不曾想 ES 已经内置了。
  2. ES 6 与 ES 8 的 Rest API 的语法不一样,8 以上的版本语句是 /_xpack/_sql?format= ,但是旧版本是 /_xpack/sql?format= ,版本依赖问题有时候挺坑的。网上大量的资料,估计都是来自官网,全都是 /_xpack/_sql?format=,结果我测试用的环境是 ES6 的,一直报错。

第二 Part, Java 实现 ES-SQL 操作的几种方法:

  1. Rest API 请求 /_xpack/sql?format=
  2. 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 完成。

参考资料

  1. 《X-pack-sql VS ElasticSearch-SQL》
  2. 《java 连接带认证的 elasticsearch》
  3. 《ES SQL 检索的 Java 实现流程》

相关内容

热门资讯

中办、国办:中央财政要支持实施... 转自:财联社【中办、国办:中央财政要支持实施城市更新行动 鼓励各类金融机构在依法合规、风险可控、商业...
卓胜微:国产替代能力持续提升,... 投资者提问:董秘你好,关税战开始已经有一个月了,贵公司国产替代方面有明显提升吗?董秘回答(卓胜微SZ...
关税骤降后,这家山东外贸企业收... 转自:大众新闻-大众日报在美国所谓“对等关税”政策一个多月后,中美经贸关系迎来了重大转机。5月12日...
中国大厂扎堆去巴西送外卖 格隆汇5月15日|据一财,中国互联网公司将目光齐齐瞄准巴西。5月12日,美团宣布在未来几个月内将旗下...
调研速递|漱玉平民接受山东辖区... 5月15日下午15:00 - 16:30,漱玉平民大药房连锁股份有限公司通过全景网“投资者关系互动平...
娃哈哈试水自有品牌透露出什么信... 界面新闻记者 | 赵晓娟界面新闻编辑 | 牙韩翔5月15日,娃哈哈就工厂停工和员工投诉维权发布声明。...
中办、国办:稳妥推进危险住房改... 人民财讯5月15日电,中共中央办公厅、国务院办公厅印发《关于持续推进城市更新行动的意见》,其中提出,...
调研速递|中仑新材料接受投资者... 5月15日,中仑新材料股份有限公司通过全景网“投资者关系互动平台”以网络远程方式召开业绩说明会,回应...
陕西黑猫(601015.SH)... 陕西黑猫(601015.SH)公告,2023年11月,公司在新疆成立全资子公司新疆黑猫煤业,主要负责...
欧元区3月工业产出同比3.6%... 格隆汇5月15日|欧元区3月工业产出年率3.6%,预期2.5%,前值由1.20%修正为1%;月率2....
投资者提问:2024年报关于2... 投资者提问:2024年报关于2025年经营计划部分,没有披露2025年营收增长的具体数据,这是为什么...
骆驼股份:公司在北美的生产和销... 每经AI快讯,有投资者在投资者互动平台提问:董秘您好!贵司在美国的工厂如今是什么情况?骆驼股份(60...
全国最大光伏能源汽车运输船首航 转自:科创中国5月15日,我国汽车出海运输船船队再添新成员:全国最大光伏能源+LNG双燃料汽车运输船...
ST联创:公司正在研发的固态电... 每经AI快讯,有投资者在投资者互动平台提问:请问贵公司专利中固态电池聚合物电解液的电导率是多少?可以...
海南机场4月旅客吞吐量195.... 2025年一季度,海南机场实现收入10.90亿元,归母净利润1.00亿元。(文章来源:财中社)
北京号最精彩 | 惊艳!来朝阳... 转自:北京日报客户端▶ 就在明晚!“簋街不夜节”来啦→明晚19:30,第七届“簋街不夜节”将在簋街2...
中办、国办:稳妥推进危险住房改... 中共中央办公厅、国务院办公厅印发《关于持续推进城市更新行动的意见》提出,加强既有建筑改造利用。稳妥推...
放假通知,不调休! 转自:永州发布盼望着盼望着下一个假期就快要来了!依据国务院办公厅《关于2025年部分节假日安排的通知...
中共中央办公厅、国务院办公厅印... 转自:上观新闻中共中央办公厅、国务院办公厅近日印发《关于持续推进城市更新行动的意见》,要求坚持稳中求...
中共中央办公厅 国务院办公厅关... 据新华社北京5月15日电 中共中央办公厅 国务院办公厅关于持续推进城市更新行动的意见(2025年5月...