谷粒商城集成 elasticsearch
一、elasticsearch 基本概念
- Elasticsearch (简称ES)是一个分布式、restful 风格的搜索和数据分析引擎
| 索引(indices) | Databases 数据库 |
|---|
| 类型(type) | Table 数据表 [7.x废弃] |
| 文档(document) | Row 行 |
| 字段(Field) | Columns 列 |
| mapping映射 | schema约束 |
二、elasticsearch 搜索原理
倒排索引
- 步骤
- 数据根据词条进行分词,同时记录文档索引位置
- 将词条相同的数据化进行合并
- 对词条进行排序
- 过程
- 先将搜索词语进行分词,分词后在倒排索引列表查询文档位置(docId),根据docId查询文档数据。
三、elasticsearch 与 Solr 的区别
| elasticsearch | Solr |
|---|
| 开箱即用 | 安装略微复杂 |
| 自带分布式协调管理功能 | 利用 zookeeper 进行分布式管理 |
| 仅支持 JSON 格式的数据 | 支持多种格式的数据,比如JSON、XML、CSV |
| 适用于新兴的实时搜索应用 | 传统搜索应用的有力解决方案 |
四、DSL 语句的基本使用
1. 索引库操作
- 查看所有索引库:GET /_cat/indices?v
- 查看一个索引库:GET/索引库名
- 创建索引库:
PUT /索引库名
{
"settings": {
"number_of_shards": 3, # 主分片数
"number_of_replicas": 2 # 副分片数
}
}
2. 映射操作
- type 字段类型
- index 是否索引:取决于是否以该字段进行搜索
- store 是否存储:取决于搜索结果集中是否展示该字段,es中即使设置为false,依然存储,存储到_source。如果设置为true,会额外保存一份
- analyzer:分词器,这里使用ik分词器:ik_max_word或者ik_smart
PUT /索引库名/_mapping
{
"properties": {
"字段名": {
"type":
"index":
"analyzer"
}
}
}
3. 文档的CRUD
POST /索引库名/_doc/{id}
{
"字段名": "字段值"
}
DELETe /索引库名/_doc/{id}
GET /atguigu/_search
{
"query": {
"match_all": {}
}
}
"match": {
"字段名": {
"query": "条件",
"operator": "and/or"
}
}
- 词条查询:最小的分词单元,条件必须是最小的分词单元
"term": {
"字段名": {
"value": "词条条件"
}
}
"terms": {
"字段名": [
"词条条件"
]
}
"range": {
"字段名": {
"gt/gte": 起始值,
"lt/lte": 截止值
}
}
"bool": {
"must/must_not/should": [
{},{}
]
}
"bool": {
"must": [],
"filter": [],
}
"sort": [
{
"字段名": {
"order": "asc/desc"
}
}
]
from: (pageNum - 1) * pageSize
size: pageSize
"hignlight": {
"fields": {"字段名":{}},
"pre_tags": "",
"post_tags": ""
}
"_source": {
"includes/excludes": ["字段列表"]
}
五、数据库中的数据批量导入索引库
- 添加依赖
- 配置 yml 配置文件
- 构建一个 Goods 对象(索引)
- 提供数据的七个接口
- 分页查询已上架的SPU信息
- 根据SpuId查询对应的SKU信息(接口已写好)
- 根据分类id查询商品分类(逆向工程已自动生成)
- 根据品牌id查询品牌(逆向工程已自动生成)
- 根据skuid查询库存(gmall-wms中接口已写好)
- 根据spuId和cid查询检索规格参数及值(cid用于查attr_id)
- 根据skuId和cid查询检索规格参数及值(cid用于查attr_id)
- 创建一个 GoodsRepository接口 用于文档操作
- 将数据批量导入索引库,实现数据同步
六、实现搜索功能
- 构建搜索请求体,设置索引库 并设置搜索条件构建器
- 执行查询
- 构建查询条件(bool查询)
- 匹配查询
- 过滤查询
- 品牌过滤
- 分类过滤
- 价格区间过滤
- 是否有货
- 规格参数的过滤
- 构建排序
- 构建分页
- 构建高亮
- 构建聚合
- 构建品牌聚合
- 构建分类聚合
- 构建规格参数的嵌套聚合
- 构建结果集过滤
- 解析结果集