ElasticSearch搜索常用操作,条件过滤,排序,根据比分排位
package cn.itcast.hotel.service.impl;
import cn.itcast.hotel.constant.EsConstant;
import cn.itcast.hotel.mapper.HotelMapper;
import cn.itcast.hotel.pojo.Hotel;
import cn.itcast.hotel.pojo.HotelDoc;
import cn.itcast.hotel.pojo.PageResult;
import cn.itcast.hotel.pojo.SearchParams;
import cn.itcast.hotel.service.IHotelService;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.geo.GeoPoint;
import org.elasticsearch.common.lucene.search.function.CombineFunction;
import org.elasticsearch.common.unit.DistanceUnit;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder;
import org.elasticsearch.index.query.functionscore.ScoreFunctionBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.ArrayList;
@Service
public class HotelService extends ServiceImpl<HotelMapper, Hotel> implements IHotelService {
@Autowired
private RestHighLevelClient client;
@Override
public PageResult list(SearchParams searchParams) {
try {
//获取参数
String key = searchParams.getKey();
Integer page = searchParams.getPage();
Integer size = searchParams.getSize();
String sortBy = searchParams.getSortBy();
SearchRequest searchRequest = new SearchRequest(EsConstant.INDEX_HOTEL);
//1.过滤查询、创建boolean查询
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
//1.1搜索框使用must
if (StringUtils.isBlank(key)){
//关键字为空match_all搜索
boolQuery.must(QueryBuilders.matchAllQuery());
}else {
//关键字不为空match搜索
boolQuery.must(QueryBuilders.matchQuery("all", key));
}
//1.2品牌过滤
String brand = searchParams.getBrand();
if (StringUtils.isNotBlank(brand)){
boolQuery.filter(QueryBuilders.termQuery("brand", brand));
}
//1.3星级过滤
String starName = searchParams.getStarName();
if (StringUtils.isNotBlank(starName)){
boolQuery.filter(QueryBuilders.termQuery("starName", starName));
}
//1.4价格过滤
Integer maxPrice = searchParams.getMaxPrice();
Integer minPrice = searchParams.getMinPrice();
if (maxPrice!=null&&minPrice!=null){
boolQuery.filter(QueryBuilders.rangeQuery("price")
.gte(minPrice)
.lte(maxPrice));
}
//1.5城市过滤
String city = searchParams.getCity();
if (StringUtils.isNotBlank(city)){
boolQuery.filter(QueryBuilders.termQuery("city", city));
}
//1.6将boolQuery对象添加到query中
searchRequest.source().query(boolQuery);
//2.周边酒店(距离排序)
// searchRequest.source().sort("_score");//根据分值排序默认降序
String location = searchParams.getLocation();
if (StringUtils.isNotBlank(location)){
searchRequest.source().sort(
SortBuilders.geoDistanceSort("location", new GeoPoint(location))
.order(SortOrder.ASC)
.unit(DistanceUnit.KILOMETERS)
);
}
/* searchRequest.source().query(QueryBuilders.functionScoreQuery(boolQuery,
new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{
new FunctionScoreQueryBuilder.FilterFunctionBuilder(
QueryBuilders.termQuery("isAD", true),
ScoreFunctionBuilders.weightFactorFunction(100.0F)
)
}).boostMode(CombineFunction.SUM));*/
//3.广告排位
// searchRequest.source().query(new FunctionScoreQueryBuilder(, ))
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 searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
long total = searchResponse.getHits().getTotalHits().value;
//数据封装
SearchHit[] hits = searchResponse.getHits().getHits();
ArrayList<HotelDoc> list = new ArrayList<>();
for (SearchHit hit : hits) {
String json = hit.getSourceAsString();
Object[] sortValues = hit.getSortValues();
HotelDoc hotelDoc = JSONObject.parseObject(json, HotelDoc.class);
if (sortValues.length>0){
hotelDoc.setDistance(sortValues[0]);
}
list.add(hotelDoc);
}
return new PageResult(total, list);
} catch (IOException e) {
e.printStackTrace();
}
return new PageResult();
}
}
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgbggka
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01