RestHighLevelClient 操作es

摘要:
1.根据id列表查询@AutowiredprivateRestHighLevelClientrestHighLevelClient;公共<T>列表<T>getByIds(Stringindex,List<String>id,Class<T>T类){SearchRequestsearchRequest=newSearchRequest();//索引searchRequest.i

1,根据id 列表查询

  @Autowired
    private RestHighLevelClient restHighLevelClient;

    public <T>List<T> getByIds(String index, List<String> ids,Class<T> tClass) {

        SearchRequest searchRequest = new SearchRequest();
        //索引
        searchRequest.indices(index);
//        searchRequest.types(PsdAppListConstant._DOC);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query( QueryBuilders.idsQuery().addIds(ids.toArray(new String[0])) );
        searchSourceBuilder.size(ids.size());
        log.info(searchSourceBuilder.toString());

        searchRequest.source( searchSourceBuilder );
        SearchResponse searchResponse = null;
        try {
            searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        SearchHits hits = searchResponse.getHits();
        log.info("total:{},hitsize:{}",hits.totalHits,hits.getHits().length);
        List<T> result = getResult(hits, tClass);
        return result;
    }
    private <T> List<T> getResult(SearchHits hits, Class<T> tClass) {
        List<T> result = new ArrayList<>();
        for (SearchHit hit : hits) {
            String sourceAsString = hit.getSourceAsString();
            T t = JsonUtils.json2Object(sourceAsString, tClass);
            result.add(t);
        }
        return result;
    }

2,根据bulk 批量更新

  private void batchUpdateTag(List<V1PsdAppExcelReqDTO> list) throws IOException {
        if (CollectionUtils.isEmpty(list)){
            return;
        }
        BulkRequest request = new BulkRequest();
        for (V1PsdAppExcelReqDTO reqDTO : list) {
            String pkg = reqDTO.getPackageName();
            String appClass = reqDTO.getAppClass();
            String field = getEsFieldFromChinese(appClass);
            if (field == null){
                String msg = "系统没有找到 "+ appClass +" 对应的 es 三级分类" ;
                throw new BaseException("120030", msg, 400,  msg);
            }
            Map<String,Object> esMap = new HashMap<>();
            esMap.put("source",getSource(reqDTO.getSource()));
            esMap.put(field,1);
            request.add(new UpdateRequest(PsdAppListConstant.APP_LIST_DIM,PsdAppListConstant._DOC,pkg).doc(esMap));
        }
        BulkResponse bulk = restHighLevelClient.bulk(request, RequestOptions.DEFAULT);
        log.info("update to es has fail:{},msg:{}",bulk.hasFailures(),bulk.buildFailureMessage());
    }

3,根据bulk 插入数据

  private void batchAddTag(List<V1PsdAppExcelReqDTO> list) throws IOException {
        if (CollectionUtils.isEmpty(list)){
            return;
        }
        BulkRequest request = new BulkRequest();
        UserRequestInfo user = UserRequestInfoHolder.getInstance();
        Integer userNo = user.getUserNo();
        for (V1PsdAppExcelReqDTO reqDTO : list) {
            String pkg = reqDTO.getPackageName();
            String appClass = reqDTO.getAppClass();
            Map<String,Object> esMap = new HashMap<>();
            esMap.put("name",reqDTO.getName());
            esMap.put("package",pkg);
            esMap.put("uploader",userNo.toString());
            esMap.put("source",getSource(reqDTO.getSource()));
            esMap.put("load_time",System.currentTimeMillis());
            String esClassThree = getEsFieldFromChinese(appClass);
            if (esClassThree != null){
                esMap.put(esClassThree,1);
            }
            request.add(new IndexRequest(PsdAppListConstant.APP_LIST_DIM,PsdAppListConstant._DOC)
                    .source(JsonUtils.object2Json(esMap), XContentType.JSON)
                    .id(pkg)
                    .create(true));
        }
        BulkResponse bulk = restHighLevelClient.bulk(request, RequestOptions.DEFAULT);
        log.info("write to es has fail:{},msg:{}",bulk.hasFailures(),bulk.buildFailureMessage());
    }

4,利用script 更新指定条件数据

 private void invalidAppTag(V1PsdAppTagTriggerReqDTO reqDTO) throws IOException {
        String esClassThree= getEsClassThreeFromAppClass(reqDTO.getClassThree());
        String reqEsClassThree= getEsClassThreeFromAppClass(reqDTO.getClassThree());

        List<String> pkgs = reqDTO.getPkgs();

        if (CollectionUtils.isEmpty(pkgs)){// 全选
            V1PsdTagDetailReqDTO esReqDTO = BeanCopierUtils.createAndCopy(reqDTO, V1PsdTagDetailReqDTO.class);
            SearchSourceBuilder builder = buildQueryBuilder(esReqDTO,reqEsClassThree);

            UpdateByQueryRequest updateByQueryRequest = new UpdateByQueryRequest();
            updateByQueryRequest.indices(PsdAppListConstant.APP_LIST_DIM);
            updateByQueryRequest.setDocTypes(PsdAppListConstant._DOC);

            updateByQueryRequest.setQuery(builder.query());

            Map<String, Object> paramsMap = new HashMap<>();
            paramsMap.put("enable", 0);

            updateByQueryRequest.setScript(new Script(ScriptType.INLINE,
                    "painless",
                    "ctx._source." + esClassThree + " = params.enable;" +
                    "ctx._source['platform.kepler."+esClassThree+"']= params.enable;" +
                    "ctx._source['platform.anti_defraud."+esClassThree+"']= params.enable;" +
                    "ctx._source['platform.thunderbird."+esClassThree+"']= params.enable;" ,
                    paramsMap));
            log.info("update query:{} ,script:{},source:{}", updateByQueryRequest, updateByQueryRequest.getScript(), updateByQueryRequest.getSearchRequest().source());
            BulkByScrollResponse bulkByScrollResponse = restHighLevelClient.updateByQuery(updateByQueryRequest, RequestOptions.DEFAULT);
            long updated = bulkByScrollResponse.getUpdated();
            log.info("es  updated:{}", updated);

        }else {
            UpdateByQueryRequest updateByQueryRequest = new UpdateByQueryRequest();
            updateByQueryRequest.indices(PsdAppListConstant.APP_LIST_DIM);
            updateByQueryRequest.setDocTypes(PsdAppListConstant._DOC);


            updateByQueryRequest.setQuery( QueryBuilders.idsQuery().addIds(reqDTO.getPkgs().toArray(new String[0])) );
            Map<String, Object> paramsMap = new HashMap<>();
            paramsMap.put("enable", 0);
            // 外层tag
            updateByQueryRequest.setScript(new Script(ScriptType.INLINE,
                    "painless",
                    "ctx._source." + esClassThree + " = params.enable;" +
                    "ctx._source['platform.kepler."+esClassThree+"']= params.enable;" +
                    "ctx._source['platform.anti_defraud."+esClassThree+"']= params.enable;" +
                    "ctx._source['platform.thunderbird."+esClassThree+"']= params.enable;" ,
                    paramsMap));
            BulkByScrollResponse bulkByScrollResponse = restHighLevelClient.updateByQuery(updateByQueryRequest, RequestOptions.DEFAULT);
            long updated = bulkByScrollResponse.getUpdated();
            log.info("es updated:{}",updated);
        }

    }

 5,条件查询es

private SearchSourceBuilder buildQueryBuilder(V1PsdTagDetailReqDTO reqDTO,String esField){
        SearchSourceBuilder builder = new SearchSourceBuilder();
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        if (StringUtils.isNotBlank(reqDTO.getName())) {
            boolQueryBuilder.must(QueryBuilders.matchQuery("name", reqDTO.getName() ).operator(Operator.AND));
        }
        if (StringUtils.isNotBlank(reqDTO.getPkg())) {
            boolQueryBuilder.must(QueryBuilders.matchQuery("package", reqDTO.getPkg() ).operator(Operator.AND));
        }
        if (StringUtils.isNotBlank(reqDTO.getPkgInclude())) {
            String pkgInclude = reqDTO.getPkgInclude();
            String[] pkgs = pkgInclude.split(",");
            boolQueryBuilder.should(QueryBuilders.termsQuery("package", pkgs ));
        }
        if (StringUtils.isNotBlank(reqDTO.getPkgExclude())) {
            String pkgExclude = reqDTO.getPkgExclude();
            String[] pkgs = pkgExclude.split(",");
            boolQueryBuilder.mustNot(QueryBuilders.termsQuery("package", pkgs ));
        }
        if (StringUtils.isNotBlank(reqDTO.getPkgNameInclude())) {
            String pkgNameInclude = reqDTO.getPkgNameInclude();
            String[] names = pkgNameInclude.split(",");
            boolQueryBuilder.should(QueryBuilders.termsQuery("name", names ));
        }
        if (StringUtils.isNotBlank(reqDTO.getPkgNameExclude())) {
            String pkgNameExclude = reqDTO.getPkgNameExclude();
            String[] names = pkgNameExclude.split(",");
            boolQueryBuilder.mustNot(QueryBuilders.termsQuery("name", names ));
        }

        boolQueryBuilder.should(QueryBuilders.termQuery(esField, 1 ));
        boolQueryBuilder.minimumShouldMatch(1);
        boolQueryBuilder.mustNot(QueryBuilders.termQuery(esField, 0 ));// 弃用和删除的不查
        List<String> systems = reqDTO.getSystems();
        if (CollectionUtils.isNotEmpty(systems)){
            for (String system : systems) {
                boolQueryBuilder.must(QueryBuilders.termQuery("platform."+system+"." + esField, 1));
            }
        }

        if (StringUtils.isNotBlank(reqDTO.getLoadTimeSort())) {
            if (PsdTagConstant.ASC.equals(reqDTO.getLoadTimeSort())){
                builder.sort("load_time",SortOrder.ASC);
            }else {
                builder.sort("load_time",SortOrder.DESC);
            }
        }



        builder.query(boolQueryBuilder);
        Integer current = reqDTO.getCurrent();
        if (current != null){
            int size = reqDTO.getSize();
            int from = (current - 1) * size;
            if (from + size > PsdAppListConstant.ES_SEARCH_LIMIT) {
                from = PsdAppListConstant.ES_SEARCH_LIMIT - size;
            }
            builder.from(from);
            builder.size(size);

        }
        return builder;
    }

 SearchSourceBuilder builder = buildQueryBuilder(reqDTO,esField);

        SearchRequest searchRequest = new SearchRequest();
        //索引
        searchRequest.indices(PsdAppListConstant.APP_LIST_DIM);
        searchRequest.types(PsdAppListConstant._DOC);
        searchRequest.source(builder);
        log.info(searchRequest.source().toString());
        SearchResponse searchResponse = null;
        try {
            searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        SearchHits hits = searchResponse.getHits();
        long totalHits = hits.getTotalHits();
        log.info("total:{}",totalHits);

 6.添加/修改单个es数据

 public void addToEs(V1PsdUserAppTagReqDTO reqDTO) throws IOException {
        String pkg = reqDTO.getPackageName();
  if (CollectionUtils.isEmpty(appEsMap)){
            Map<String,Object> esMap = new HashMap<>();
            esMap.put("name",reqDTO.getName());
            esMap.put("package",reqDTO.getPackageName());
            esMap.put("uploader",userNo.toString());
            esMap.put("source",PsdTagConstant.SOURCE_PERSON);
            esMap.put("load_time",System.currentTimeMillis());
            for (String esClassThree : esClassThrees) {
                esMap.put(esClassThree,1);
            }

            IndexRequest indexRequest = new IndexRequest(PsdAppListConstant.APP_LIST_DIM,PsdAppListConstant._DOC);
            indexRequest.source(JsonUtils.object2Json(esMap), XContentType.JSON);
            indexRequest.id(pkg);
            indexRequest.create(true);
            IndexResponse indexResponse = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
            String id = indexResponse.getId();
            log.info("es create doc id :{}",id);
        }else {
            Map esApp = appEsMap.get(pkg);
            UpdateRequest request = new UpdateRequest(PsdAppListConstant.APP_LIST_DIM,PsdAppListConstant._DOC,pkg);
            Map<String, Object> jsonMap = new HashMap<>();
            jsonMap.put("load_time",System.currentTimeMillis());
            jsonMap.put("source",PsdTagConstant.SOURCE_PERSON);
            jsonMap.put("uploader",userNo.toString());

            Map<String, Object> activeTag = getActiveTag(esApp);
            jsonMap.putAll(activeTag);

            for (String esClassThree : esClassThrees) {
                jsonMap.put(esClassThree,1);

            }
            request.doc(jsonMap);
            UpdateResponse updateResponse = restHighLevelClient.update(request, RequestOptions.DEFAULT);
            String id = updateResponse.getId();
            log.info("es update doc id :{}",id);
        }

    }

免责声明:文章转载自《RestHighLevelClient 操作es》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇从机器码理解RIP 相对寻址(珠峰18)React下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

SpringBoot远程接口调用-RestTemplate使用

在web服务中,调度远程url是常见的使用场景,最初多采用原生的HttpClient,现采用Spring整合的RestTemplate工具类进行.实操如下:   1. 配置 主要用以配置远程链接的相关参数. @Configuration public classRestTemplateConfig { @Bean publicRest...

Java 的设计模式之一装饰者模式

刚开始接触装饰者的设计模式,感觉挺难理解的,不够后来花了一个晚上的时间,终于有头绪了 装饰者设计模式:如果想对已经存在的对象进行装饰,那么就定义一个类,在类中对已经有的对象进行功能的增强或添加另外的行为,这个类就叫装饰者类。被修饰的类叫被装饰者类,是已经存在有的功能。在装饰者类之间又可以互相装饰 特点:          1.装饰类通过构造方法来接收被装饰...

[PDFBox]后台操作pdf的工具类

PDFBox是Apache下的一个操作pdf的类库。其也提供了一个命令行的工具,也提供了java调用的第三方类库。 下载地址:https://pdfbox.apache.org/ 下面的实验基于JDK8+pdfbox-2.0.13.jar+pdfbox-app-2.0.13.jar(命令行工具库) 1.命令行使用 文档参考:https://pdfbox.a...

Dubbo学习笔记12:使用Dubbo中需要注意的一些事情

指定方法异步调用 前面我们讲解了通过设置ReferenceConfig的setAsync()方法来让整个接口里的所有方法变为异步调用,那么如何指定某些方法为异步调用呢?下面讲解下如何正确地设置默写方法为异步调用。 假如你只需要设置接口里的方法sayHello为异步调用,那么可以使用下面方式: final List<MethodConfig> a...

string.format()

Lua提供了string.format()函数来生成具有特定格式的字符串, 函数的第一个参数是格式(formatstring), 之后是对应格式中每个代号的各种数据. 由于格式字符串的存在, 使得产生的长字符串可读性大大提高了. 这个函数的格式很像C语言中的printf().函数string.format在用来对字符串进行格式化的时候,特别是字符串输出,是...

LeetCode(71):简化路径

Medium! 题目描述: 给定一个文档 (Unix-style) 的完全路径,请进行路径简化。 例如,path="/home/", =>"/home"path="/a/./b/../../c/", =>"/c" 边界情况: 你是否考虑了 路径 ="/../"的情况?在这种情况下,你需返回"/"。 此外,路径中也可能包含多个斜杠'/',如"/...