[ES三周年]Springboot 实现 ES-SQL 的流程|天天视讯
背景
记录一个最近半年犯了两次的低级编码错误,校验某个字符串信息为枚举类的某实例时,写成了:枚举类的实例.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 的流程|天天视讯
腾讯云 2023-03-12
-
全球最新:淮安向“宁”发出邀请函!
无线淮安 2023-03-12
-
新车品鉴:新款奥迪A7车型上市 售57.38万元起_每日短讯
互联网 2023-03-12
-
世界热消息:宝宝感冒咳嗽有痰怎么办最有效_宝宝感冒咳嗽有痰怎么办
互联网 2023-03-12
-
【环球速看料】saying
互联网 2023-03-12
-
焦点消息!超神学院6季多久出_超神学院6什么时候出
互联网 2023-03-12
-
山东通商产业发展有限公司-全球报资讯
互联网 2023-03-11
-
美国住房市场种族歧视严重 黑人房主需要通过“洗白”来提升房屋价值_环球今日讯
中国日报网 2023-03-11
-
电影十年一品温如言讲的是什么_十年一品温如言讲的是什么 焦点观察
互联网 2023-03-11
-
每日观察!Cosplay精选 | 白枪呆女仆,不知道视线该往哪里搁?
哔哩哔哩 2023-03-11
-
[ES三周年]Springboot 实现 ES-SQL 的流程|天天视讯
腾讯云 2023-03-12
-
全球最新:淮安向“宁”发出邀请函!
无线淮安 2023-03-12
-
新车品鉴:新款奥迪A7车型上市 售57.38万元起_每日短讯
互联网 2023-03-12
-
世界热消息:宝宝感冒咳嗽有痰怎么办最有效_宝宝感冒咳嗽有痰怎么办
互联网 2023-03-12
-
【环球速看料】saying
互联网 2023-03-12
-
焦点消息!超神学院6季多久出_超神学院6什么时候出
互联网 2023-03-12
-
山东通商产业发展有限公司-全球报资讯
互联网 2023-03-11
-
美国住房市场种族歧视严重 黑人房主需要通过“洗白”来提升房屋价值_环球今日讯
中国日报网 2023-03-11
-
电影十年一品温如言讲的是什么_十年一品温如言讲的是什么 焦点观察
互联网 2023-03-11
-
每日观察!Cosplay精选 | 白枪呆女仆,不知道视线该往哪里搁?
哔哩哔哩 2023-03-11
-
胃不好能吃西红柿吗_早上可以空腹吃西红柿吗
互联网 2023-03-11
-
微头条丨煤炭贸易公司
互联网 2023-03-11
-
左手指月舞蹈完整教程(左手指月舞蹈的串词)_全球快报
互联网 2023-03-11
-
2028奥运会举办地_2028奥运会举办地是哪里
互联网 2023-03-11
-
【世界时快讯】花旗:英国第二季度经济将陷入萎缩
格隆汇 2023-03-10
-
今日播报!邮储银行威海市分行以警银联动守住客户“钱袋子”
大众日报 2023-03-10
-
云科技为工行1.6万多家网点提供AI服务
城市网 2023-03-10
-
老神在在 环球今日讯
互联网 2023-03-10
-
全国政协委员周忠和建议:让科学顾问更好赋能中国科幻影视发展
新京报 2023-03-10
-
看热讯:拒绝甜蜜诱惑 防骗牢记心间
吉林新闻 2023-03-10
-
每日热议!可回收金额大于账面价值_可回收金额
互联网 2023-03-10
-
通程航班麻烦吗_通程航班需要注意什么-全球即时看
互联网 2023-03-10
-
生物医药创疗赛道:小核酸
Wind万得 2023-03-10
-
天王完整版txt_天王txt全集下载 环球热闻
互联网 2023-03-10
-
布朗尼比阿猫阿狗强!奥胖站队老詹:联盟有很多“偷”钱的窝囊废
直播吧 2023-03-10
-
当前播报:成渝地区双城经济圈市场一体化 川渝联手这样干!
上游新闻 2023-03-09
-
郭麒麟孟子义参加的综艺名字_郭麒麟孟子义综艺叫什么名字
互联网 2023-03-09
-
dnf心悦俱乐部怎么参与_dnf心悦俱乐部活动地址 环球快报
互联网 2023-03-09
-
今日热议:强信心·开新局丨海外市场频获订单 宇通客车火热生产
北青网 2023-03-09
-
世界热点评!缎面灰色奥迪RS7上的Vellano车轮是超级汽车杀手
互联网 2023-03-09