es7 使用RestHighLevelClient调用增删改查

    @Autowired
    private RestHighLevelClient restHighLevelClient;

    public void findById(String id) throws IOException {
        GetRequest request = new GetRequest("indexName", id);
        GetResponse response = restHighLevelClient.get(request, RequestOptions.DEFAULT);
        String source = response.getSourceAsString();
    }

    public void update(String id) throws IOException {
        GetRequest request = new GetRequest("indexName", id);
        boolean exists = restHighLevelClient.exists(request, RequestOptions.DEFAULT);
        String  data = "{'username','张三','job':'键盘侠'}";
        if(exists){
            // 更新
            UpdateRequest updateRequest = new UpdateRequest("indexName", id);
            updateRequest.doc(data, XContentType.JSON);
            restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
        }else {
            // 添加
            IndexRequest addRequest = new IndexRequest("indexName");
            addRequest.id(id);
            addRequest.source(data, XContentType.JSON);
            restHighLevelClient.index(addRequest,RequestOptions.DEFAULT);
        }
    }

    public boolean deleteById(String id) throws IOException {
        DeleteRequest deleteRequest = new DeleteRequest("indexName", id);
        DeleteResponse deleteResponse = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
        return true;
    }

    public List<Object> searchByKeywords(String keywords) throws IOException {
        SearchRequest searchRequest = new SearchRequest("indexName");
        // 用于构建查询条件
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery(keywords, "username", "job");
        searchSourceBuilder.query(multiMatchQueryBuilder);

        searchRequest.source(searchSourceBuilder);

        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        SearchHit[] searchHits = searchResponse.getHits().getHits();

        List<Object> result = new ArrayList<>();
        for (SearchHit searchHit : searchHits) {
            String source = searchHit.getSourceAsString();

            Object object = JSONObject.parseObject(source, Object.class);
            result.add(object);
        }
        return result;
    }

    public Map<String, Object> searchByPage(String keywords, Integer pageNum, Integer pageSize) throws IOException {
        SearchRequest searchRequest = new SearchRequest("indexName");
        // 用于构建查询条件
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery(keywords, "username", "job");
        searchSourceBuilder.query(multiMatchQueryBuilder);
        // 分页
        searchSourceBuilder.size(pageSize);
        searchSourceBuilder.from((pageNum - 1) * pageSize);

        searchRequest.source(searchSourceBuilder);

        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        SearchHit[] searchHits = searchResponse.getHits().getHits();

        List<Object> list = new ArrayList<>();
        for (SearchHit searchHit : searchHits) {
            String source = searchHit.getSourceAsString();

            Object object = JSONObject.parseObject(source, Object.class);
            list.add(object);
        }
        long total = searchResponse.getHits().getTotalHits().value;
        Map<String,Object> result = new HashMap<>();
        result.put("total", total);
        result.put("content", list);
        return result;
    }

    public Map<String, Object> searchByScrollPage(String keywords, String scrollId, Integer pageNum, Integer pageSize) throws IOException {
        SearchResponse searchResponse = null;
        if(ObjectUtil.isEmpty(scrollId)){
            SearchRequest searchRequest = new SearchRequest("indexName");
            // 用于构建查询条件
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery(keywords, "username");
            searchSourceBuilder.query(multiMatchQueryBuilder);
            // 分页
            searchSourceBuilder.size(pageSize);
            searchSourceBuilder.from((pageNum - 1) * pageSize);

            // 设置高亮
            HighlightBuilder highlightBuilder = new HighlightBuilder();
            highlightBuilder.field("username");
            highlightBuilder.preTags("<font color='red'>");
            highlightBuilder.postTags("</font>");

            searchSourceBuilder.highlighter(highlightBuilder);

            searchRequest.source(searchSourceBuilder);
            // 设置scroll 值
            searchRequest.scroll(TimeValue.timeValueMinutes(5));

            searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        }else {
            SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId);
            scrollRequest.scroll(TimeValue.timeValueMinutes(5));
            searchResponse = restHighLevelClient.scroll(scrollRequest, RequestOptions.DEFAULT);
        }


        SearchHit[] searchHits = searchResponse.getHits().getHits();

        List<Object> list = new ArrayList<>();
        for (SearchHit searchHit : searchHits) {
            String source = searchHit.getSourceAsString();
            Object object = JSONObject.parseObject(source, Object.class);

            // 高亮
            Map<String, HighlightField> highlightFields = searchHit.getHighlightFields();
            HighlightField username = highlightFields.get("username");
            if(username != null){
                // 获取指定字段个高亮部门
                Text[] fragments = username.getFragments();
                // 将高亮部门拼接成一个完整的高亮片段
                StringBuilder sb = new StringBuilder();
                for (Text fragment : fragments) {
                    sb.append(fragment);
                }
                sb.toString();// 高亮部分
            }
            list.add(object);
        }
        long total = searchResponse.getHits().getTotalHits().value;
        Map<String,Object> result = new HashMap<>();
        result.put("scrollId", searchResponse.getScrollId());
        result.put("total", total);
        result.put("content", list);
        return result;
    }

 

posted @ 2023-02-10 14:56  小小小小青石  阅读(713)  评论(0)    收藏  举报