ElasticSearch - 旅游酒店案例es功能实现

Posted 汤键.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ElasticSearch - 旅游酒店案例es功能实现相关的知识,希望对你有一定的参考价值。

目录

案例

搜索与分页功能

条件过滤功能

附近的酒店功能

广告置顶功能

HotelService(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功能实现的主要内容,如果未能解决你的问题,请参考以下文章

微服务ES使用实战·黑马旅游

Elasticsearch es GZIP造成JAVA Native Memory泄漏案例

Elasticsearch es ElasticSearch集群故障案例分析: 警惕通配符查询 Wildcard

Elasticsearch学习之快速入门案例

三方件-1 ElasticSearch概念介绍和案例解析

七个生产案例告诉你BATJ为何选择ElasticSearch!应用场景和优势!