Elasticsearch API简单使用
时间:2022-06-15
本文章向大家介绍Elasticsearch API简单使用,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
笔者喜欢做一些小工具,给PM或者组内同学使用,不仅仅可以提高工作效率,而且也可以学一些前端方面的知识。之前使用Elasticsearch API做过管理后台的小工具,一直没有总结,最近给PM哥们又做了一个小工具,而且也使用到了Elasticsearch API,正好做个简单分享。
需求
PM最近经常让我统计每家机构调用某个接口的失败记录信息,虽然接口调用记录已经打到日志了,但是没有关键字信息所以很难去统计,显然之前做过根据一个或多个关键字查询我们平台所有日志的后台管理小工具不适用了。
方案
- 业务底层必须把三方返回信息返回到上层
- 业务上层统一处理,按照固定格式把信息打到日志里
- 管理后台根据条件筛选查找,通过es根据关键字查找
编码
- 业务代码日志打印
JSONObject jsonObject = new JSONObject();
jsonObject.put("time", new Date());
jsonObject.put("companyId", companyId);
jsonObject.put("companyName", CompanyAppIdEnum.getCompanyAppIdEnum(companyId).getDesc());
jsonObject.put("orderNo", "暂不展示敏感信息");
jsonObject.put("orderStatus", -1);
jsonObject.put("type",FilterFailEnum.FILTER.getName());
// 关键字
jsonObject.put("keyword", CompanyAppIdEnum.getCompanyAppIdEnum(companyId).getDesc() + FilterFailEnum.FILTER.getDesc());
jsonObject.put("fail", response.getErrorMsg());
thirdLogger.info(jsonObject.toJSONString());
- Elasticsearch Client构建 因为是Java程序员,所以用的Java客户端 构建TransportClient
/**
* elasticsearch集群
* TransportClient获取
*
* @return
*/
protected TransportClient getTransportClient() {
if (transportClient == null) {
synchronized (ElkLogSearchServiceImpl.class) {
if (transportClient == null) {
//ES集群地址
String[] ESHosts = configUtil.getEsClientHosts().split(",");
//设置es实例名称
Settings settings = Settings.builder().put("cluster.name", configUtil.getEsClusterName())
//自动嗅探整个集群的状态,把集群中其他ES节点的ip添加到本地的客户端列表中、
.put("client.transport.sniff", true)
.put("xpack.security.user", configUtil.getEsClientUser())
.put("xpack.security.transport.ssl.verification_mode", "certificate")
.put("xpack.security.transport.ssl.enabled", "true")
.put("xpack.security.transport.ssl.keystore.path", configUtil.getEsCertificates())
.put("xpack.security.transport.ssl.truststore.path", configUtil.getEsCertificates()).build();
TransportClient preBuiltTransportClient = new PreBuiltXPackTransportClient(settings);
for (String esHost : ESHosts) {
preBuiltTransportClient.addTransportAddress(new TransportAddress(new InetSocketAddress(esHost, 9300)));
}
return preBuiltTransportClient;
}
}
}
return transportClient;
}
- 根据时间获取索引、构建查询条件
/**
* 根据时间范围获得索引
* @param startDate
* @param endDate
* @return
*/
protected String[] getIndices(long startDate, long endDate,String indiceName) {
int days = (int) (endDate - startDate) / 86400000 + 1;
String[] indices = new String[days];
for (int i = 0; i < days; i++) {
String dayIndex = simpleDateFormat.format(new Date(startDate + i * 86400000));
indices[i] = indiceName + dayIndex;
}
return indices;
}
protected QueryBuilder getFilterQueryBuilder(String keywords){
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
// 可以添加多个查询条件
queryBuilder.must(QueryBuilders.matchPhraseQuery("message.params",keywords));
return queryBuilder;
}
- 查询
public ResponseVo getFilterFailByES(Long companyId, int pageNo, FilterFailEnum filterFailEnum, long startDate, long endDate) {
ResponseVo vo = new ResponseVo();
LinkedList linkedList = new LinkedList();
transportClient = getTransportClient();
String regexp = CompanyAppIdEnum.getCompanyAppIdEnum(companyId).getDesc() + filterFailEnum.getDesc();
String[] indices = getIndices(startDate, endDate, IndiceTypeEnum.JKZJ_API_THIRD_SERVER_LOG.getIndiceName());
QueryBuilder queryBuilder = getFilterQueryBuilder(regexp);
try {
SearchResponse searchResponse = transportClient.prepareSearch(indices).setQuery(queryBuilder).addSort("logdate", SortOrder.DESC).setSize(10).setFrom((pageNo - 1) * 10).execute().actionGet();
SearchHits searchHits = searchResponse.getHits();
if (searchHits.getTotalHits() > 0) {
for (SearchHit searchHit : searchHits) {
JSONObject paramsDetailsJO = JSONObject.parseObject(searchHit.getSourceAsString());
JSONObject messapgeParam = paramsDetailsJO.getJSONObject("message").getJSONObject("params");
Long time = messapgeParam.getLong("time");
String companyIds = messapgeParam.getString("companyId");
String companyName = messapgeParam.getString("companyName");
String orderNo = messapgeParam.getString("orderNo");
String orderStatus = messapgeParam.getString("orderStatus");
String fail = messapgeParam.getString("fail");
String type = messapgeParam.getString("type");
Map map = new HashMap();
map.put("companyId", companyIds);
Date times = new Date(Long.valueOf(time));
map.put("time", DateUtils.getDate(times));
map.put("companyName", companyName);
map.put("orderNo", orderNo);
map.put("orderStatus", orderStatus);
map.put("fail", fail);
map.put("type", type);
linkedList.add(map);
}
}
vo.setVoList(linkedList);
//总条数
vo.setMsg(searchHits.getTotalHits() + "");
} catch (Exception e) {
logger.error(e.getMessage(), e);
vo.setCode(204);
vo.setMsg("查询失败");
}
return vo;
}
页面展示
好啦,再也不用被PM老哥烦了。
- 【深度】Deep Visualization:可视化并理解CNN
- Appium+python自动化28-name定位
- Appium+python自动化29-toast消息
- guestfs这么强大你知道吗
- appium+python自动化30-list定位(find_elements)
- python笔记4-遍历文件夹目录os.walk()
- 【专知国庆特刊-PyTorch手把手深度学习教程系列01】一文带你入门优雅的PyTorch
- python接口自动化14-multipart/form-data上传图片
- 【干货】RL-GAN For NLP: 强化学习在生成对抗网络文本生成中扮演的角色
- python接口自动化15-multipart/form-data表单提交
- appium+python自动化32-android_uiautomator定位进阶版
- appium+python自动化33-解锁九宫格(TouchAction)
- 用qemu中最少的代码实现一个kvm模拟器
- 关关的刷题日记07——Leetcode 26. Remove Duplicates from Sorted Array 方法1
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Qt音视频开发39-人脸识别在线版
- 前端学数据结构与算法(九):常见五种排序算法的实现及其优缺点
- 用最容易的方式学会单链表(Python实现)
- 突击并发编程JUC系列-万字长文解密 JUC 面试题
- 《剑指Offer》-- 题目一:找出数组中重复的数字(Python多种方法实现)
- 用最复杂的方式学会数组(Python实现动态数组)
- 一起来刷《剑指Offer》——不修改数组找出重复的数字(思路及Python实现)
- 第一章 Go介绍
- 第二章 Go变量
- 揭秘 @available
- 第三章 Go常量、枚举、数学运算
- 通过 LLVM IR 看语言特性(1)
- Django入门笔记——第八章、模板引擎设置
- 第四章 Go语言中的控制语句
- 第六章 函数