jestclient的es基础操作 包括插入,查询,更新

 没什么多说的,直接上代码

package cn.pkulaw.fblx.util.es;

import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import io.searchbox.client.JestClient;
import io.searchbox.client.JestResult;
import io.searchbox.core.*;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.TermQueryBuilder;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @Author: WXM
 * @Description: jestclient的es基础操作
 * @Date: create in 2020/12/9 9:55
 */

@Repository
public class EsBaseOperate {
    @Autowired
    JestClient jestClient;

    //根据指定列colum 的值定位获取id,好多时候用到es的_id,用这个方法可以直接获取
    public String getEsId(String indexName, String type,String colum ,String value){
        String id = null;
        SearchSourceBuilder ssb = new SearchSourceBuilder();
        TermQueryBuilder tq = QueryBuilders.termQuery(colum, value);
        ssb.query(tq);

        Search search = new Search.Builder(ssb.toString()).addIndex(indexName).addType(type).build();
        try {
            SearchResult res = jestClient.execute(search);
            if(res.isSucceeded()){
                JsonArray asJsonArray = res.getJsonObject().get("hits").getAsJsonObject().get("hits").getAsJsonArray();
                //只有查询出结果,并且只有一个结果对应才正常,否则报错
                if(1==asJsonArray.size()){
                    id = asJsonArray.get(0).getAsJsonObject().get("_id").getAsString();
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        if(null != id){
            return id;
        }else {
            throw  new RuntimeException("EsBaseOperate-getEsidByGid:从es中根据gid查询id错误");
        }
    }

    //插入新数据,可以把需要的bean存入dataList 传进来
    public void addToEs(String indexName, String type, List<Object> dataList ){
        Bulk.Builder builder = new Bulk.Builder()
                .defaultIndex(indexName)
                .defaultType(type);
        for (Object data :dataList){
            builder.addAction(new Index.Builder(data).build());
        }

        Bulk bulk = builder.build();
        try {
            BulkResult execute = jestClient.execute(bulk);
            System.out.println(execute);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //根据id更新一条数据
    public void updateToEsById(String indexName, String type, String id, Map<String,Object> params){
        if(null!=params && 0!=params.size()){
            StringBuffer param = new StringBuffer();
//string类型需要加引号,时间和数字等其他类型不需要
            params.forEach((key,value)->{
                if(value instanceof String){
//这里replace可以给string中的""特殊字符加上反斜杠,防止特殊字符报错
                    param.append("\""+key+"\":\""+((String)value).replaceAll("\\\"", "\\\\\"")+"\",");
                }else {
                    param.append("\""+key+"\" : "+value+",");
                }
            });

            param.deleteCharAt(param.lastIndexOf(","));
            String script = "{\"doc\" : {" +param +"}}";

            try {
                DocumentResult res = jestClient.execute(new Update.Builder(script).index(indexName).type(type).id(id).build());
                System.out.println("更新结果"+res);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }else {
            throw new RuntimeException("EsBaseOperate-updateToEsById:更新数据的参数为空");
        }
    }

    //根据id查询es对应条
    public JsonObject selectByEsid(String indexName, String type, String id){
        JsonObject source = null;
        Get get = new Get.Builder(indexName, id).type(type).build();
        try {
            JestResult res = jestClient.execute(get);
            if(res.getJsonObject().has("_source")){
                source = res.getJsonObject().get("_source").getAsJsonObject();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return source;
    }

    //es支持的时间格式,根据自己的es服务器进行格式化配置
    public String getTimeForEs(Date date){
        if(null != date){
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            String format = sdf.format(new Date());
            return format;
        }else {
            throw new RuntimeException("EsBaseOperate-getTimeForEs:转换为es支持的时间时错误");
        }
    }
}

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用Elasticsearch的聚合(Aggregation)功能来实现查询一个字段的出现次数。以下是使用JestClient进行查询的Java代码示例: ```java import io.searchbox.client.JestClient; import io.searchbox.core.Search; import io.searchbox.core.SearchResult; import io.searchbox.params.Parameters; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.aggregations.AggregationBuilders; import org.elasticsearch.search.aggregations.bucket.terms.Terms; import org.elasticsearch.search.aggregations.metrics.sum.Sum; import java.io.IOException; public class ElasticsearchQuery { public static void main(String[] args) throws IOException { // 创建JestClient实例 JestClient jestClient = JestClientFactoryUtil.getJestClient(); // 构建查询语句 Search search = new Search.Builder("{\n" + " \"query\": {\n" + " \"match_all\": {}\n" + " },\n" + " \"aggs\": {\n" + " \"count_by_field\": {\n" + " \"terms\": {\n" + " \"field\": \"field_name.keyword\"\n" + // 要查询的字段名 " }\n" + " }\n" + " }\n" + "}\n") .addIndex("index_name") .addType("doc_type") .setParameter(Parameters.SIZE, 0) .build(); // 执行查询并获取结果 SearchResult result = jestClient.execute(search); // 处理结果 Terms terms = result.getAggregations().getTermsAggregation("count_by_field"); for (Terms.Bucket bucket : terms.getBuckets()) { String fieldValue = bucket.getKeyAsString(); long count = bucket.getDocCount(); System.out.println(fieldValue + "出现次数:" + count); } // 关闭JestClient实例 jestClient.shutdownClient(); } } ``` 在上面的代码示例中,我们使用了Elasticsearch的聚合功能来统计某一个字段的出现次数。具体来说,我们通过`AggregationBuilders.terms()`创建了一个Terms聚合,指定了要统计的字段名`field_name.keyword`,并将该聚合命名为`count_by_field`。在执行查询后,我们可以使用`result.getAggregations().getTermsAggregation("count_by_field")`方法获取该聚合的结果,然后遍历每一个Bucket,得到字段值和出现次数。 需要注意的是,由于我们只需要获取聚合结果而不需要查询的具体文档,因此可以将查询的`size`设置为0,从而减少查询的开销。另外,我们也可以使用`QueryBuilders`类来构建查询语句,以实现更复杂的查询需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值