ElasticSearch java封装

本文介绍Elasticsearch中常见的查询与聚合操作方法,包括如何构建查询条件、执行分页查询、设置排序规则以及处理聚合结果等。此外,还提供了获取索引字段及其类型的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于平时操作的一些常用操作封装,后续会持续更新。

/**
 * 查询语句执行
 * @param client 
 * @param query 查询条件
 * @param aggre 聚合条件
 * @param indexName 索引名称
 * @param type 索引类型
 * @param page 
 * @param size
 * @param sort 排序字段
 * @param order 排序方式
 * @param includes 要返回的字段
 * @param excludes 不反悔的字段
 * @return
 * @throws Exception
 */
public static SearchResponse searchAndAggres(TransportClient client,QueryBuilder query,List<AggregationBuilder> aggre,String indexName,String type,int page,int size,String sort,String order,String[] includes,String[] excludes) throws Exception{
   // 创建查询索引
   SearchRequestBuilder searchRequestBuilder = client
   .prepareSearch(indexName);
   // 设置查询索引类型
   searchRequestBuilder.setTypes(type);

   // 设置查询条件
   searchRequestBuilder.setQuery(query);

   // 分頁
   if ((page > 0) && (size > 0)) {
      // 设置查询数据的位置,分页用吧
      searchRequestBuilder.setFrom(size * (page - 1));
      // 设置查询结果集的最大条数
      searchRequestBuilder.setSize(size);
   }else {
      // 设置查询数据的位置,分页用吧
      searchRequestBuilder.setFrom(0);
      // 设置查询结果集的最大条数
      searchRequestBuilder.setSize(10);
   }

   // 字段排序
   SortOrder sortOrder = SortOrder.ASC;// 排序方式 默认升序
   // 排序方式
   if ("desc".equals(order)) {
      sortOrder = SortOrder.DESC;// 排序方式 註明降序
   }

   // 排序字段
   if (StringUtils.isNotBlank(sort)) {
      searchRequestBuilder.addSort(sort, sortOrder);// 升序
   }

   // 设置是否按查询匹配度排序
   searchRequestBuilder.setExplain(false);
   
   //设置聚合条件
   if(aggre!=null && aggre.size()>0) {
      for (AggregationBuilder aggregationBuilder : aggre) {
         searchRequestBuilder.addAggregation(aggregationBuilder);
      }
   }
   if(includes!=null || excludes!=null) {
      searchRequestBuilder.setFetchSource(includes, excludes);
   }
   try {
      // 最后就是返回搜索响应信息
      System.out.println(searchRequestBuilder.toString());//打印DSL
      SearchResponse response = searchRequestBuilder.execute().actionGet();
      return response;
   } catch (Exception e) {
      e.printStackTrace();
      throw e;
   }
}

/**
 * 查询结果处理
 * @param data 返回结果集
 * @param hits 待处理结果集
 * @return
 */
public static JSONObject hitsResult(JSONObject data,SearchHits hits) throws Exception {
   try {
      List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
      for(SearchHit hit:hits){
         Map<String, Object> map = hit.getSourceAsMap();
         list.add(map);
      }
      data.put("list", list);
      data.put("total", hits.getTotalHits());
   } catch (Exception e) {
      e.printStackTrace();
      throw e;
   }
   return data;
}

/**
 * 一级聚合结果处理
 * @param aggres 待处理聚合结果集
 * @param nextArea 聚合字段
 * @return
 */
public static JSONArray aggresResult(Aggregations aggres, String nextArea) throws Exception {
   try {
      Terms terms = aggres.get(nextArea);
      JSONArray buckets = new JSONArray();
      for(Terms.Bucket tm:terms.getBuckets()){
         JSONObject bucket = new JSONObject();
         String key = tm.getKeyAsString();
         long value = tm.getDocCount();
         bucket.put("key", key);
         bucket.put("value", value);
         buckets.add(bucket);
      }
      return buckets;
   } catch (Exception e) {
      e.printStackTrace();
      throw e;
   }
}

创建查询:

//创建查询
BoolQueryBuilder query = QueryBuilders.boolQuery();
query.must(QueryBuilders.termQuery(field, areaCode));
query.must(QueryBuilders.termQuery(field, value));//多条件

创建聚合:

//聚合
AggregationBuilder aggre = AggregationBuilders.terms(nextArea).field(nextArea).size(200);

//判断某个索引是否存在
    public static boolean indexExists(Client client,String index){
        IndicesExistsRequest request = new IndicesExistsRequest(index);
        IndicesExistsResponse response = client.admin().indices().exists(request).actionGet();
        if (response.isExists()) {
            return true;
        }
        return false;
    }

    /**
     * 获取es索引的字段及类型
     * @param client es客户端
     * @param index 索引名称
     * @param type 索引类型
     * @return
     */
    public static JSONObject getEsColumns(TransportClient client,String index,String type) {
        ImmutableOpenMap<String, MappingMetaData> mappings = client.admin().cluster().prepareState().execute()
                .actionGet().getState().getMetaData().getIndices().get(index).getMappings();
//        Map<String, Object> mapping = mappings.get("area_map").getSourceAsMap();
        String mapping = mappings.get(type).source().toString();
        JSONObject map = JSON.parseObject(mapping);
        System.out.println(mapping);
        JSONObject esColumMap = map.getJSONObject(type).getJSONObject("properties");
        JSONObject esColumns = new JSONObject();//存放es的字段及类型键值对
        Set<String> keySet = esColumMap.keySet();
        for (String key : keySet) {
            esColumns.put(key, esColumMap.getJSONObject(key).getString("type"));
        }
        return esColumns;
    }

/**
     * 取得实例
     * @return
     */
    public static synchronized TransportClient getTransportClient(String clusterName,String ip,int port) {
        TransportClient client = null ;
        try {
            Settings settings = Settings.builder().put("cluster.name", clusterName)
        /*            .put("client.transport.sniff", true)*/
                    .put("client.transport.ping_timeout", "30s").build();
            client = new PreBuiltTransportClient(settings);
            client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(ip), port));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return client;
    }
 
    /**
     * 关闭连接
     * @param client   es客户端
     */
    public static void close(TransportClient client) {
        client.close();
    }

 

未完待续。。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值