ES的查询操作

目录

一,添加数据

二,matchAll查询数据

三,termQuery查询数据

 四,模糊查询

五,范围查询

六, queryString 多条件查询

七,布尔查询-JavaAPI

八,聚合查询-JavaAPI


一,添加数据

 @Autowired
    private RestHighLevelClient client;

    @Autowired
    private GoodMapper goodsMapper;

    @Test
    public void test3() throws IOException {
        //查询所有数据
        List<Goods> goodsList = goodsMapper.findAll();

//        创建bulkRequest请求大量数据的对象
        BulkRequest bulkRequest = new BulkRequest();

//        遍历查询的集合
        for (Goods goods : goodsList) {
//            接收getSpecStr的字符串
            String specStr = goods.getSpecStr();
//            将字符串装换成map
            Map map = JSON.parseObject(specStr, Map.class);
            goods.setSpec(map);
//            把数据转换为json
            String data = JSON.toJSONString(goods);
//            创建请求索引的对象指定索引添加数据,并指定是什么样的格式
            IndexRequest indexRequest = new IndexRequest("goods");
            indexRequest.id(goods.getId()+"");
            indexRequest.source(data, XContentType.JSON);

            bulkRequest.add(indexRequest);

        }

        BulkResponse bulk = client.bulk(bulkRequest, RequestOptions.DEFAULT);

    }

二,matchAll查询数据

    @Test
    public void matchAllQueryTest() throws IOException {


//        2.指定索引查询
        SearchRequest searchRequest = new SearchRequest("goods");
//        4.创建查询结果构建器材
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//       6. 指定查询方法
        QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
//        5.指定查询条件
        sourceBuilder.query(queryBuilder);
//        3.添加查询结果构建器
        searchRequest.source(sourceBuilder);
//        1.查询获取结果
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

//        获取searchHits
        SearchHits searchHits = searchResponse.getHits();
        System.out.println("总数"+searchHits.getTotalHits());
//        获取查询的结果
        SearchHit[] hits = searchHits.getHits();
//        遍历数组
        List list = new ArrayList();
        for (SearchHit hit : hits) {
            String sourceAsString = hit.getSourceAsString();
//            转换为java对象
            Goods goods = JSON.parseObject(sourceAsString, Goods.class);
//            存入集合中
            list.add(goods);
        }

//        遍历集集合查看数据
        for (Object goods : list) {
            System.out.println(goods);
        }
    }

三,termQuery查询数据

 @Test
    public void tempAllQueryTest() throws IOException {


//        2. 指定查询的索引名称
        SearchRequest searchRequest = new SearchRequest("goods");
//        4.创建查询结果构造器
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

//        6.指定查询的方式
        QueryBuilder queryBuilder = QueryBuilders.termQuery("title","华为");
//        5.指定查询方式的对象
        searchSourceBuilder.query(queryBuilder);
//        3.指定查询结果构造器
        searchRequest.source(searchSourceBuilder);
        //1. 查询获取结果
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

//       获得查询的信息
        SearchHits hits = searchResponse.getHits();
//        打印总数
        System.out.println("总数为:"+hits.getTotalHits());

//        获取数据的数组
        SearchHit[] hitsHits = hits.getHits();
//        遍历数组拿到及结果信息
        List list = new ArrayList();
        for (SearchHit hitsHit : hitsHits) {
//            获取数据
            String sourceAsString = hitsHit.getSourceAsString();
//            转换为java对象
            Goods goods = JSON.parseObject(sourceAsString, Goods.class);
//            添加到集合
            list.add(goods);
        }
//        遍历集合取出数据
        for (Object goods : list) {
            System.out.println(goods);
        }
    }

 四,模糊查询

 /**
     * 模糊查询
     * @throws IOException
     */
    @Test
    public void wildcardAllQueryTest() throws IOException {
//        2. 指定查询的索引名称
        SearchRequest searchRequest = new SearchRequest("goods");
//        4.创建查询结果构造器
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

//        6.指定查询的方式
        QueryBuilder queryBuilder = QueryBuilders.wildcardQuery("title","华为*");
//        5.指定查询方式的对象
        searchSourceBuilder.query(queryBuilder);
//        3.指定查询结果构造器
        searchRequest.source(searchSourceBuilder);
        //1. 查询获取结果
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

//       获得查询的信息
        SearchHits hits = searchResponse.getHits();
//        打印总数
        System.out.println("总数为:"+hits.getTotalHits());

//        获取数据的数组
        SearchHit[] hitsHits = hits.getHits();
//        遍历数组拿到及结果信息
        List list = new ArrayList();
        for (SearchHit hitsHit : hitsHits) {
//            获取数据
            String sourceAsString = hitsHit.getSourceAsString();
//            转换为java对象
            Goods goods = JSON.parseObject(sourceAsString, Goods.class);
//            添加到集合
            list.add(goods);
        }
//        遍历集合取出数据
        for (Object goods : list) {
            System.out.println(goods);
        }
    }

五,范围查询

    @Test
    public void rangeAllQueryTest() throws IOException {
//        2. 指定查询的索引名称
        SearchRequest searchRequest = new SearchRequest("goods");
//        4.创建查询结果构造器
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

//        6.指定查询的方式
        RangeQueryBuilder query = QueryBuilders.rangeQuery("price");
        //指定下限
        query.gte(2000);
        //指定上限
        query.lte(3000);



//        5.指定查询方式的对象
        searchSourceBuilder.sort("price", SortOrder.DESC);

//        3.指定查询结果构造器
        searchRequest.source(searchSourceBuilder);
        //1. 查询获取结果
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

//       获得查询的信息
        SearchHits hits = searchResponse.getHits();
//        打印总数
        System.out.println("总数为:"+hits.getTotalHits());

//        获取数据的数组
        SearchHit[] hitsHits = hits.getHits();
//        遍历数组拿到及结果信息
        List list = new ArrayList();
        for (SearchHit hitsHit : hitsHits) {
//            获取数据
            String sourceAsString = hitsHit.getSourceAsString();
//            转换为java对象
            Goods goods = JSON.parseObject(sourceAsString, Goods.class);
//            添加到集合
            list.add(goods);
        }
//        遍历集合取出数据
        for (Object goods : list) {
            System.out.println(goods);
        }
    }

六, queryString 多条件查询

queryString 多条件查询

•会对查询条件进行分词。

•然后将分词后的查询条件和词条进行等值匹配

•默认取并集(OR)

•可以指定多个查询字段

query_string:识别query中的连接符(or 、and)

QueryStringQueryBuilder query = QueryBuilders.queryStringQuery("华为手机").field("title").field("categoryName")
.field("brandName").defaultOperator(Operator.AND);

七,布尔查询-JavaAPI

布尔查询:boolQuery

  1. 查询品牌名称为:华为

  2. 查询标题包含:手机

  3. 查询价格在:2000-3000

must 、filter为连接方式

term、match为不同的查询方式

  /**
     * 1. 查询品牌名称为:华为
     * 2. 查询标题包含:手机
     * 3. 查询价格在:2000-3000
     * @throws IOException
     */
    @Test
    public void boolQueryTest() throws IOException {
//        2. 指定查询的索引名称
        SearchRequest searchRequest = new SearchRequest("goods");
//        4.创建查询结果构造器
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

//       构建boolQuery
        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
        //2.构建各个查询条件
        //2.1 查询品牌名称为:华为
        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("brandName", "华为");
        boolQuery.must(termQueryBuilder);
        //2.2. 查询标题包含:手机
        MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("title", "手机");
        boolQuery.filter(matchQueryBuilder);
        //2.3 查询价格在:2000-3000
        RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("price");

        rangeQuery.gte(2000);
        rangeQuery.lte(3000);
        boolQuery.filter(rangeQuery);
//        5.指定查询方式的对象
        searchSourceBuilder.query(boolQuery);
//        3.指定查询结果构造器
        searchRequest.source(searchSourceBuilder);
        //1. 查询获取结果
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

//       获得查询的信息
        SearchHits hits = searchResponse.getHits();
//        打印总数
        System.out.println("总数为:"+hits.getTotalHits());

//        获取数据的数组
        SearchHit[] hitsHits = hits.getHits();
//        遍历数组拿到及结果信息
        List list = new ArrayList();
        for (SearchHit hitsHit : hitsHits) {
//            获取数据
            String sourceAsString = hitsHit.getSourceAsString();
//            转换为java对象
            Goods goods = JSON.parseObject(sourceAsString, Goods.class);
//            添加到集合
            list.add(goods);
        }
//        遍历集合取出数据
        for (Object goods : list) {
            System.out.println(goods);
        }
    }

八,聚合查询-JavaAPI

    

聚合查询:桶聚合,分组查询

  1. 查询title包含手机的数据

  2. 查询品牌列表

/**
     * 聚合查询:桶聚合,分组查询
     * 1. 查询title包含手机的数据
     * 2. 查询品牌列表
     */
@Test
public void testAggQuery() throws IOException {

    SearchRequest searchRequest=new SearchRequest("goods");

    SearchSourceBuilder sourceBuilder=new SearchSourceBuilder();
    //1. 查询title包含手机的数据

    MatchQueryBuilder queryBuilder = QueryBuilders.matchQuery("title", "手机");

    sourceBuilder.query(queryBuilder);
    //2. 查询品牌列表  只展示前100条
    AggregationBuilder aggregation=AggregationBuilders.terms("goods_brands").field("brandName").size(100);
    sourceBuilder.aggregation(aggregation);


    searchRequest.source(sourceBuilder);

    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

    //7. 获取命中对象 SearchHits
    SearchHits hits = searchResponse.getHits();

    //7.1 获取总记录数
    Long total= hits.getTotalHits().value;
    System.out.println("总数:"+total);

    // aggregations 对象
    Aggregations aggregations = searchResponse.getAggregations();
    //将aggregations 转化为map
    Map<String, Aggregation> aggregationMap = aggregations.asMap();


    //通过key获取goods_brands 对象 使用Aggregation的子类接收  buckets属性在Terms接口中体现

    //        Aggregation goods_brands1 = aggregationMap.get("goods_brands");
    Terms goods_brands =(Terms) aggregationMap.get("goods_brands");

    //获取buckets 数组集合
    List<? extends Terms.Bucket> buckets = goods_brands.getBuckets();

    Map<String,Object>map=new HashMap<>();
    //遍历buckets   key 属性名,doc_count 统计聚合数
    for (Terms.Bucket bucket : buckets) {

        System.out.println(bucket.getKey());
        map.put(bucket.getKeyAsString(),bucket.getDocCount());
    }

    System.out.println(map);

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值