ES条件查询

matchAll分页查询

 @Test
    public void testMatchAll() throws IOException {

        //创建查询请求对象
        SearchRequest searchRequest = new SearchRequest("goods");

        //构建查询条件(分页,查询所有)
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.matchAllQuery()); //
        searchSourceBuilder.from(0);
        searchSourceBuilder.size(15);
 
        //请求对象设置
        searchRequest.source(searchSourceBuilder);

        //开始查询
        SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        //打印查询结果
        SearchHits searchHits = response.getHits();
        SearchHit[] hits = searchHits.getHits();
        for (SearchHit hit : hits) {
            String sourceStr = hit.getSourceAsString();
            Goods goods = JSON.parseObject(sourceStr, Goods.class);
            System.out.println("hitDetail = " + goods);
        }

    }

termQuery词条查询

@Test
    public void testTermQuery() throws IOException {

        //创建查询请求对象
        SearchRequest searchRequest = new SearchRequest("goods");

        //构建查询条件(termQuery)
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.termQuery("title", "华为"));

        //请求对象
        searchRequest.source(searchSourceBuilder);

        //看是同步查询
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        //打印
        List<Goods> list = new ArrayList<>();
        SearchHits hits = searchResponse.getHits();
        SearchHit[] hits1 = hits.getHits();
        for (SearchHit hit : hits1) {
            String jsonStr = hit.getSourceAsString();
            Goods goods = JSON.parseObject(jsonStr, Goods.class);
            list.add(goods);
            System.out.println("goods = " + goods);
        }
        System.out.println("list = " + list);
    }

//分词查询

  @Test
    public void testMatchQuery() throws IOException {

        //创建查询请求
        SearchRequest searchRequest = new SearchRequest("goods");

        //构建查询条件
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        MatchQueryBuilder query = QueryBuilders.matchQuery("title","华为手机");
        query.operator(Operator.OR); //必须,华为,手机都有, 默认为OR(包含华为,或则手机)
        searchSourceBuilder.query(query);

        //付值查询条件
        searchRequest.source(searchSourceBuilder);

        //查询
        SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        //打印
        SearchHits hits = response.getHits();
        SearchHit[] hits1 = hits.getHits();
        for (SearchHit hit : hits1) {
            String hisStr = hit.getSourceAsString();
            Goods one = JSON.parseObject(hisStr, Goods.class);
            System.out.println("one = " + one);
        }
    }

/**
* 模糊查询?代表任意一个字符,*代表任意n个字符
* wildcard
*/

 @Test
    public void  testWildcarQuery() throws IOException {

        //创建请求
        SearchRequest searchRequest = new SearchRequest("goods");

        //构建查询条件
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.wildcardQuery("title","华*"));
        searchRequest.source(searchSourceBuilder);
        
        //开始查询
        SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        
        //打印
        SearchHits hits = response.getHits();
        System.out.println("总记录数 = " + hits.getTotalHits().value);
        
        SearchHit[] hits1 = hits.getHits();
        for (SearchHit hit : hits1) {
            String sourceString = hit.getSourceAsString();
            Goods goods = JSON.parseObject(sourceString, Goods.class);
            System.out.println("goods = " + goods);
        }
    }

/**
* 模糊查询:perfixQuery
*/

@Test
    public void testPrefixQuery() throws IOException {

        //创建查询请求
        SearchRequest searchRequest = new SearchRequest("goods");

        //构建请求条件
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.prefixQuery("brandName","三"));
        searchRequest.source(searchSourceBuilder);

        //开始查询
        SearchResponse respose = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        //打印
        SearchHits hits = respose.getHits();

        System.out.println("总记录数 = " + hits.getTotalHits().value);

        SearchHit[] hits1 = hits.getHits();
        for (SearchHit hit : hits1) {
            String hitStr = hit.getSourceAsString();
            Goods goods = JSON.parseObject(hitStr, Goods.class);
            System.out.println("goods = " + goods);
        }

    }

/**
* 范围查询
* range
* sort排序
*/

 @Test
    public void testRangeSearch() throws IOException {

        //创建查询对象
        SearchRequest searchRequest = new SearchRequest("goods");

        //构建查询条件对象
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.sort("price", SortOrder.DESC);

        //查询语句构建
        RangeQueryBuilder priceQuery = QueryBuilders.rangeQuery("price");
        priceQuery.gte(2700);
        priceQuery.lte(3000);
        searchSourceBuilder.query(priceQuery);
        searchRequest.source(searchSourceBuilder);


        //开始查询
        SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        //打印
        SearchHits hits = response.getHits();

        System.out.println("总记录数 = " + hits.getTotalHits().value);

        SearchHit[] hits1 = hits.getHits();
        for (SearchHit hit : hits1) {
            String hitStr = hit.getSourceAsString();
            Goods goods = JSON.parseObject(hitStr, Goods.class);
            System.out.println("goods = " + goods);
        }
    }

/**
* 指定多个字段查询
* queryString
* 会对查询条件进行分词
* 把分词后的条件词和对应词条等值匹配
* 默认取并集(OR包含任意一个分词就行)
* 可以指定多个字段进行查询
*/

 @Test
    public void testQureyString() throws IOException {

        //创建查询请求
        SearchRequest searchRequest = new SearchRequest("goods");

        //构建查询条件
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        QueryStringQueryBuilder queryStringQueryBuilder = QueryBuilders.queryStringQuery("华为手机");
        queryStringQueryBuilder.field("title").field("categoryName").field("brachName").defaultOperator(Operator.AND);
        searchSourceBuilder.query(queryStringQueryBuilder);
        searchRequest.source(searchSourceBuilder);

        //查询
        SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        //打印
        SearchHits hits = response.getHits();

        System.out.println("总记录数 = " + hits.getTotalHits().value);

        SearchHit[] hits1 = hits.getHits();
        for (SearchHit hit : hits1) {
            String hitStr = hit.getSourceAsString();
            Goods goods = JSON.parseObject(hitStr, Goods.class);
            System.out.println("goods = " + goods);
        }
    }

/**
* boolQuery:对多个查询条件连接,连接方式:
* must(and):条件必须成立
* must_not(not):条件必须不成立
* should(or):条件可以成立
* filter:条件必须成立,性能比must高,不会计算得分
*/

    @Test
    public void testBoolQuery() throws IOException {

        //创建请求
        SearchRequest searchRequest = new SearchRequest("goods");

        //构建请求条件
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        BoolQueryBuilder query = QueryBuilders.boolQuery(); //boolQuery


        TermQueryBuilder termQuery = QueryBuilders.termQuery("brandName.keyword", "华为");
        query.must(termQuery);  //品牌必须为华为,会有评分(查询排序,评分高上边)

        MatchQueryBuilder matchQuery = QueryBuilders.matchQuery("title", "手机");
        query.filter(matchQuery); //必须title包含手机,过滤不带评分

        RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("price");
        rangeQuery.gte(2700);//范围必须为2000--3000
        rangeQuery.lte(3000);
        query.filter(rangeQuery);

        //开始查询
        searchSourceBuilder.query(query);
        searchRequest.source(searchSourceBuilder);
        SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        //打印
        SearchHits hits = response.getHits();

        System.out.println("总记录数 = " + hits.getTotalHits().value);

        SearchHit[] hits1 = hits.getHits();
        for (SearchHit hit : hits1) {
            String hitStr = hit.getSourceAsString();
            Goods goods = JSON.parseObject(hitStr, Goods.class);
            System.out.println("goods = " + goods);
        }

    }

/**
* 聚合查询
* 1,指标聚合:相当于MySQL的聚合函数,max,min,avg,sum等
* 2,桶聚合:相当于MySQL的group by操作,不要对text类型的数据进行分组,会失败
*/

 @Test
    public void testAggQuery() throws IOException {

        //创建请求
        SearchRequest searchRequest = new SearchRequest("goods");

        //构建查询对象
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

        //1. 查询title包含手机的数据
        MatchQueryBuilder mathQuery = QueryBuilders.matchQuery("title","手机");
        sourceBuilder.query(mathQuery);

        //2. 开始根据字段分组(name自定义的, 取数据用到)
        AggregationBuilder agg = AggregationBuilders.terms("goods_brands").field("brandName.keyword").size(5);
        sourceBuilder.aggregation(agg);


        //开始查询
        searchRequest.source(sourceBuilder);
        SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        
        //打印数据
        SearchHits hits = response.getHits();
        System.out.println("总记录数 = " + hits.getTotalHits().value);

        SearchHit[] hits1 = hits.getHits();
        for (SearchHit hit : hits1) {
            String hitStr = hit.getSourceAsString();
            Goods goods = JSON.parseObject(hitStr, Goods.class);
            System.out.println("goods = " + goods);
        }



        //打印聚合数据
        Aggregations aggregations = response.getAggregations();
        Map<String, Aggregation> aggregationMap = aggregations.asMap();
        Terms goods_brands = (Terms)aggregationMap.get("goods_brands");
        List<? extends Terms.Bucket> buckets = goods_brands.getBuckets();

        for (Terms.Bucket bucket : buckets) {
            Object key = bucket.getKey();
            System.out.println("key = " + key + "count: " + bucket.getDocCount());
        }

    }

/**
* 高亮查询
* 高亮三要素
* 高亮字段
* 前缀
* 后缀
*/

 @Test
    public void testHightLightFied() throws IOException {

        //创建请求
        SearchRequest searchRequest = new SearchRequest("goods");

        //创建查询构建
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

        //term查询
        TermQueryBuilder termQuery = QueryBuilders.termQuery("title", "华为");
        sourceBuilder.query(termQuery);

        //高亮查询
        HighlightBuilder  highlightBuilder = new HighlightBuilder();
        highlightBuilder.field("title");
        highlightBuilder.preTags("<font color='red'>");
        highlightBuilder.postTags("</font>");
        sourceBuilder.highlighter(highlightBuilder);

        //开始查询
        searchRequest.source(sourceBuilder);
        SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        //打印
        SearchHits hits = response.getHits();
        for (SearchHit hit : hits) {

            //source字段转json串
            String sourceAsString = hit.getSourceAsString();
            Goods goods = JSON.parseObject(sourceAsString, Goods.class);

            //highlight字段获取高亮title
            Map<String, HighlightField> highlightFields = hit.getHighlightFields();
            HighlightField highlightField = highlightFields.get("title");
            Text[] fragments = highlightField.fragments();
            Text fragment = fragments[0];
            String hightlightStr = fragment.toString();
            goods.setTitle(hightlightStr);


            System.out.println("goods = " + goods);
        }
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值