微服务day9

发布于:2025-08-05 ⋅ 阅读:(15) ⋅ 点赞:(0)

已经导入了大量数据到elasticsearch中,实现了商品数据的存储。查询商品数据时采用的是根据id查询,而非模糊搜索。

elasticsearch的数据搜索功能。Elasticsearch提供了基于JSON的DSL语句来定义查询条件,其JavaAPI就是在组织DSL条件。

DSL的查询语法

基于DSL来对照学习JavaAPI

1.DSL查询

  • 叶子查询(Leaf query clauses)特定字段里查询特定值

  • 复合查询(Compound query clauses):以逻辑方式组合多个叶子查询或者更改叶子查询的行为方式

Kibana的DevTools中学习查询的DSL语法

无条件查询的类型是:match_all,处于安全考虑,elasticsearch设置了默认的查询页数。

2.叶子查询

  • 全文检索查询(Full Text Queries)利用分词器对用户输入搜索条件先分词,得到词条,然后再利用倒排索引搜索词条。例如:

    • match

    • multi_match

  • 精确查询(Term-level queries):不对用户输入搜索条件分词,根据字段内容精确值匹配但只能查找keyword、数值、日期、boolean类型的字段。例如:

    • ids

    • term

    • range

range是范围查询

3.复合查询

bool查询 组合一个或多个查询子句的组合

  • must:必须匹配每个子查询,类似“与”

  • should:选择性匹配子查询,类似“或”

  • must_not:必须不匹配,不参与算分,类似“非”

  • filter:必须匹配,不参与算分

排序  

基础分页

elasticsearch中通过修改fromsize参数来控制要返回的分页结果:

  • from:从第几个文档开始

  • size:总共查询几个文档

深度分页

针对深度分页,elasticsearch提供了两种解决方案:

  • search after:分页时需要排序,原理是从上一次的排序值开始,查询下一页数据。(意思是要记录上一次查询的最后一条记录的排序值,然后携带到下一次查询。)

高亮原理

服务端实现搜索功能,要是有elasticsearch做分词搜索,是知道哪些词条需要高亮的

  • 用户输入搜索关键字搜索数据

  • 服务端根据搜索关键字到elasticsearch搜索,并给搜索结果中的关键字词条添加html标签

  • 前端提前给约定好的html标签添加CSS样式

 

4.RestClient查询

文档的查询依然使用 RestHighLevelClient对象,查询的基本步骤如下:

  • 1)创建request对象,这次是搜索,所以是SearchRequest

  • 2)准备请求参数,也就是查询DSL对应的JSON参数

  • 3)发起请求

  • 4)解析响应,响应结果相对复杂,需要逐层解析

DSL和JavaAPI的对比

elasticsearch返回的JSON结果

文档搜索的基本步骤是:

  1. 创建SearchRequest对象

  2. 准备request.source(),也就是DSL。

    1. QueryBuilders来构建查询条件

    2. 传入request.source()query()方法

  3. 发送请求,得到结果

  4. 解析结果(参考JSON结果,从外到内,逐层解析)

hmall\search-service\src\test\java\com\hmall\search\SearchTest.java  

5.数据聚合

聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。例如:

  • 什么品牌的手机最受欢迎?

  • 这些手机的平均价格、最高价格、最低价格?

  • 这些手机每月的销售情况如何

参加聚合的字段必须是keyword、日期、数值、布尔类型

Bucket聚合

共有哪些商品分类,category值一样的放在同一组,属于Bucket聚合中的Term聚合

带条件聚合

Bucket聚合是对索引库的所有文档做聚合,

真实场景用户会输入搜索条件,因此聚合必须是对搜索结果聚合。那么聚合必须添加限定条件

term聚合

Metric聚合

统计了价格高于3000的手机品牌,获取每个品牌价格的最小值、最大值、平均值,用Metric聚合

aggs参数。这个聚合就是brand_agg的子聚合,会对brand_agg形成的每个桶中的文档分别统计

RestClient实现聚合

聚合条件的要利用AggregationBuilders工具类来构造

6.实现搜索接口

search-service,在这个微服务中实现搜索数据的导入、商品数据库数据与elasticsearch索引库数据的同步。

搜索功能也要在search-service服务中实现

SearchController

ISearchService

SearchServiceImpl

 

7.过滤条件聚合

但随着搜索条件的变化,过滤条件展示的过滤项是不是应该跟着变化。

例如搜索电视,那么搜索结果中展示的肯定只有电视,而此时过滤条件中的分类就不能还出现手机、拉杆箱等内容。过滤条件的品牌中就不能出现与电视无关的品牌。而是应该展示搜索结果中存在的分类和品牌。

有限定条件的聚合。用户搜索的条件是什么,我们在对分类、品牌聚合时的条件也就是什么,这样就能统计出搜索结果中包含的分类、品牌了。

SearchController

ISearchService

 

SearchServiceImpl

 


网站公告

今日签到

点亮在社区的每一天
去签到