目录
一、实现输入搜索功能
1、下载代码,在idea上打开
2、新建RequestParams类,用于接收解析请求
3、在启动类中加入客户端地址Bean,以便实现服务
4、编写搜索方法
5、新建返回分页结果类
6、实现搜索方法
7、编写控制类,接收请求
8、运行代码,测试功能
(1)检索功能
(2)分页功能
二、添加品牌、城市、星级、价格等过滤功能
1、修改RequestParams类
2、更改service类
3、启动并测试
三、实现排序功能
1、修改RequestParams类
2、在PageResult类中增加排序算法
3、修改HotelDoc类,增加Distance属性
4、修改解析JSON的方法
四、实现广告置顶功能
1、修改HotelDoc类,增加isAD属性
2、在service实现类中添加算分方法
3、运行测试
一、实现输入搜索功能
1、下载代码,在idea上打开
2、新建RequestParams类,用于接收解析请求
@Data
public class RequestParams {private String key;private Integer page;private Integer size;private String sortBy;
}
3、在启动类中加入客户端地址Bean,以便实现服务
@Beanpublic RestHighLevelClient client(){return new RestHighLevelClient(RestClient.builder(HttpHost.create("http://192.168.248.152:9200")));}
4、编写搜索方法
PageResult search(RequestParams params);
5、新建返回分页结果类
@Data
public class PageResult {private long total;private List<HotelDoc> hotels;public PageResult() {}public PageResult(long total, List<HotelDoc> hotels) {this.total = total;this.hotels = hotels;}
}
6、实现搜索方法
@Service
public class HotelService extends ServiceImpl<HotelMapper, Hotel> implements IHotelService {@Autowiredprivate RestHighLevelClient client;@Overridepublic PageResult search(RequestParams params) {
// 准备Request对象try {SearchRequest request = new SearchRequest("hotel");String key = params.getKey();
// 准备DSLif (key==null || "".equals(key)){request.source().query(QueryBuilders.matchAllQuery());}else {request.source().query(QueryBuilders.matchQuery("name", key));}
// 分页Integer page = params.getPage();Integer size = params.getSize();request.source().from((page-1)*size).size(size);
// 发送请求SearchResponse response = client.search(request, RequestOptions.DEFAULT);return extracted(response);} catch (IOException e) {throw new RuntimeException(e);}}private PageResult extracted(SearchResponse response) {
// 解析响应SearchHits searchHits = response.getHits();
// 获取总条数long value = searchHits.getTotalHits().value;System.out.println("共搜索到" + value + "条数据!");
// 获取文档数组SearchHit[] hits = searchHits.getHits();ArrayList<HotelDoc> list = new ArrayList<>();
// 遍历for (SearchHit hit : hits) {
// 获取文档sourceString json = hit.getSourceAsString();
// 反序列化HotelDoc object = JSON.parseObject(json, HotelDoc.class);list.add(object);
// 获取高亮结果Map<String, HighlightField> highlightFields = hit.getHighlightFields();if (!CollectionUtils.isEmpty(highlightFields)){
// 根据字段名获取高亮结果HighlightField highlightField = highlightFields.get("name");if (highlightFields != null){
// 获取高亮值String name = highlightField.getFragments()[0].string();
// 覆盖非高亮结果object.setName(name);}}
// System.out.println("object = " + object);}return new PageResult(value,list);}
}
7、编写控制类,接收请求
@RestController
@RequestMapping("/hotel")
public class HotelController {@Autowiredprivate IHotelService service;@PostMapping("/list")public PageResult search(@RequestBody RequestParams params){return service.search(params);}
}
8、运行代码,测试功能
(1)检索功能
(2)分页功能
二、添加品牌、城市、星级、价格等过滤功能
1、修改RequestParams类
@Data
public class RequestParams {private String key;private Integer page;private Integer size;private String sortBy;private String city;private String brand;private String starName;private Integer maxPrice;private Integer minPrice;
}
2、更改service类
@Overridepublic PageResult search(RequestParams params) {
// 准备Request对象try {SearchRequest request = new SearchRequest("hotel");buildBasicQuery(params, request);
// 分页Integer page = params.getPage();Integer size = params.getSize();request.source().from((page-1)*size).size(size);
// 发送请求SearchResponse response = client.search(request, RequestOptions.DEFAULT);return extracted(response);} catch (IOException e) {throw new RuntimeException(e);}}private void buildBasicQuery(RequestParams params, SearchRequest request) {String key = params.getKey();BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();if (key==null || "".equals(key)){boolQuery.must(QueryBuilders.matchAllQuery());}else {boolQuery.must(QueryBuilders.matchQuery("all", key));}
// 城市条件if (params.getCity() != null && !params.getCity().equals("")){boolQuery.filter(QueryBuilders.termQuery("city", params.getCity()));}
// 品牌条件if (params.getBrand() != null && !params.getBrand().equals("")){boolQuery.filter(QueryBuilders.termQuery("brand", params.getBrand()));}
// 星级条件if (params.getStarName() != null && !params.getStarName().equals("")){boolQuery.filter(QueryBuilders.termQuery("starName", params.getStarName()));}
// 价格if (params.getMinPrice() != null && params.getMaxPrice() != null){boolQuery.filter(QueryBuilders.rangeQuery("price").gte(params.getMinPrice()).lte(params.getMaxPrice()));}
// 准备DSLrequest.source().query(boolQuery);}
3、启动并测试
三、实现排序功能
1、修改RequestParams类
// 排序String location = params.getLocation();if (location != null && !location.equals("")){request.source().sort(SortBuilders.geoDistanceSort("location",new GeoPoint(location)).order(SortOrder.ASC).unit(DistanceUnit.KILOMETERS));}
2、在PageResult类中增加排序算法
String location = params.getLocation();if (location != null && !location.equals("")){request.source().sort(SortBuilders.geoDistanceSort("location",new GeoPoint(location)).order(SortOrder.ASC).unit(DistanceUnit.KILOMETERS));}
3、修改HotelDoc类,增加Distance属性
private Object distance;
4、修改解析JSON的方法
// 获取排序值Object[] sortValues = hit.getSortValues();if (sortValues.length > 0){Object sortValue = sortValues[0];object.setDistance(sortValue);}
四、实现广告置顶功能
1、修改HotelDoc类,增加isAD属性
private Boolean isAD;
2、在service实现类中添加算分方法
// 算分控制FunctionScoreQueryBuilder functionScoreQuery = QueryBuilders.functionScoreQuery(boolQuery,new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.termQuery("isAD","true"),//过滤条件ScoreFunctionBuilders.weightFactorFunction(10) //分值*10)});