ElasticSearch基础4(RestClient(2.对文档的搜索))


提示:以下是本篇文章正文内容,下面案例可供参考

一、文档的各种搜索

首先要注入RestHighlevelClient
在启动类中定义RestHighLevelClient的Bean

@Bean
    public RestHighLevelClient client(){
        RestHighLevelClient restHighLevelClient = new RestHighLevelClient(RestClient.builder(
        //填入自己的IP地址
                HttpHost.create("http://192.168.***.***:9200")
        ));
        return restHighLevelClient;
    };

1.单字段以及多字段查询

@Test
    void testMatchAll() throws IOException {
        //准备请求
        SearchRequest req = new SearchRequest("hotel");
        //准备DSL
        //查询全部
/*        req.source().query(QueryBuilders.matchAllQuery());
        req.source().query(QueryBuilders.matchQuery("all","如家"));*/
        //单字段拆线呢
        req.source().query(QueryBuilders.matchQuery("name","如家"));
        //多字段查询
        req.source().query(QueryBuilders.multiMatchQuery("如家","name","brand"));
        //发送请求
        SearchResponse search = client.search(req, RequestOptions.DEFAULT);

        //解析search
        handleResponse(search);
        System.out.println(search);
    }

2.Term精确查询

@Test
    void testTerm() throws IOException {
        //准备请求
         SearchRequest req = new SearchRequest("hotel");
        //准备DSL
        req.source().query(QueryBuilders.termQuery("city", "北京"));
        //发送请求
        SearchResponse search = client.search(req, RequestOptions.DEFAULT);

        //解析search
        handleResponse(search);
        System.out.println(search);
    }

3.Range范围查询

@Test
    void rangeTerm() throws IOException {
        //准备请求
        SearchRequest req = new SearchRequest("hotel");
        //准备DSL
        req.source().query(QueryBuilders.rangeQuery("price").gt(100).lt(400));
        //发送请求
        SearchResponse search = client.search(req, RequestOptions.DEFAULT);

        //解析search
        handleResponse(search);
        System.out.println(search);
    }

4.Boolean Query 范围查询

@Test
    void booleanQuery() throws IOException {
        //准备请求
        SearchRequest req = new SearchRequest("hotel");
        //准备DSL
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        boolQueryBuilder.must(QueryBuilders.termQuery("city","上海"));
        boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").lte(300));
        req.source().query(boolQueryBuilder);
        //发送请求
        SearchResponse search = client.search(req, RequestOptions.DEFAULT);

        //解析search
        handleResponse(search);
        System.out.println(search);
    }

5.分页/排序

@Test
    void testPageAndSort() throws IOException {
        int page = 1;
        int size = 5;
        //准备请求
        SearchRequest req = new SearchRequest("hotel");
        //准备DSL
        req.source().query(QueryBuilders.matchAllQuery());
        req.source().from((page-1)*size).size(size);
        req.source().sort("price", SortOrder.ASC);
        //发送请求
        SearchResponse search = client.search(req, RequestOptions.DEFAULT);

        //解析search
        handleResponse(search);
        System.out.println(search);
    }

6.高亮显示

@Test
    void testHighLight() throws IOException {

        //准备请求
        SearchRequest req = new SearchRequest("hotel");
        //准备DSL
        req.source().query(QueryBuilders.matchQuery("all","如家"));
        req.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));
        //发送请求
        SearchResponse search = client.search(req, RequestOptions.DEFAULT);

        //解析search
        highLight(search);
        System.out.println(search);
    }

7.Term 聚合

聚合函数,下面是根据品牌进行聚合,每个品牌有哪些

@Test
    //Term聚合
    void testAggregation() throws IOException {
        //1.准备请求
        SearchRequest req = new SearchRequest("hotel");
        //2.准备DSL
        //2.1设置size
        req.source().size(0);
        //2.2设置聚合
        req.source().aggregation(AggregationBuilders.terms("BrandAgg")
                                                    .field("brand")
                                                    .size(20)
        );
        //发送请求
        SearchResponse search = client.search(req, RequestOptions.DEFAULT);
        //解析search
        aggregationResponse(search);
        System.out.println(search);
    }

8.自动补全

//自动补全
    @Test
    void testSuggest() throws IOException {
        //1.准备Request
        SearchRequest request = new SearchRequest("hotel");
        //2.准备DSL
        request.source().suggest(new SuggestBuilder().addSuggestion(
                "suggestions",
                SuggestBuilders.completionSuggestion("suggestion")
                .prefix("bj")
                .skipDuplicates(true)
                .size(10)
        ));
        //3.发起请求
        SearchResponse search = client.search(request, RequestOptions.DEFAULT);
        //4.解析结果
        Suggest suggest = search.getSuggest();
        CompletionSuggestion suggestions = suggest.getSuggestion("suggestions");

        for (CompletionSuggestion.Entry.Option option : suggestions.getOptions()) {
            String text = option.getText().toString();
            System.out.println(text);
        }

    }

二、文档的解析

1.解析普通search

代码如下(示例):

private static void handleResponse(SearchResponse search) {
        SearchHits hits = search.getHits();
        long value = hits.getTotalHits().value;
        System.out.println("一共有:"+value+"数据");

        SearchHit[] hits1 = hits.getHits();
        for (SearchHit hit: hits1){
            String sourceAsString = hit.getSourceAsString();
            System.out.println(sourceAsString);
        }
    }

2.解析高亮

代码如下(示例):

//解析高亮
    public static void highLight(SearchResponse search){
        SearchHits hits = search.getHits();
        long value = hits.getTotalHits().value;
        System.out.println("一共有:"+value+"数据");

        SearchHit[] hits1 = hits.getHits();
        for (SearchHit hit: hits1){
            String sourceAsString = hit.getSourceAsString();
            HotelDoc hotelDoc = JSON.parseObject(sourceAsString, HotelDoc.class);
            //获取高亮结果
            Map<String, HighlightField> highlightFields = hit.getHighlightFields();
            HighlightField name = highlightFields.get("name");
            String s = name.getFragments()[0].toString();
            hotelDoc.setName(s);
            System.out.println(hotelDoc);
        }

    }

3.解析term聚合

代码如下(示例):

//解析Terms聚合
    public static void aggregationResponse(SearchResponse search) {
        //获取aggregations
        Aggregations aggregations = search.getAggregations();
        //获取aggregation 注意是terms类型的
        Terms brandAgg = aggregations.get("BrandAgg");
        //获取buckets
        List<? extends Terms.Bucket> buckets = brandAgg.getBuckets();

        //获取key,遍历
        for (Terms.Bucket bucket:buckets){
            String keyAsString = bucket.getKeyAsString();
            long docCount = bucket.getDocCount();
            System.out.println("品牌: " +keyAsString+ " 数量: "+docCount);
        }

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值