SpringBoot2.2.4调用Elasticsearch7.2.0

@RunWith(SpringRunner.class)
@SpringBootTest
public class EsDemoApplicationTests {

    @Autowired
    private RestHighLevelClient restHighLevelClient;

    /**
     * 系统索引
     */
    private final static String ES_INDEX="content";

    /**
     * 高亮前缀字符串
     */
    private final static String PRE_TAGS = "<em>";

    /**
     * 高亮后缀字符串
     */
    private final static String POST_TAGS = "</em>";

    /**
     * 查询
     * @throws IOException
     */
    @org.junit.Test
    public void findById() throws IOException {
        GetRequest getRequest = new GetRequest(ES_INDEX,"100");
        GetResponse response = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);
        Content content = JSON.parseObject(response.getSourceAsString(),Content.class);
        System.out.println(content);
        Assert.assertNotNull(content);
    }

    /**
     * 新增或删除
     * @throws ParseException
     * @throws IOException
     */
    @org.junit.Test
    public void insertOrUpdateOne() throws ParseException, IOException {
        String setDate = DateUtils.localToUTC(new Date());
        long times = System.currentTimeMillis();
        Content content = new Content(131l,"测试插入索引文档_" + times,"测试插入文档","张三","单元测试向Elasticsearch中插入文档","<p>单元测试向Elasticsearch中插入文档</p>",setDate,1);
        IndexRequest request = new IndexRequest(ES_INDEX);
        request.id(content.getId().toString());
        request.source(JSON.toJSONString(content), XContentType.JSON);
        IndexResponse response = restHighLevelClient.index(request, RequestOptions.DEFAULT);
        Assert.assertNotNull(response);
        System.out.println(response);
    }

    /**
     * 批量插入
     * @throws IOException
     * @throws ParseException
     */
    @org.junit.Test
    public void batchInsert() throws ParseException, IOException {
        List<Content> list = new ArrayList<>();
        for(long i = 132;i<200;i++){
            Content content = new Content( i,"测试插入索引文档_" + i,"测试插入文档","张三" + i,"单元测试向Elasticsearch中插入文档","<p>单元测试向Elasticsearch中插入文档</p>",DateUtils.localToUTC(new Date()),1);
            list.add(content);
        }
        BulkRequest request = new BulkRequest();
        list.forEach(item -> request.add(new IndexRequest(ES_INDEX).id(item.getId().toString())
                .source(JSON.toJSONString(item), XContentType.JSON)));
        BulkResponse responses = restHighLevelClient.bulk(request, RequestOptions.DEFAULT);
        Assert.assertNotNull(responses);
        System.out.println(responses);
    }

    /**
     * 批量删除
     */
    @org.junit.Test
    public void deleteBatch() throws IOException {
        List<Integer> idList = new ArrayList(){
            {
                add(196);
                add(197);
                add(198);
                add(199);
            }
        };
        BulkRequest request = new BulkRequest();
        idList.forEach(item -> request.add(new DeleteRequest(ES_INDEX,item.toString())));
        BulkResponse responses = restHighLevelClient.bulk(request, RequestOptions.DEFAULT);
        System.out.println(responses);
        Assert.assertNotNull(responses);
    }

    /**
     * 搜索
     * @throws ParseException
     * @throws IOException
     * @throws IllegalAccessException
     * @throws NoSuchMethodException
     * @throws InvocationTargetException
     */
    @org.junit.Test
    public  void search() throws ParseException, IOException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
        BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
        /** must完全匹配 **/
        /** stat = 1 **/
        QueryBuilder queryStatBuilder = QueryBuilders.termQuery("stat",1);
        boolQueryBuilder.must().add(queryStatBuilder);
        /** id 范围在50到100 **/
        QueryBuilder queryIdBuilder = QueryBuilders.rangeQuery("id").from(50).to(100);
        boolQueryBuilder.must().add(queryIdBuilder);
        /** should应该匹配 **/
        /**查找标题、短标题、内容、简介以及作者中包含宜昌的内容**/
        QueryBuilder queryTitleBuilder = QueryBuilders.matchQuery("title","宜昌").boost(5.0f);
        boolQueryBuilder.should().add(queryTitleBuilder);
        QueryBuilder queryShortTitleBuilder = QueryBuilders.matchQuery("shortTitle","宜昌").boost(5.0f);
        boolQueryBuilder.should().add(queryShortTitleBuilder);
        QueryBuilder queryContentBuilder = QueryBuilders.matchQuery("content","宜昌").boost(3.0f);
        boolQueryBuilder.should().add(queryContentBuilder);
        QueryBuilder queryDescriptionBuilder = QueryBuilders.matchQuery("description","宜昌").boost(2.0f);
        boolQueryBuilder.should().add(queryDescriptionBuilder);
        QueryBuilder queryAuthorBuilder = QueryBuilders.matchQuery("author","宜昌").boost(1.0f);
        boolQueryBuilder.should().add(queryAuthorBuilder);
        /** 设置最小匹配数为2* */
        boolQueryBuilder.minimumShouldMatch(2);
        /** must_not不能匹配 **/
        Date dtStart = DateUtils.parseDate("2019-10-01 00:00:00");
        String from = DateUtils.localToUTC(dtStart);
        Date dtTo = DateUtils.parseDate("2019-11-28 00:00:00");
        String to = DateUtils.localToUTC(dtTo);
        QueryBuilder querySetDateBuilder = QueryBuilders.rangeQuery("setdate").from(from).to(to);
        boolQueryBuilder.mustNot().add(querySetDateBuilder);

        SearchSourceBuilder builder = new SearchSourceBuilder();
        /**   设置高亮字段     **/
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        HighlightBuilder.Field highlightTitle =new HighlightBuilder.Field("title");
        highlightBuilder.field(highlightTitle);
        HighlightBuilder.Field highlightContent = new HighlightBuilder.Field("content");
        highlightBuilder.field(highlightContent);
        highlightBuilder.preTags(PRE_TAGS);
        highlightBuilder.postTags(POST_TAGS);
        builder.from(0)
                .size(2)
                .query(boolQueryBuilder)
                .highlighter(highlightBuilder)
                .sort("setdate", SortOrder.DESC);

        SearchRequest request = new SearchRequest(ES_INDEX);
        request.source(builder);

        SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
        SearchHit[] hits = response.getHits().getHits();
        Assert.assertNotNull(response);
        System.out.println(response);
        for (SearchHit hit : hits) {
            Content c = JSON.parseObject(hit.getSourceAsString(),Content.class);
            for (HighlightField field : hit.getHighlightFields().values()) {
                //给高亮字段重新赋值
                PropertyUtils.setProperty(c, field.getName(), concat(field.fragments()));
            }
            System.out.println(c);
        }
    }

    private String concat(Text[] texts) {
        StringBuffer sb = new StringBuffer();
        for (Text text : texts) {
            sb.append(text.toString());
        }
        return sb.toString();
    }


    /**
     * 根据条件删除
     * @throws IOException
     */
    @org.junit.Test
    public void deleteByQuery() throws IOException {
        QueryBuilder builder = QueryBuilders.termQuery("stat",2);
        DeleteByQueryRequest request = new DeleteByQueryRequest(ES_INDEX);
        request.setQuery(builder);
        //设置批量操作数量,最大为10000
        request.setBatchSize(10000);
        request.setConflicts("proceed");
        BulkByScrollResponse response = restHighLevelClient.deleteByQuery(request, RequestOptions.DEFAULT);
        Assert.assertNotNull(response);
        System.out.println(response);
    }

    /**
     * 精确查询
     * @throws IOException
     */
    @org.junit.Test
    public void termQuery() throws IOException {
        String queryTitle = "机关参加第五届全省职工排舞大赛喜获地方团体B组二等奖";
        SearchRequest request = new SearchRequest(ES_INDEX);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.termQuery("title.keyword",queryTitle));
        searchSourceBuilder.from(0);
        searchSourceBuilder.size(10);
        request.source(searchSourceBuilder);
        SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
        Assert.assertNotNull(response);
        if(response.getHits().getHits() != null && response.getHits().getHits().length > 0){
            for(SearchHit hit : response.getHits().getHits()){
                System.out.println(hit);
            }
        }
    }

    /**
     * 匹配前缀查询
     * @throws IOException
     */
    @Test
    public void searchPrefix() throws IOException {
        String queryTitle = "机关";
        SearchRequest request = new SearchRequest(ES_INDEX);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.prefixQuery("title.keyword",queryTitle));
        searchSourceBuilder.from(0);
        searchSourceBuilder.size(100);
        request.source(searchSourceBuilder);
        SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
        Assert.assertNotNull(response);
        if(response.getHits().getHits() != null && response.getHits().getHits().length > 0){
            for(SearchHit hit : response.getHits().getHits()){
                System.out.println(hit);
            }
        }
    }

}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值