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);
}
}