下载ES:https://www.elastic.co/cn/downloads/past-releases/elasticsearch-6-2-2 中文分词器(bin下cmd):elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.2.2/elasticsearch-analysis-ik-6.2.2.zip ES客户端:ch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.2.2/elasticsearch-analysis-ik-6.2.2.zip1.2、pom依赖
1.3、application.yaml配置4.0.0 org.springframework.boot spring-boot-starter-parent 2.1.3.RELEASE com.wnx.mall.tiny mall-tiny-06 0.0.1-SNAPSHOT mall-tiny-06 Demo project for Spring Boot 1.8 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-actuator org.springframework.boot spring-boot-starter-aop org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-configuration-processor com.github.pagehelper pagehelper-spring-boot-starter 1.2.10 com.alibaba druid-spring-boot-starter 1.1.10 org.mybatis.generator mybatis-generator-core 1.3.3 mysql mysql-connector-java 8.0.15 io.springfox springfox-swagger2 2.7.0 io.springfox springfox-swagger-ui 2.7.0 org.springframework.boot spring-boot-starter-data-redis org.springframework.boot spring-boot-starter-security cn.hutool hutool-all 4.5.7 io.jsonwebtoken jjwt 0.9.0 org.springframework.boot spring-boot-starter-data-elasticsearch org.springframework.boot spring-boot-maven-plugin
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/mall?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: root
redis:
host: localhost # Redis服务器地址
database: 0 # Redis数据库索引(默认为0)
port: 6379 # Redis服务器连接端口
password: # Redis服务器连接密码(默认为空)
jedis:
pool:
max-active: 8 # 连接池最大连接数(使用负值表示没有限制)
max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)
max-idle: 8 # 连接池中的最大空闲连接
min-idle: 0 # 连接池中的最小空闲连接
timeout: 3000ms # 连接超时时间(毫秒)
data:
elasticsearch:
repositories:
enabled: true
cluster-nodes: 127.0.0.1:9300 # es的连接地址及端口号
cluster-name: elasticsearch # es集群的名称
mybatis:
mapper-locations:
- classpath:mapper/*.xml
- classpath*:commapper
@document(indexName = "pms", type = "product",shards = 1,replicas = 0)
public class EsProduct implements Serializable {
private static final long serialVersionUID = -1L;
@Id
private Long id;
@Field(type = FieldType.Keyword)
private String productSn;
private Long brandId;
@Field(type = FieldType.Keyword)
private String brandName;
private Long productCategoryId;
@Field(type = FieldType.Keyword)
private String productCategoryName;
private String pic;
@Field(analyzer = "ik_max_word",type = FieldType.Text)
private String name;
@Field(analyzer = "ik_max_word",type = FieldType.Text)
private String subTitle;
@Field(analyzer = "ik_max_word",type = FieldType.Text)
private String keywords;
private BigDecimal price;
private Integer sale;
private Integer newStatus;
private Integer recommandStatus;
private Integer stock;
private Integer promotionType;
private Integer sort;
@Field(type =FieldType.Nested)
private List attrValueList;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getProductSn() {
return productSn;
}
public void setProductSn(String productSn) {
this.productSn = productSn;
}
public Long getBrandId() {
return brandId;
}
public void setBrandId(Long brandId) {
this.brandId = brandId;
}
public String getBrandName() {
return brandName;
}
public void setBrandName(String brandName) {
this.brandName = brandName;
}
public Long getProductCategoryId() {
return productCategoryId;
}
public void setProductCategoryId(Long productCategoryId) {
this.productCategoryId = productCategoryId;
}
public String getProductCategoryName() {
return productCategoryName;
}
public void setProductCategoryName(String productCategoryName) {
this.productCategoryName = productCategoryName;
}
public String getPic() {
return pic;
}
public void setPic(String pic) {
this.pic = pic;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSubTitle() {
return subTitle;
}
public void setSubTitle(String subTitle) {
this.subTitle = subTitle;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
public Integer getSale() {
return sale;
}
public void setSale(Integer sale) {
this.sale = sale;
}
public Integer getNewStatus() {
return newStatus;
}
public void setNewStatus(Integer newStatus) {
this.newStatus = newStatus;
}
public Integer getRecommandStatus() {
return recommandStatus;
}
public void setRecommandStatus(Integer recommandStatus) {
this.recommandStatus = recommandStatus;
}
public Integer getStock() {
return stock;
}
public void setStock(Integer stock) {
this.stock = stock;
}
public Integer getPromotionType() {
return promotionType;
}
public void setPromotionType(Integer promotionType) {
this.promotionType = promotionType;
}
public Integer getSort() {
return sort;
}
public void setSort(Integer sort) {
this.sort = sort;
}
public List getAttrValueList() {
return attrValueList;
}
public void setAttrValueList(List attrValueList) {
this.attrValueList = attrValueList;
}
public String getKeywords() {
return keywords;
}
public void setKeywords(String keywords) {
this.keywords = keywords;
}
}
- 搜索中的商品属性信息
package com.wnx.mall.tiny.nosql.document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import java.io.Serializable;
public class EsProductAttributevalue implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private Long productAttributeId;
//属性值
@Field(type = FieldType.Keyword)
private String value;
//属性参数:0->规格;1->参数
private Integer type;
//属性名称
@Field(type=FieldType.Keyword)
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getProductAttributeId() {
return productAttributeId;
}
public void setProductAttributeId(Long productAttributeId) {
this.productAttributeId = productAttributeId;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public Integer getType() {
return type;
}
public void setType(Integer type) {
this.type = type;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2.2、接口
package com.wnx.mall.tiny.nosql.repository; import com.wnx.mall.tiny.nosql.document.EsProduct; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; public interface EsProductRepository extends ElasticsearchRepository3、Service{ Page findByNameOrSubTitleOrKeywords(String name, String subTitle, String keywords, Pageable page); }
package com.wnx.mall.tiny.service;
import com.wnx.mall.tiny.nosql.document.EsProduct;
import org.springframework.data.domain.Page;
import java.util.List;
public interface EsProductService {
int importAll();
void delete(Long id);
EsProduct create(Long id);
void delete(List ids);
Page search(String keyword, Integer pageNum, Integer pageSize);
}
3.1、ServiceImpl
package com.wnx.mall.tiny.service.impl;
import cn.hutool.core.collection.CollUtil;
import com.wnx.mall.tiny.dao.EsProductDao;
import com.wnx.mall.tiny.nosql.document.EsProduct;
import com.wnx.mall.tiny.nosql.repository.EsProductRepository;
import com.wnx.mall.tiny.service.EsProductService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
@Service
public class EsProductServiceImpl implements EsProductService {
@Resource
private EsProductDao productDao;
@Resource
private EsProductRepository productRepository;
private static final Logger LOGGER = LoggerFactory.getLogger(EsProductServiceImpl.class);
@Override
public int importAll() {
List allEsProductList = productDao.getAllEsProductList(null);
Iterable iterable = productRepository.saveAll(allEsProductList);
Iterator iterator = iterable.iterator();
int result = 0;
while (iterator.hasNext()){
result++;
iterator.next();
}
return result;
}
@Override
public void delete(Long id) {
productRepository.deleteById(id);
}
@Override
public EsProduct create(Long id) {
EsProduct result = null;
List esProductList = productDao.getAllEsProductList(id);
if (esProductList.size()>0){
EsProduct esProduct = esProductList.get(0);
result = productRepository.save(esProduct);
}
return result;
}
@Override
public void delete(List ids) {
if (CollUtil.isNotEmpty(ids)){
List esProductList = new ArrayList<>();
ids.forEach(id->{
EsProduct esProduct = new EsProduct();
esProduct.setId(id);
esProductList.add(esProduct);
});
productRepository.deleteAll(esProductList);
}
}
@Override
public Page search(String keyword, Integer pageNum, Integer pageSize) {
Pageable pageable = PageRequest.of(pageNum,pageSize);
return productRepository.findByNameOrSubTitleOrKeywords(keyword,keyword,keyword,pageable);
}
}
4、DAO
package com.wnx.mall.tiny.dao;
import com.wnx.mall.tiny.nosql.document.EsProduct;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface EsProductDao {
List getAllEsProductList(@Param("id") Long id);
}
4.1、Mapper.xml
5、Controller
package com.wnx.mall.tiny.controller;
import com.wnx.mall.tiny.common.api.CommonPage;
import com.wnx.mall.tiny.common.api.CommonResult;
import com.wnx.mall.tiny.nosql.document.EsProduct;
import com.wnx.mall.tiny.service.EsProductService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@Controller
@Api(tags = "EsProductController", description = "搜索商品管理")
@RequestMapping("/esProduct")
public class EsProductController {
@Autowired
private EsProductService esProductService;
@ApiOperation(value = "导入所有数据库中商品到ES")
@RequestMapping(value = "/importAll", method = RequestMethod.POST)
@ResponseBody
public CommonResult importAllList() {
int count = esProductService.importAll();
return CommonResult.success(count);
}
@ApiOperation(value = "根据id删除商品")
@RequestMapping(value = "/delete/{id}", method = RequestMethod.GET)
@ResponseBody
public CommonResult
5.1、接口测试
5.2、客户端操作ES接口地址:http://localhost:8080/swagger-ui.html
- 访问http://localhost:5601 即可打开Kibana的用户界面



