ES的查询操作

目录

一,添加数据

二,matchAll查询数据

三,termQuery查询数据

 四,模糊查询

五,范围查询

六, queryString 多条件查询

七,布尔查询-JavaAPI

八,聚合查询-JavaAPI


一,添加数据

 @Autowiredprivate RestHighLevelClient client;@Autowiredprivate GoodMapper goodsMapper;@Testpublic void test3() throws IOException {//查询所有数据List goodsList = goodsMapper.findAll();//        创建bulkRequest请求大量数据的对象BulkRequest bulkRequest = new BulkRequest();//        遍历查询的集合for (Goods goods : goodsList) {
//            接收getSpecStr的字符串String specStr = goods.getSpecStr();
//            将字符串装换成mapMap map = JSON.parseObject(specStr, Map.class);goods.setSpec(map);
//            把数据转换为jsonString 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查询数据

    @Testpublic 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);//        获取searchHitsSearchHits 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查询数据

 @Testpublic 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*/@Testpublic 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);}}

五,范围查询

    @Testpublic 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*/@Testpublic void boolQueryTest() throws IOException {
//        2. 指定查询的索引名称SearchRequest searchRequest = new SearchRequest("goods");
//        4.创建查询结果构造器SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//       构建boolQueryBoolQueryBuilder 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-3000RangeQueryBuilder 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. 获取命中对象 SearchHitsSearchHits hits = searchResponse.getHits();//7.1 获取总记录数Long total= hits.getTotalHits().value;System.out.println("总数:"+total);// aggregations 对象Aggregations aggregations = searchResponse.getAggregations();//将aggregations 转化为mapMap 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 buckets = goods_brands.getBuckets();Mapmap=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);}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部