1 需求
商品搜索,通过关键词进行商品搜索,关键词指定商品主标题,副标题,商品类目,商品品牌关键词从es搜索出商品。如果是默认词,热词,如果有跳转连接直接跳转对应连接,如果没有从es中查询。
2 es 搜索,后台默认词,热词暂且不说
从es搜索商品首先要从数据库 把商品同步到es 里,然后才能在es中搜索
2 同步方案:
概述:主要把数据库里商品数据同步到es 里,查询的时候商品有默认顺序,就是所谓的综合排序,es 里用评分在做这个东西,根据商品的销量,商品的销售额,pv ,uv 等一些规则来给商品算出一个分,然后根据这个分数进行排序
1,可通过调度,读取mysql 数据,然后插入到es里,先全量同步,然后根据时间戳增量同步。(有点low)
2,通过binlog 进行同步,但是mysql binlog 只能单表同步,也就是说binlog 只能同步商品表,但是商品的品类,品牌变化了,不能同步,解决方案:1,在商品表增加冗余字段,然后通过binlog 单表同步数据到es,2,不想商品表冗余字段太多,单表同步,然后通过sql 查询对应的品类,品牌插入到es
3,通过官方推荐的logstash-input-jdbc插件实现mysql 同步 (项目上线会学习下)
目前公司采用的是binlog同步+调度(每天凌晨根据 销售额,pv,uv等参数算出商品分数,同步到数据库里,再同步到es )
3 es 查询
查询的话 主要是商品列表,再有右上角的筛选列表
分词查询(ik 分词器)
对输入的关键字进行商品列表查询
查询语法
MatchQuery (关键词跟单个索引字段进行匹配)
multiMatchQuery(关键词跟多个索引字段进行匹配)
把关键词进行分词,然后进行逐个分词结果进行匹配,分词结果跟多个字段匹配。
4 es 排序
一般商品列表都有排序功能,默认综合排序,价格排序,销量排序等
价格排序跟销量排序都好理解,但是综合排序按照什么规则呢?
es 本身有搜索评分排序(按照关键词匹配度),但是当关键词完全匹配,怎么办呢,通过业务权重来进行排序,比如商品销量,商品订单金额,pv,uv等综合算一个评分,再加上关键词匹配度进行,总评分进行排序,当然业务权重业务占比相对来说下一些,可根据业务自己算,毕竟用户搜到的关键字匹配度才是用户想要的。
商品列表综合排序规则:es 本身的关键字匹配度评分 + 业务评分
5 聚合查询:右侧筛选 列表。
比如:搜索“苹果”关键词,列表会出现苹果手机,苹果电脑,红富士苹果等商品,这时候你想再细分搜索
当分词查询完,在进行类目查询,传入类目名称,关键词 and 类目 进行查询(类目不进行分词 查询用termQuery 精确查询)
(聚合查询不进行分词),所以如果某个字段即搜索,又聚合,创建mapping 一定要注意增加如下
java 查询语法
客户端操作
{
"size": 0,
"aggs": {
"_result": {
"terms": {
"field": "categoryname.keyword"
}
}
}
}
这篇记录下整体概括,下一篇记录 一些具体的语法,细节(es mapping创建,es 基本查询,默认排序,es 评分,聚合)