Elasticsearch数据库的基本使用及ES健康状态red问题处理_es数据库的使用

本文介绍了如何在Elasticsearch中进行文档的创建、更新、查询、删除以及索引管理,包括处理索引查询错误的方法,同时强调了知识体系化学习的重要性。
摘要由CSDN通过智能技术生成
 public CommonResult selectIndexAll() throws IOException {
        GetAliasesRequest request = new GetAliasesRequest();
        GetAliasesResponse alias = restHighLevelClient.indices().getAlias(request, RequestOptions.DEFAULT);
        Map<String, Set<AliasMetaData>> aliases = alias.getAliases();

        Set<String> indices = aliases.keySet();
        List<EsCreateVo> esCreateVoList = new ArrayList<>();
        for (String s : indices) {
            EsCreateVo esCreateVo = new EsCreateVo();
            esCreateVo.setIndex(s);
            esCreateVoList.add(esCreateVo);
        }
        return new CommonResult().success(esCreateVoList);
    }

创建文档

public CommonResult AddDocument(EsReqVO esReqVO) throws Exception {
        System.out.println("》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》执行创建所有文档"+ DateTime.now());
        //上传文件,获取文件基本信息
        MultipartFile file = esReqVO.getFile();

        String content = wordService.importDatas(file);
//        DecimalFormat decimalFormat = new DecimalFormat("#0.000");

//        判断文件大小来转换并拼接 M单位
        long size = file.getSize();
        Double fileSizes =file.getSize()/1024/1024.;
        BigDecimal bigDecimal = BigDecimal.valueOf(fileSizes).setScale(2, BigDecimal.ROUND_HALF_UP);

        // 创建一个DocumentVO对象
        DocumentVO documentVO = new DocumentVO(file.getOriginalFilename(), String.valueOf(bigDecimal) + " M", DateTime.now().toString(), content);
        // 创建请求
        IndexRequest request = new IndexRequest(esReqVO.getIndex());
        // 制定规则 PUT /liuyou_index/_doc/1
        // request.id("13");// 设置文档ID,不设置自动生成
        request.timeout(TimeValue.timeValueMillis(1000));// request.timeout("1s")
        // 将我们的数据放入请求中
        request.source(JSON.toJSONString(documentVO), XContentType.JSON);
        // 客户端发送请求,获取响应的结果
        try {
            IndexResponse response = restHighLevelClient.index(request, RequestOptions.DEFAULT);
            System.out.println("======" + response.status());// 获取建立索引的状态信息 CREATED
            System.out.println("[[[[[[[[[" + response);// 查看返回内容
        } catch (Exception e) {
            String msg = e.getMessage();
            if (!msg.contains("201 Created") && !msg.contains("200 OK")) {
                throw e;
            }
        }
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return new CommonResult().success();
    }

创建文档的时候 需要在return之前让线程休眠至少一秒,删除也一样,因为ES有一个机制是你创建或删除文档的时候,他不会立即刷新,而是把数据放到一个类似于暂存区的地方1秒,如果不执行现成休眠的话,前端操作完创建/删除的时候,调用查询接口会查询不到你刚新增的数据,或是删除的数据还在存在列表,这是个坑,一定要注意!!!

修改文档

public CommonResult UpdateDocument(@RequestBody DocumentsVO documentsVO) throws IOException {
        UpdateRequest request = new UpdateRequest(documentsVO.getIndex(), documentsVO.getId());
        DocumentVO documentVO = new DocumentVO();
        BeanUtil.copyProperties(documentsVO, documentVO);
        request.doc(JSON.toJSONString(documentVO), XContentType.JSON);
        try {
            UpdateResponse response = restHighLevelClient.update(request, RequestOptions.DEFAULT);
            System.out.println(response.status()); // OK
            restHighLevelClient.close();
        } catch (Exception e) {
            String msg = e.getMessage();
            if (!msg.contains("201 Created") && !msg.contains("200 OK")) {
                throw e;
            }
        }

        return new CommonResult().success();
    }

查询某条文档信息的获取

public CommonResult GetDocument(String index, String id) throws IOException {
        GetRequest request = new GetRequest(index, id);
        GetResponse response = restHighLevelClient.get(request, RequestOptions.DEFAULT);
        System.out.println(response.getSourceAsString());// 打印文档内容
        System.out.println(request);// 返回的全部内容和命令是一样的

        return new CommonResult().success(response.getSourceAsString());
    }

文档的获取,并判断其是否存在

public CommonResult DocumentIsExists(String index, String id) throws IOException {
        GetRequest request = new GetRequest(index, id);
        // 不获取返回的 _source的上下文了
        request.fetchSourceContext(new FetchSourceContext(false));
        request.storedFields("_none_");
        boolean exists = restHighLevelClient.exists(request, RequestOptions.DEFAULT);
        System.out.println(exists);

        return exists ? new CommonResult().success(exists) : new CommonResult().failed("文档不存在!");
    }

删除文档

public CommonResult DeleteDocument(@RequestParam String index, @RequestParam String id) throws IOException {
        System.out.println("》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》执行删除文档"+ DateTime.now());
        DeleteRequest request = new DeleteRequest(index, id);
        request.timeout("1s");
        try {
            restHighLevelClient.delete(request, RequestOptions.DEFAULT);

        } catch (Exception e) {
            String msg = e.getMessage();
            if (!msg.contains("201 Created") && !msg.contains("200 OK")) {
                throw e;
            }
        }
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return new CommonResult().success();
    }

根据索引查询所有文档

public CommonResult SearchsDocument(@RequestParam(value = "fileName", required = false) String fileName,
                                        @RequestParam(value = "index", required = false) String index,
                                        @RequestParam("pageNo") int pageNo,
                                        @RequestParam("pageSize") int pageSize) throws IOException {
        System.out.println("》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》执行查询所有文档"+ DateTime.now());
        System.out.println("》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》索引名称"+ index);
//      创建查询请求对象
        SearchRequest searchRequest = new SearchRequest(index);
//      构建搜索条件
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        BoolQueryBuilder boolQueryBuilder = null;
        if (StrUtil.isNotBlank(fileName)){
            boolQueryBuilder = QueryBuilders.boolQuery();
            boolQueryBuilder.must(QueryBuilders.matchQuery("name",fileName));
        }

        //设置高亮
        searchSourceBuilder.highlighter(new HighlightBuilder());
        //设置分页
        searchSourceBuilder.from(pageNo);
        searchSourceBuilder.size(pageSize);
//        设置排序条件
        searchSourceBuilder.sort("time.keyword", SortOrder.DESC);
        searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
        searchSourceBuilder.query(boolQueryBuilder);

        searchRequest.source(searchSourceBuilder);
        SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        SearchHits hits = search.getHits();
        //获取总条数
        JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(hits));

//      设置总条数
        jsonObject.put("total", hits.getTotalHits().value);
        if (hits.getHits().length != 0 && StrUtil.isNotBlank(hits.getHits()[0].getIndex())){
//            给每条数据都设置索引
            jsonObject.getJSONArray("hits").getJSONObject(0).getJSONObject("sourceAsMap").put("index", hits.getHits()[0].getIndex());
        }

        return new CommonResult().success(jsonObject);

    }

搭建的ES库不仅可以用来存储用户使用的数据,我们项目中还配置了,jar包每次启动后都会把日志文件给存储到ES库中这就间接的导致了几个问题:

1.日志索引查询报错

解决方案:

@GetMapping("/searchsDocument")
    @ApiOperation("根据索引查询所有文档")
    public Result SearchsDocument(@RequestParam(value = "fileName", required = false) String fileName,
                                                  @RequestParam(value = "index", required = false) String index,
                                                  @RequestParam("pageNo") int pageNo,
                                                  @RequestParam("pageSize") int pageSize) throws IOException {
        System.out.println("》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》执行查询所有文档"+ DateTime.now());
        PageHelper.startPage(pageNo, pageSize);
// 创建查询请求对象
        SearchRequest searchRequest = new SearchRequest(index);
// 构建搜索条件
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        BoolQueryBuilder boolQueryBuilder = null;
        if (StrUtil.isNotBlank(fileName)){
            boolQueryBuilder = QueryBuilders.boolQuery();
            boolQueryBuilder.must(QueryBuilders.matchQuery("name",fileName));
        }

//设置高亮
        searchSourceBuilder.highlighter(new HighlightBuilder());
//设置分页
        searchSourceBuilder.from(pageNo);
        searchSourceBuilder.size(pageSize);

// 设置排序条件
// searchSourceBuilder.sort("time.keyword", SortOrder.DESC);
        searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
        searchSourceBuilder.query(boolQueryBuilder);

        searchRequest.source(searchSourceBuilder);
        SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        List<DocumentPageVO> list = new ArrayList<>();
        if(ObjectUtils.isEmpty(search.getHits().getHits())){
            return Result.success(new PageInfo<>());
        }
//            循环从ES中获取的数据,使用if判断判断数据结构是否一致,如不一致,则不进行返回
        for (SearchHit hit : search.getHits().getHits()) {
//            数据组装
            DocumentPageVO documentVO = new DocumentPageVO();
            documentVO.setIndex(hit.getIndex());
            documentVO.setId(hit.getId());

            if (ObjectUtils.isNotEmpty(hit.getSourceAsMap().get("name"))){
                documentVO.setName(hit.getSourceAsMap().get("name").toString());
            }
            if (ObjectUtils.isNotEmpty(hit.getSourceAsMap().get("size"))){
                documentVO.setSize(hit.getSourceAsMap().get("size").toString());
            }
            if (ObjectUtils.isNotEmpty(hit.getSourceAsMap().get("content"))){
                documentVO.setContent(hit.getSourceAsMap().get("content").toString());
            }
            if (ObjectUtils.isNotEmpty(hit.getSourceAsMap().get("time"))){
                documentVO.setTime(hit.getSourceAsMap().get("time").toString());
            }
            if (ObjectUtils.isNotEmpty(hit.getSourceAsMap().get("name")) && ObjectUtils.isNotEmpty(hit.getSourceAsMap().get("size"))){
                list.add(documentVO);
            }

        }
//        Collections.sort(list, Comparator.comparing(DocumentPageVO::getTime).reversed());

        SearchHits hits = search.getHits();
//获取总条数
        JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(hits));

// 设置总条数
        jsonObject.put("total", hits.getTotalHits().value);
        if (hits.getHits().length != 0 && StrUtil.isNotBlank(hits.getHits()[0].getIndex())){
// 给每条数据都设置索引
            jsonObject.getJSONArray("hits").getJSONObject(0).getJSONObject("sourceAsMap").put("index", hits.getHits()[0].getIndex());
        }

        return Result.success(new PageInfo<>(list));

    }

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

-1714700134057)]
[外链图片转存中…(img-OKgcN5bG-1714700134057)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值