本章通过ElasticSearch进行查询
must 多个查询条件的完全匹配,相当于 and。
mustNot 多个查询条件的相反匹配,相当于 not。
should 至少有一个查询条件匹配, 相当于 or。
1.创建查询类
1.1 根据系统id进行查询
@Slf4j
@Repository
public class ESDao {
@Autowired
private RestHighLevelClient restHighLevelClient;
/**
* 根据系统id查询出记录
* select * from user where id=""
*
* @param id
* @return
*/
public User selectById(String id) {
try {
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
QueryBuilder ids = QueryBuilders.termQuery("id", id);
boolQueryBuilder.must(ids);
searchSourceBuilder.size(1);
searchSourceBuilder.query(boolQueryBuilder);
SearchRequest searchRequest = new SearchRequest(User.USER_INDEX, User.USER_INDEX).source(searchSourceBuilder);
log.info("selectById {}", FastJSONUtil.setJsonString(searchRequest.toString()));
SearchResponse response = restHighLevelClient.search(searchRequest);
SearchHit[] hits = response.getHits().getHits();
String sourceAsString = hits[0].getSourceAsString();
return FastJSONUtil.parsePojo(sourceAsString, User.class);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
1.2 根据索引查询全部数据
/**
* select * from user
*
* @return
*/
public List<User> selectAll() {
try {
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
searchSourceBuilder.query(queryBuilder);
SearchRequest searchRequest = new SearchRequest(User.USER_INDEX, User.USER_INDEX).source(searchSourceBuilder);
SearchResponse response = restHighLevelClient.search(searchRequest);
SearchHit[] hits = response.getHits().getHits();
List<User> users = new ArrayList<>();
for (SearchHit user : hits) {
User user1 = FastJSONUtil.parsePojo(user.getSourceAsString(), User.class);
users.add(user1);
}
return users;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
1.3范围查询
/**
* 查询年龄大于20 并且不包含与id等于
* select *from user where age> 20 and id !=123
*
* @return List<User>
*/
public List<User> selectByAge(long age, String id) {
try {
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
RangeQueryBuilder contentRiskResult = QueryBuilders.rangeQuery("age").gt(age);
QueryBuilder ids = QueryBuilders.termQuery("id", id);
boolQueryBuilder.must(contentRiskResult).mustNot(ids);
searchSourceBuilder.query(boolQueryBuilder);
SearchRequest searchRequest = new SearchRequest(User.USER_INDEX, User.USER_INDEX).source(searchSourceBuilder);
SearchResponse response = restHighLevelClient.search(searchRequest);
SearchHit[] hits = response.getHits().getHits();
List<User> users = new ArrayList<>();
for (SearchHit user : hits) {
User user1 = FastJSONUtil.parsePojo(user.getSourceAsString(), User.class);
users.add(user1);
}
return users;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
2.函数使用
2.1 根据条件统计出平均值AVG
/**
* 统计姓名为张三的 平均年龄
* select avg(age) age from user where name=张三
*
* @return List<User>
*/
public long countAge(String name) {
try {
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
QueryBuilder names = QueryBuilders.termQuery("name", name);
AggregationBuilder avgAge = AggregationBuilders.avg("avg_age").field("age");
searchSourceBuilder.aggregation(avgAge);
searchSourceBuilder.query(names);
searchSourceBuilder.size(0);
SearchRequest searchRequest = new SearchRequest(User.USER_INDEX, User.USER_INDEX).source(searchSourceBuilder);
SearchResponse response = restHighLevelClient.search(searchRequest);
ParsedAvg avgAggregationBuilder = response.getAggregations().get("avg_age");
return (long) avgAggregationBuilder.value();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
2.2 根据条件求和SUM
/**
* 统计姓名为张三的 年龄总和
* select sum(age) age from user where name=张三
*
* @return List<User>
*/
public long sumAge(String name) {
try {
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
QueryBuilder names = QueryBuilders.termQuery("name", name);
AggregationBuilder sumAge = AggregationBuilders.sum("total_sum").field("age");
searchSourceBuilder.aggregation(sumAge);
searchSourceBuilder.query(names);
searchSourceBuilder.size(0);
SearchRequest searchRequest = new SearchRequest(User.USER_INDEX, User.USER_INDEX).source(searchSourceBuilder);
SearchResponse response = restHighLevelClient.search(searchRequest);
ParsedSum.SingleValue avgAggregationBuilder = response.getAggregations().get("avg_age");
return (long) avgAggregationBuilder.value();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
2.3 求出最小值
/**
* 求出最小值
* select min(*)
*
* @param field
* @return
*/
private AggregationBuilder min(String field) {
return AggregationBuilders.min("min").field(field);
}
2.4 求出最大值
/**
* 求出最大值
* select min(*)
*
* @param field
* @return
*/
private AggregationBuilder max(String field) {
return AggregationBuilders.max("max").field(field);
}
2.5Count统计个数
/**
* count统计个数
*
* @param field
* @return
*/
private ValueCountAggregationBuilder count(String field) {
return AggregationBuilders.count("count_name").field(field);
}
3.分组查询 AggregationBuilders.terms("分组之后的名称").field("要分组的名称");
public void teram() {
try {
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//根据姓名进行分组统计个数
TermsAggregationBuilder field = AggregationBuilders.terms("terms_name").field("name");
ValueCountAggregationBuilder countField = AggregationBuilders.count("count_name").field("name");
field.subAggregation(countField);
searchSourceBuilder.aggregation(field);
SearchRequest searchRequest = new SearchRequest(User.USER_INDEX, User.USER_INDEX).source(searchSourceBuilder);
SearchResponse response = restHighLevelClient.search(searchRequest);
//分组在es中是分桶
ParsedStringTerms termsName = response.getAggregations().get("terms_name");
List<? extends Terms.Bucket> buckets = termsName.getBuckets();
buckets.forEach(naem -> {
String key = (String) naem.getKey();
ParsedValueCount countName = naem.getAggregations().get("count_name");
double value = countName.value();
log.info("name , count {} {}", key, value);
});
} catch (IOException e) {
throw new RuntimeException(e);
}
}