本章通過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);
}
}