已经导入了大量数据到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中通过修改from
、size
参数来控制要返回的分页结果:
-
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结果

文档搜索的基本步骤是:
-
创建
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
