前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Elasticsearch API简单使用

Elasticsearch API简单使用

作者头像
LiosWong
发布2018-12-10 10:31:42
7850
发布2018-12-10 10:31:42
举报
文章被收录于专栏:后端沉思录

笔者喜欢做一些小工具,给PM或者组内同学使用,不仅仅可以提高工作效率,而且也可以学一些前端方面的知识。之前使用Elasticsearch API做过管理后台的小工具,一直没有总结,最近给PM哥们又做了一个小工具,而且也使用到了Elasticsearch API,正好做个简单分享。

需求

PM最近经常让我统计每家机构调用某个接口的失败记录信息,虽然接口调用记录已经打到日志了,但是没有关键字信息所以很难去统计,显然之前做过根据一个或多个关键字查询我们平台所有日志的后台管理小工具不适用了。

方案

  1. 业务底层必须把三方返回信息返回到上层
  2. 业务上层统一处理,按照固定格式把信息打到日志里
  3. 管理后台根据条件筛选查找,通过es根据关键字查找

编码

  • 业务代码日志打印
代码语言:javascript
复制
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
代码语言:javascript
复制
/**
     * 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;
    }
  • 根据时间获取索引、构建查询条件
代码语言:javascript
复制
/**
 * 根据时间范围获得索引
 * @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;
}
代码语言:javascript
复制
protected QueryBuilder getFilterQueryBuilder(String keywords){
    BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
    // 可以添加多个查询条件
    queryBuilder.must(QueryBuilders.matchPhraseQuery("message.params",keywords));
    return queryBuilder;
}
  • 查询
代码语言:javascript
复制
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老哥烦了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-11-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 后端沉思录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
Elasticsearch Service
腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档