1 Index、Type、Document
1、Index
index:索引是文档(Document)的容器,是一类文档的集合。
2、Type
Type 可以理解成关系数据库中Table,在7.0开始,一个索引只能建一个Type为_doc
3、Document
Document Index 里面单条的记录称为Document(文档),等同于关系型数据库表中的行。
2 ES创建索引库和搜索
2.1 创建索引库结构
- 在changgou_service_api项目下创建changgou_service_search_api项目
- pom.xml文件引入依赖
<dependency>
<groupId>com.changgou</groupId>
<artifactId>changgou_common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
- 创建包com.changgou.pojo
- 创建和ES索引库映射实体类SkuInfo.java
@Document(indexName = "skuinfo", type = "docs")
public class SkuInfo implements Serializable {
//商品id,同时也是商品编号
@Id
@Field(index = true, store = true, type = FieldType.Keyword)
private Long id;
//SKU名称
@Field(index = true, store = true, type = FieldType.Text, analyzer = "ik_smart")
private String name;
//商品价格,单位为:元
@Field(index = true, store = true, type = FieldType.Double)
private Long price;
//库存数量
@Field(index = true, store = true, type = FieldType.Integer)
private Integer num;
//商品图片
@Field(index = false, store = true, type = FieldType.Text)
private String image;
//商品状态,1-正常,2-下架,3-删除
@Field(index = true, store = true, type = FieldType.Keyword)
private String status;
//创建时间
private Date createTime;
//更新时间
private Date updateTime;
//是否默认
@Field(index = true, store = true, type = FieldType.Keyword)
private String isDefault;
//SPUID
@Field(index = true, store = true, type = FieldType.Long)
private Long spuId;
//类目ID
@Field(index = true, store = true, type = FieldType.Long)
private Long categoryId;
//类目名称
@Field(index = true, store = true,type = FieldType.Keyword)
private String categoryName;
//品牌名称
@Field(index = true, store = true,type = FieldType.Keyword)
private String brandName;
//规格
private String spec;
//规格参数
private Map<String, Object> specMap;
......get和set方法......
2.2 创建ES操作的Dao接口
public interface SearchMapper extends ElasticsearchRepository<SkuInfo,Long> {
}
2.3 搜索微服务批量导入数据逻辑
(1) changgou_service_goods_api创建com.changgou.feign 包,包下创建接口
@FeignClient(name="goods")
@RequestMapping("/sku")
public interface SkuFeign {
/***
* 多条件搜索品牌数据
* @param searchMap
* @return
*/
@GetMapping(value = "/search" )
public Result findList(@RequestParam Map searchMap);
}
(2)changgou_service_search项目下创建 com.changgou.search.service包包下创建接口EsManagerService
public interface EsManagerService {
/**
* 创建索引库结构
*/
public void createIndexAndMapping();
/**
* 根据spuid导入数据到ES索引库
* @param spuId 商品id
*/
public void importDataToESBySpuId(String spuId);
/**
* 导入全部数据到ES索引库
*/
public void importAll();
}
(2)创建com.changgou.search.service包,包下创建服务实现类
@Service
public class EsManagerServiceImpl implements EsManagerService {
@Autowired
private SearchMapper searchMapper;
@Autowired
private SkuFeign skuFeign;
@Autowired
private ElasticsearchTemplate esTemplate;
/**
* 创建索引库结构
*/
@Override
public void createIndexAndMapping() {
//创建索引
esTemplate.createIndex(SkuInfo.class);
//创建映射
esTemplate.putMapping(SkuInfo.class);
}
/**
* 根据spuid导入数据到ES索引库
* @param spuId 商品id
*/
@Override
public void importDataToESBySpuId(String spuId) {
List<Sku> skuList = skuFeign.findSkuListBySpuId(spuId);
List<SkuInfo> skuInfos = JSON.parseArray(JSON.toJSONString(skuList), SkuInfo.class);
for (SkuInfo skuInfo : skuInfos) {
skuInfo.setSpecMap(JSON.parseObject(skuInfo.getSpec(), Map.class));
}
searchMapper.saveAll(skuInfos);
}
/**
* 导入全部数据到ES索引库
*/
@Override
public void importAll() {
Map paramMap = new HashMap();
paramMap.put("status", "1");
Result result = skuFeign.findList(paramMap);
List<SkuInfo> skuInfos = JSON.parseArray(JSON.toJSONString(result.getData()), SkuInfo.class);
for (SkuInfo skuInfo : skuInfos) {
skuInfo.setPrice(skuInfo.getPrice());
skuInfo.setSpecMap(JSON.parseObject(skuInfo.getSpec(), Map.class));
}
searchMapper.saveAll(skuInfos);
}
}
2.4 根据spuId导入索引库数据
(1)changgou_service_search项目下, 创建com.changgou.controller包, 包下创建SearchController
@RestController
@RequestMapping("/sku_search")
public class SearchController {
@Autowired
private EsManagerService esManagerService;
@Autowired
private SearchService searchService;
@GetMapping("/createIndexAndMapping")
public Result createIndexAndMapping() {
esManagerService.createIndexAndMapping();
return new Result(true, StatusCode.OK, "创建成功");
}
/**
* 导入所有审核通过的库存数据到ES索引库
* @return
*/
@GetMapping("/importAll")
public Result importAllDataToES() {
esManagerService.importAll();
return new Result(true, StatusCode.OK, "导入数据成功!");
}
/**
* 全文检索
* @return
*/
@GetMapping
public Map search(@RequestParam Map<String, String> paramMap) throws Exception {
Map resultMap = searchService.search(paramMap);
return resultMap;
}
}
2.5 接收mq消息执行导入
(1)changgou_service_search工程的pom.xml文件中引入依赖包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
(2)changgou_service_search工程创建com.changgou.listener包,包下创建类
@Component
@RabbitListener(queues = "search_add_queue")
public class SpuAddListener {
@Autowired
private EsManagerService esManagerService;
@RabbitHandler
public void addDataToES(String spuId) {
System.out.println("===接收到需要商品上架的spuId为======" + spuId);
esManagerService.importDataToESBySpuId(spuId);
}
}