版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
电商第八天:
回顾昨天:
分布式锁: set(key,value,nx,px,timeout)
redisson
es 安装
中文词库
java 操作es !
开启项目的时候:
service elasticsearch start
nohup ./kibana &
全文检索:
1. 商品的上架 将商品的数据从mysql ---->es 中!
1.1 用户在前台页面进行检索的时候,数据应该直接来自于es!
1.2 因为es 中没有相应商品数据,所以我们需要将商品数据写入es!
1.3 如何写入数据?
ES 的dsl 语句
PUT /INDEX/TYPE/ID
{
}
Index : 如何定义? gmall
Type :如何定义? SkuInfo {Document Field}
制作 mapping
mapping 中对应的数据可以从用户检索之后展示的数据!
skuInfo 中的默认图片,price,skuName,skuId
商品名称,需要分词,并高亮
平台属性值,三级分类Id,进行过滤
显示:skuInfo 中的默认图片,price,skuName,skuId
需要做一个聚合功能{平台属性值Id}
PUT gmall
{
"mappings": {
"SkuInfo":{
"properties": {
"id":{
"type": "keyword"
, "index": false
},
"price":{
"type": "double"
},
"skuName":{
"type": "text",
"analyzer": "ik_max_word"
},
"catalog3Id":{
"type": "keyword"
},
"skuDefaultImg":{
"type": "keyword",
"index": false
},
"skuAttrValueList":{
"properties": {
"valueId":{
"type":"keyword"
}
}
}
}
}
}
}
ID :又是谁?
skuId
PUT /gmall/SkuInfo/33
{
}
PUT /gmall/SkuInfo/34
{
}
应该适应JestClient 将数据保存到es 中!
功能开发流程:
mysql ----> es 上架
设计到的表 skuInfo ,skuAttrValue
bean ;不需要
mapper:间接需要
service,service.impl,controller
SkuLsInfo 从数据库查询出来的数据封装到当前实体类中,该实体类正好对应的是 /gmall/SkuInfo es中
控制器写在哪? gmall-manage-web
2. 手动拼写 dsl 语句,并从es 中将数据进行查询出来
查询两个入口
京东:三级分类Id https://list.jd.com/list.html?cat=9987,653,655
:全文检索 https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA&enc=utf-8&suggest=1.his.0.0&wq=&pvid=5f56532a756f438dbc5096c7f826fca4
我们项目分析:
@ReuqestMapping("list.html")
public String search01(String catalog3Id){
// catalog3Id 查询对应的商品 保存到作用域,前台渲染!
return "search";
}
@ReuqestMapping("list.html")
public String search02(String keyword){
// keyword 查询对应的商品 保存到作用域,前台渲染!
return "search";
}
@ReuqestMapping("list.html")
public String search03(String... valueId){
// valueId 查询对应的商品 保存到作用域,前台渲染!
return "search";
}
@ReuqestMapping("list.html")
public String search01(Param param){
// param 查询对应的商品 保存到作用域,前台渲染!
return "search";
}
// 输入参数的实体类封装
class Param{
String catalog3Id,
String keyword,
List<String> valueId
}
一个是三级分类Id:
catalog3Id , valueId
另一个全文检索入口:
keyword=skuName, valueId
dsl 语句重点包含哪些内容:
1. 先过滤在查询
skuName
catalog3Id , valueId
2. 分页
"from": 1 从第几条数据开始查询
"size": 2 表示每页显示的条数
3. 高亮显示
"highlight": {
"pre_tags": ["<span color='green'>"],
"post_tags": ["</span>"],
"fields": {
"skuName": {}
}
4. 排序
"sort": [
{
"price": {
"order": "asc"
}
}
]
5. 聚合
"aggs": {
"groupby_attr": {
"terms": {
"field": "skuAttrValueList.valueId"
}
}
}
完整的dsl 语句
GET /gmall/SkuInfo/_search
{
"query": {
"bool": {
"filter": [{"term": {"catalog3Id": "61"}},
{"term": {"skuAttrValueList.valueId": "81"}}
],
"must": [
{"match": {
"skuName": "一代米"
}}
]
}
},
"from": 0
, "size": 3
, "highlight": {
"pre_tags": ["<span color='green'>"],
"post_tags": ["</span>"],
"fields": {
"skuName": {}
}
}
, "sort": [
{
"hotScore": {
"order": "asc"
}
}
]
, "aggs": {
"groupby_attr": {
"terms": {
"field": "skuAttrValueList.valueId"
}
}
}
}
-------------------------------------------------
制作入力参数实体类
输入对象:SkuLsParams
输出对象:SkuLsResult
-------------------从新制作一个商品,将前面的所有业务梳理一下-----------------------------
黑色 6+64
金色 8+128
黑色 64+1
6. 使用java 语言动态生成dsl 语句!
bean,mapper,service,service.impl,controller
用户输入的参数:SkuLsParams
JestClient
service:
7. 新建一个项目gmall-list-web
8. 修改虚拟域名
upstream manage.gmall.com {
server 192.168.67.1:8082;
}
server {
listen 80;
server_name manage.gmall.com;
location /{
proxy_pass http://manage.gmall.com;
}
}
upstream list.gmall.com{
server 192.168.67.1:8086;
}
server {
listen 80;
server_name list.gmall.com;
location /{
proxy_pass http://list.gmall.com;
}
}