组合查询
public List<User> queryUser(String indexName, UserDTO user) {
List<Query> queries = new ArrayList<>();
Query bySex = this.initMatchQuery("sex", user.getSex());
Query byAge = this.initRangeQuery("age", 18, 25);
queries.add(bySex);
queries.add(byAge);
try {
SearchResponse<User> searchResponse = client.search(s -> s
.index(indexName)
.query(q -> q
.bool(b -> b.must(queries)
)
), User.class);
List<Hit<User>> hitList = searchResponse.hits().hits();
List<User> userList = new ArrayList<>();
for (Hit<User> mapHit : hitList) {
userList.add(mapHit.source());
}
return userList;
}catch (Exception e) {
throw new RunExcepotion("【查询 -> 失败】从es中组合查询user出错,错误信息为:{}", e.getMessage());
}
}
private Query initMatchQuery(String fieldName, String fieldValue) {
return StringUtils.isNotBlank(fieldValue) ? MatchQuery.of(m -> m
.field(fieldName + ".keyword")
.query(fieldValue)
)._toQuery() : null;
}
private Query initRangeQuery(String fieldName, Integer begin, Integer end) {
return RangeQuery.of(m -> m
.field(fieldName + ".keyword")
.gte((JsonData.of(begin)))
.lte((JsonData.of(end)))
)._toQuery();
}
组合+分页 查询
public PageVO queryUser(String indexName, UserDTO user) {
List<Query> queries = new ArrayList<>();
Query bySex = this.initMatchQuery("sex", user.getSex());
Query byAge = this.initRangeQuery("age", 18, 60);
queries.add(bySex);
queries.add(byAge);
int offSet = user.getOffset();
Integer from = offSet <= 0 ? 0 : apuserpLog.getLimit() * offSet;
try {
SearchResponse<User> searchResponse = client.search(s -> s
.index(indexName)
.query(q -> q
.bool(b -> b.must(queries)
)
.from(from)
.size(user.getLimit())
), User.class);
List<Hit<User>> hitList = searchResponse.hits().hits();
List<User> userList = new ArrayList<>();
for (Hit<User> mapHit : hitList) {
userList.add(mapHit.source());
}
long total = searchResponse.hits().total() != null ? searchResponse.hits().total().value() : 0;
return new PageVO().setContent(userList)
.setSize(user.getLimit())
.setTotalElements(total)
.setTotalPages((total + user.getLimit() - 1) / user.getLimit());
}catch (Exception e) {
throw new RunExcepotion("【查询 -> 失败】从es中组合查询user出错,错误信息为:{}", e.getMessage());
}
}
组合+分页+排序查询
public PageVO queryUser(String indexName, UserDTO user) {
List<Query> queries = new ArrayList<>();
Query bySex = this.initMatchQuery("sex", user.getSex());
Query byAge = this.initRangeQuery("age", 18, 60);
queries.add(bySex);
queries.add(byAge);
int offSet = user.getOffset();
Integer from = offSet <= 0 ? 0 : apuserpLog.getLimit() * offSet;
try {
SearchResponse<User> searchResponse = client.search(s -> s
.index(indexName)
.query(q -> q
.bool(b -> b.must(queries)
)
.from(from)
.size(user.getLimit())
.sort(sort -> sort.field(f -> f.field("createTime.keyword").order(SortOrder.Asc)))
), User.class);
List<Hit<User>> hitList = searchResponse.hits().hits();
List<User> userList = new ArrayList<>();
for (Hit<User> mapHit : hitList) {
userList.add(mapHit.source());
}
long total = searchResponse.hits().total() != null ? searchResponse.hits().total().value() : 0;
return new PageVO().setContent(userList)
.setSize(user.getLimit())
.setTotalElements(total)
.setTotalPages((total + user.getLimit() - 1) / user.getLimit());
}catch (Exception e) {
throw new RunExcepotion("【查询 -> 失败】从es中组合查询user出错,错误信息为:{}", e.getMessage());
}
}
组合+分页+排序+分组 查询
public PageVO queryUser(String indexName, UserDTO user) {
List<Query> queries = new ArrayList<>();
Query byEducation = this.initMatchQuery("education", user.getEducation());
Query byAge = this.initRangeQuery("age", 18, 60);
queries.add(byEducation);
queries.add(byAge);
int offSet = user.getOffset();
Integer from = offSet <= 0 ? 0 : apuserpLog.getLimit() * offSet;
try {
List<SortOptions> sorts = new ArrayList<>();
SortOptions sortName = SortOptionsBuilders.field(f -> f.field("age.keyword")
.order(SortOrder.Desc));
sorts.add(sortName);
SearchResponse<User> searchResponse = client.search(s -> s
.index(indexName)
.query(q -> q
.bool(b -> b.must(queries)
)
.collapse(col -> col
.field("sex.keyword").innerHits(inner -> inner
.name("group")
.ignoreUnmapped(true)
.from(0)
.size(0)
.sort(sorts)
))
.from(from)
.size(user.getLimit())
.sort(sort -> sort.field(f -> f.field("createTime.keyword").order(SortOrder.Asc)))
), User.class);
List<Hit<User>> hitList = searchResponse.hits().hits();
List<User> userList = new ArrayList<>();
for (Hit<User> mapHit : hitList) {
userList.add(mapHit.source());
}
long total = searchResponse.hits().total() != null ? searchResponse.hits().total().value() : 0;
return new PageVO().setContent(userList)
.setSize(user.getLimit())
.setTotalElements(total)
.setTotalPages((total + user.getLimit() - 1) / user.getLimit());
}catch (Exception e) {
throw new RunExcepotion("【查询 -> 失败】从es中组合查询user出错,错误信息为:{}", e.getMessage());
}
}
组合+分页+排序+分组+聚合 查询
public PageVO queryUser(String indexName, UserDTO user) {
List<Query> queries = new ArrayList<>();
Query byEducation = this.initMatchQuery("education", user.getEducation());
Query byAge = this.initRangeQuery("age", 18, 60);
queries.add(byEducation);
queries.add(byAge);
int offSet = user.getOffset();
Integer from = offSet <= 0 ? 0 : apuserpLog.getLimit() * offSet;
try {
List<SortOptions> sorts = new ArrayList<>();
SortOptions sortName = SortOptionsBuilders.field(f -> f.field("age.keyword")
.order(SortOrder.Desc));
sorts.add(sortName);
SearchResponse<User> searchResponse = client.search(s -> s
.index(indexName)
.query(q -> q
.bool(b -> b.must(queries)
)
.collapse(col -> col
.field("sex.keyword").innerHits(inner -> inner
.name("group")
.ignoreUnmapped(true)
.from(0)
.size(0)
.sort(sorts)
))
.aggregations("sex.keyword", a -> a.terms(t -> t.field("sex.keyword")
.size(100000)))
.from(from)
.size(user.getLimit())
.sort(sort -> sort.field(f -> f.field("createTime.keyword").order(SortOrder.Asc)))
), User.class);
List<Hit<User>> hitList = searchResponse.hits().hits();
List<User> userList = new ArrayList<>();
for (Hit<User> mapHit : hitList) {
userList.add(mapHit.source());
}
long total = searchResponse.hits().total() != null ? searchResponse.hits().total().value() : 0;
Map<String, Long> map = new HashMap<>();
searchResponse.aggregations().get("sex.keyword").sterms().buckets().array()
.forEach(f -> map.put(f.key().stringValue(), f.docCount()));
total = map.size();
userList.forEach(user -> {
if (map.containsKey(user.getSex())) {
user.setCount(map.get(user.getSex()));
}
});
return new PageVO().setContent(userList)
.setSize(user.getLimit())
.setTotalElements(total)
.setTotalPages((total + user.getLimit() - 1) / user.getLimit());
}catch (Exception e) {
throw new RunExcepotion("【查询 -> 失败】从es中组合查询user出错,错误信息为:{}", e.getMessage());
}
}