@Autowired
private RestHighLevelClient client;
public PageResult hotelList(SearchParam searchParam) {
long total = 0;
List<HotelDoc> hotelDocs = null;
try {
String key = searchParam.getKey();
String sortBy = searchParam.getSortBy();
Integer page = searchParam.getPage();
Integer size = searchParam.getSize();
//布尔查询
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
SearchRequest searchRequest = new SearchRequest(EsConstant.HOTEL_INDEX);
if (StringUtils.isBlank(key)) {
//关键字为空查所有
boolQuery.must((QueryBuilders.matchAllQuery()));
} else {
//不为空查关键字
boolQuery.must(QueryBuilders.matchQuery("all", key));
}
//brand的term过滤查询
if (StringUtils.isNotBlank((searchParam.getBrand()))) {
boolQuery.filter(QueryBuilders.termQuery("brand", searchParam.getBrand()));
}
//city的term过滤查询
if (StringUtils.isNotBlank((searchParam.getCity()))) {
boolQuery.filter(QueryBuilders.termQuery("city", searchParam.getCity()));
}
//starName的term过滤查询
if (StringUtils.isNotBlank((searchParam.getStarName()))) {
boolQuery.filter(QueryBuilders.termQuery("starName", searchParam.getStarName()));
}
//price的range范围查询
Integer maxPrice = searchParam.getMaxPrice();
Integer minPrice = searchParam.getMinPrice();
if (maxPrice != null && minPrice != null) {
boolQuery.filter(QueryBuilders.rangeQuery("price")
.gte(minPrice).lte(maxPrice));
}
//增加距离排序
String location = searchParam.getLocation();
if (StringUtils.isNotBlank(location)) {
//排序sort
searchRequest.source()
.sort(SortBuilders
.geoDistanceSort("location", new GeoPoint(location))
.order(SortOrder.ASC)
.unit(DistanceUnit.KILOMETERS));
}
//把条件放入请求
searchRequest.source().query(boolQuery);
//是否为广告
searchRequest.source().query(
new FunctionScoreQueryBuilder(boolQuery
, new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{
new FunctionScoreQueryBuilder
.FilterFunctionBuilder(QueryBuilders.termQuery("isAD", true)
, ScoreFunctionBuilders.weightFactorFunction(100.0f))
})
.boostMode(CombineFunction.SUM));
//分页查询
searchRequest.source().from((page - 1) * size).size(size);
//查询
SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
//条数
total = search.getHits().getTotalHits().value;
hotelDocs = new ArrayList<>();
SearchHit[] hits = search.getHits().getHits();
for (SearchHit hit : hits) {
String json = hit.getSourceAsString();
HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
//获取sout距离
Object[] sortValues = hit.getSortValues();
//判断不为空和数组长度大于0
if (sortValues != null && sortValues.length > 0) {
Object sortValue = sortValues[0];
if (sortValue != null) {
//放入到hlteldoc中
hotelDoc.setDistance(sortValue);
}
}
hotelDocs.add(hotelDoc);
}
} catch (IOException e) {
e.printStackTrace();
}
//返回总条数和数据
return new PageResult(total, hotelDocs);
}