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
-
查询品牌名称为:华为
-
查询标题包含:手机
-
查询价格在: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
聚合查询:桶聚合,分组查询
-
查询title包含手机的数据
-
查询品牌列表
/*** 聚合查询:桶聚合,分组查询* 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 extends Terms.Bucket> 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);}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
