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 实现流程》

相关内容

热门资讯

清朝有很多有名的历史人物,能给... 清朝有很多有名的历史人物,能给大家说几个清朝的历史人物吗?林则徐,张之洞,乾隆皇帝,曾国藩,朱耷,这...
曹丕的“太子四友”指的是谁 曹丕的“太子四友”指的是谁首先说,曹丕这四个,陈群司马懿是顶级的谋士和政治家,吴质有些小聪明,朱铄不...
在这次遇难者中存在了几名幸存者... 在这次遇难者中存在了几名幸存者。这句话是不是逻辑错误这句话的逻辑没有问题,有问题的是用词不当。遇难者...
在中国古代,有许多充满哲学智慧... 在中国古代,有许多充满哲学智慧的成语典故、寓言故事,如...在中国古代,有许多充满哲学智慧的成语典故...
清澈的意思是什么,… 清澈的意思是什么,…清净而明澈清而透明【造句】看着他清澈而又天真的眼眸,我的心久久不能平静……
蚂蚁森林合种爱情树一方退出怎么... 蚂蚁森林合种爱情树一方退出怎么找回来两个人合种的爱情树,我退出来,我怎么再次加入进去继续合作那个树?...
有好看的古代修炼小说推荐吗? 有好看的古代修炼小说推荐吗?古代重生穿越修炼......让我帮你找一下这些古代修炼的小说,找到这些类...
女主重生爱上前世辜负的人 女主重生爱上前世辜负的人重生我是你正妻渣女重生之竹马重生之弃渣重生之夫君可欺重生之换我疼你重生妇归来...
华胥引有广播剧吗 华胥引有广播剧吗现有的华胥引的广播剧是忆语广播剧社出品的,只有十三月和杯(这个是错字,请无视,居然输...
选文韩麦尔先生在说了,我的朋友... 选文韩麦尔先生在说了,我的朋友们我就要离开你们呢了,再见了银头鲑鱼tj75rt6yturdrruv ...
中通快递从北京保定市到广东揭阳... 中通快递从北京保定市到广东揭阳普宁要多久?中通快递从北京保定市到广东揭阳普宁要多久?从北京到广东需要...
关于离婚悲伤的歌曲 关于离婚悲伤的歌曲关于离婚悲伤的歌曲林俊杰《可惜没如果》 张靓颖《我走以后》 金志文《流着泪说分手》...
形容文笔差怎么说啊? 形容文笔差怎么说啊?哥哥姐姐,麻烦问下,我是做文员的,形容文案方面的工作很差应该怎么说啊?粗鄙怎么样...
我想做未婚妈妈,可行吗? 我想做未婚妈妈,可行吗?没关系吧?我同学好多他们妈妈都是30岁以后省得他们,都没事啊,但是如果你自己...
如何在两个excel表格里筛选... 如何在两个excel表格里筛选出重复的名字如何在两个excel表格里筛选出重复的名字1、电脑打开EX...
且试天下 哪些小说是用白绫做武... 且试天下 哪些小说是用白绫做武器的?神雕侠侣吖- -..小龙女一开始就是用白绫的聊斋 辛十四娘嘿嘿~...
自带高冷体质,笑起来温暖又治愈... 自带高冷体质,笑起来温暖又治愈的星座,你了解吗?虽然天生高冷体质,但是笑起来特别的温暖治愈的新作用天...
火星未解之谜 火星未解之谜多列举一些,每个事例最好长一点,谢啦~“火星人脸”, “地表被水冲击河道”,“原始大气和...
我是1991年10月4号生的,... 我是1991年10月4号生的,是什么星座啊有的说是处女座有的说是天平座,糊涂了,到底是什么啊很负责任...
梦见白狐狸,然后当时我骑着自行... 梦见白狐狸,然后当时我骑着自行车,我想躲开它,他很凶的的追赶我,最后它向我扑了过来,然后我就醒乐.你...