目录
一,添加数据
二,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
- 查询品牌名称为:华为
- 查询标题包含:手机
- 查询价格在: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
聚合查询:桶聚合,分组查询
- 查询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. 获取命中对象 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);
}