深入解析:微服务day9
已经导入了大量数据到elasticsearch中,实现了商品数据的存储。查询商品数据时采用的是根据id查询,而非模糊搜索。
elasticsearch的数据搜索功能。Elasticsearch提供了基于JSON的DSL语句在组织DSL条件。就是来定义查询条件,其JavaAPI就
DSL的查询语法
基于DSL来对照学习JavaAPI
1.DSL查询
叶子查询(Leafqueryclauses):特定字段里查询特定值
复合查询(Compoundqueryclauses):以逻辑方式组合多个叶子查询或者更改叶子查询的行为方式。
在Kibana的DevTools中学习查询的DSL语法
:match_all,处于安全考虑,elasticsearch设置了默认的查询页数。就是无条件查询的类型

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


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

range是范围查询

3.复合查询
bool查询 组合一个或多个查询子句的组合
must:必须匹配每个子查询,类似“与”
should:选择性匹配子查询,类似“或”
must_not:必须不匹配,不参与算分,类似“非”
filter:必须匹配,不参与算分

排序

基础分页
elasticsearch中通过修改from、size参数来控制要返回的分页结果:
from:从第几个文档开始size:总共查询几个文档
深度分页
针对深度分页,elasticsearch提供了两种解决方案:
search after:分页时需要排序,原理是从上一次的排序值开始,查询下一页内容。(意思是要记录上一次查询的最后一条记录的排序值,然后携带到下一次查询。)
高亮原理

服务端实现搜索功能,要是有elasticsearch做分词搜索,是知道哪些词条需要高亮的
用户输入搜索关键字搜索素材
服务端根据搜索关键字到elasticsearch搜索,并给搜索结果中的关键字词条添加
html标签前端提前给约定好的
html标签添加CSS样式

4.RestClient查询
文档的查询依然使用 RestHighLevelClient对象,查询的基本步骤如下:
1)创建
request对象,这次是搜索,所以是SearchRequest2)准备请求参数,也就是查询DSL对应的JSON参数
3)发起请求
4)解析响应,响应结果相对艰难,需要逐层解析
DSL和JavaAPI的对比

elasticsearch返回的JSON结果

文档搜索的基本步骤是:
创建
SearchRequest对象准备
request.source(),也就是DSL。QueryBuilders来构建查询条件传入
request.source()的query()方法
发送请求,得到结果
解析结果(参考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
![]()
浙公网安备 33010602011771号