ElasticSearch - 旅游酒店案例es功能实现
Posted 汤键.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ElasticSearch - 旅游酒店案例es功能实现相关的知识,希望对你有一定的参考价值。
目录
-
案例
-
搜索与分页功能
- 案例需求:
- 实现旅游的酒店搜索功能,完成关键字搜索和分页
- 实现步骤如下:
- 1.定义实体类,接收前端请求
- 实体类有两个:
- (1)一个是前端的请求参数实体
- key:搜索关键字
- page:页码
- size:每页大小
- sortBy:排序,目前暂不实现
- (2)一个是服务端应该返回的响应结果实体
- 分页查询,需要返回分页结果PageResult,包含两个属性:
- total:总条数
- List<HotelDoc>:当前页的数据
- 2.定义controller接口,接收页面请求,调用IHotelService的search方法
- 定义一个HotelController,声明查询接口,满足下列要求:
- 请求方式:Post
- 请求路径:/hotel/list
- 请求参数:对象,类型为RequestParam
- 返回值:PageResult,包含两个属性
- Long total:总条数
- List<HotelDoc> hotels:酒店数据
- 3.定义IHotelService中的search方法,利用match查询实现根据关键字搜索酒店信息
- 实现搜索业务
- (1)实现搜索业务,肯定离不开RestHighLevelClient,所以需要把它注册到Spring中作为一个Bean
- (2)在controller调用了IHotelService,并没有实现该方法,因此下面就在IHotelService中定义方法,并且去实现业务逻辑
-
条件过滤功能
- 案例需求:
- 添加品牌、城市、星级、价格等过滤功能
- 实现步骤如下:
- 1.修改前端请求参数实体类(前面代码提供的便是已经完善好的)
- 包含的过滤条件有:
- brand:品牌值
- city:城市
- minPrice~maxPrice:价格范围
- starName:星级
- 2.修改搜索业务
- 在HotelService的search方法中,只有一个地方需要修改:requet.source().query(…)其中的查询条件
- 在之前的业务中,只有match查询,根据关键字搜索
- 现在要添加条件过滤,包括:
- 品牌过滤:是keyword类型,用term查询
- 星级过滤:是keyword类型,用term查询
- 价格过滤:是数值类型,用range查询
- 城市过滤:是keyword类型,用term查询
- 多个查询条件组合,肯定是boolean查询来组合:
- 关键字搜索放到must中,参与算分
- 其它过滤条件放到filter中,不参与算分
- 参数存在才需要过滤,做好非空判断
- 因为条件构建的逻辑比较复杂,且能复用,这里还会进行一个封装
-
附近的酒店功能
- 案例需求:
- 根据定位获取最近的酒店,按距离排序,显示距离为多少
- 实现步骤如下:
- 前端页面点击定位后,会将你所在的位置发送到后台
- 要根据这个坐标,将酒店结果按照到这个点的距离升序排序
- 1.修改前端请求参数实体类(前面代码提供的便是已经完善好的)
- 修改RequestParams参数,接收location字段
- 2.距离排序API
- 之前所讲的排序功能,包括两种:
- 普通字段排序
- 地理坐标排序
- 之前只讲了普通字段排序对应的java写法
- 地理坐标排序只学过DSL语法
- GET /indexName/_search
- "query":
- "match_all":
- ,
- "sort": [
- "price": "asc"
- ,
- "_geo_distance" :
- "FIELD" : "纬度,经度",
- "order" : "asc",
- "unit" : "km"
- ]
- 对应的java代码示例:
- 3.添加距离排序
- 4.排序完成后,页面还要获取我附近每个酒店的具体距离值
- 这个值在响应结果中是独立的
- 因此,在结果解析阶段,除了解析source部分以外,还要得到sort部分
- 也就是排序的距离,然后放到响应结果中
- 要做两件事:
- 修改HotelDoc,添加排序距离字段,用于页面显示
- 修改HotelService类中的handleResponse方法,添加对sort值的获取
-
广告置顶功能
- 案例需求:
- 让指定的酒店在搜索结果中排名置顶
- 实现步骤如下:
- 给需要置顶的酒店文档添加一个标记
- 然后利用function score给带有标记的文档增加权重
- function_score包含3个要素:
- 过滤条件:哪些文档要加分
- 算分函数:如何计算function score
- 加权方式:function score 与 query score如何运算
- 1.给HotelDoc类添加isAD字段,Boolean类型
- true:是广告
- false:不是广告
- 这样function_score包含3个要素得到确定
- 过滤条件:判断isAD是否为true
- 算分函数:可以用最简单暴力的weight,固定加权值
- 加权方式:可以用默认的相乘,大大提高算分
- 2.挑选几个喜欢的酒店,给它的文档数据添加isAD字段,值为true
- 3.修改search方法,添加function score功能,给isAD值为true的酒店增加权重
- 之前是用的boolean查询,现在要改成function_socre查询
- function_score查询结构如下:
- 对应的JavaAPI如下:
- 可以将之前写的boolean查询作为原始查询条件放到query中,接下来就是添加过滤条件、算分函数、加权模式
- 所以原来的代码依然可以沿用
-
HotelService(es操作)总览
以上是关于ElasticSearch - 旅游酒店案例es功能实现的主要内容,如果未能解决你的问题,请参考以下文章
Elasticsearch es GZIP造成JAVA Native Memory泄漏案例