pom:
<properties>
<spring-data-elasticsearch.version>4.2.11</spring-data-elasticsearch.version>
</properties>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<version>${spring-data-elasticsearch.version}</version>
</dependency>
yml:
spring:
elasticsearch:
rest:
uris: 192.168.0.***:9200
username:
password:
dto :
package com.shenmo.ebs.oms.productItem.pojo.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.DateFormat;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* es的商品信息
* @author yanggs
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Document(indexName = "item_info_search")
public class ItemInfoSearchDto {
/**
* 商品ID
*/
@Id
private String itemId;
/**
* 商品类型[1:单品;2:组合商品;3:商品套装;4:商品打包;5:单品;]1单品是使用属性选择,5单品是没有属性只要sku商品
*/
private Integer itemType;
/**
* 商品名称
*/
@Field(type= FieldType.Text)
private String title;
/**
* 商品副标题
*/
private String subTitle;
/**
* 发布时间
*/
@JsonFormat(shape =JsonFormat.Shape.STRING,pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
@Field(type = FieldType.Date, format = DateFormat.custom,pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime publishTime;
/**
* 市场价
*/
private BigDecimal marketPrice;
/**
* 图片文件ID,多个文件英文逗号隔开
*/
private String imageId;
/**
* 视频文件ID,多个文件英文逗号隔开
*/
private String videoId;
/**
* 是否征订[0:普通;1:征订;]
*/
private Integer isPreSale;
/**
* 是否允许加价[0:不允许;1:允许;]
*/
private Integer isMarkup;
/**
* 商品分类
*/
private Integer cateId;
/**
* 添加时间
*/
@JsonFormat(shape =JsonFormat.Shape.STRING,pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
@Field(type = FieldType.Date, format = DateFormat.custom,pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
/**
* 商品分类Id集合,后台分类,从顶级到该商品,英文逗号分隔
*/
private String cateIds;
/**
* 销售分类Id集合,多个英文逗号分隔
*/
private String saleCateIds;
/**
* 商品归属课程编号
*/
private String courseCode;
/**
* es搜索字段
*/
@Field(type= FieldType.Text)
private String skuTitleNames;
/**
* sku属性集合
*/
@Field(type= FieldType.Text)
private String skuValueNames;
}
Repository(类似mapper.java)
package com.shenmo.ebs.oms.productItem.repository;
import com.shenmo.ebs.oms.productItem.pojo.dto.ItemInfoSearchDto;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Component;
/**
* <p>
* ES商品检索信息 服务类
* </p>
*
* @author yanggs
* @since 2021-08-19
*/
@Component
public interface ItemInfoSearchDtoRepository extends ElasticsearchRepository<ItemInfoSearchDto,String> {
}
ElasticsearchRepository 两个范型,第一个是用到的bean,第二个是bean的id的类型;
保存数据
itemInfoSearchDtoRepository.saveAll(itemInfoSearchDtoList);
数据查询
package com.shenmo.ebs.app.item.repository;
import com.shenmo.ebs.app.item.pojo.dto.ItemInfoSearchDto;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* <p>
* ES商品检索信息 服务类
* </p>
*
* @author yanggs
* @since 2021-08-19
*/
@Component
public interface ItemInfoSearchDtoRepository extends ElasticsearchRepository<ItemInfoSearchDto,String> {
/**
* 检索商品信息
* @param CourseCodes 盟校加盟课程
* @param SkuTitleNames 查询条件
* @param pageable 分页信息
* @return 商品分页列表
*/
Page<ItemInfoSearchDto> findByCourseCodeInAndSkuTitleNames(List<String> CourseCodes, String SkuTitleNames, Pageable pageable);
/**
* 检索商品信息
* @param CourseCodes 盟校加盟课程
* @param SkuTitleNames 查询条件
* @return 商品列表
*/
List<ItemInfoSearchDto> findByCourseCodeInAndSkuTitleNames(List<String> CourseCodes, String SkuTitleNames);
}
Sort sort;
switch (itemInfoSearchRo.getSortType()){
case "2":
sort = Sort.by("publishTime").descending();
break;
case "3":
sort = Sort.by("marketPrice").ascending();
break;
case "4":
sort = Sort.by("marketPrice").descending();
break;
default:
sort = Sort.by("cateId").descending();
}
Pageable pageable = PageRequest.of(itemInfoSearchRo.getPageNum()-1,itemInfoSearchRo.getPageSize(),sort);
org.springframework.data.domain.Page<ItemInfoSearchDto> page = this.itemInfoSearchDtoRepository.findByCourseCodeInAndSkuTitleNames(courseCodeListR.getData(),searchWord,pageable);
findByCourseCodeInAndSkuTitleNames 是自定义查询方法
查询示例
关键字 | 使用示例 | 等同于的ES查询 |
---|---|---|
And | findByNameAndPrice | {“bool” : {“must” : [ {“field” : {“name” : “?”}}, {“field” : {“price” : “?”}} ]}} |
Or | findByNameOrPrice | {“bool” : {“should” : [ {“field” : {“name” : “?”}}, {“field” : {“price” : “?”}} ]}} |
Is | findByName | {“bool” : {“must” : {“field” : {“name” : “?”}}}} |
Not | findByNameNot | {“bool” : {“must_not” : {“field” : {“name” : “?”}}}} |
Between | findByPriceBetween | {“bool” : {“must” : {“range” : {“price” : {“from” : ?,”to” : ?,”include_lower” : true,”include_upper” : true}}}}} |
LessThanEqual | findByPriceLessThan | {“bool” : {“must” : {“range” : {“price” : {“from” : null,”to” : ?,”include_lower” : true,”include_upper” : true}}}}} |
GreaterThanEqual | findByPriceGreaterThan | {“bool” : {“must” : {“range” : {“price” : {“from” : ?,”to” : null,”include_lower” : true,”include_upper” : true}}}}} |
Before | findByPriceBefore | {“bool” : {“must” : {“range” : {“price” : {“from” : null,”to” : ?,”include_lower” : true,”include_upper” : true}}}}} |
After | findByPriceAfter | {“bool” : {“must” : {“range” : {“price” : {“from” : ?,”to” : null,”include_lower” : true,”include_upper” : true}}}}} |
Like | findByNameLike | {“bool” : {“must” : {“field” : {“name” : {“query” : “? *”,”analyze_wildcard” : true}}}}} |
StartingWith | findByNameStartingWith | {“bool” : {“must” : {“field” : {“name” : {“query” : “? *”,”analyze_wildcard” : true}}}}} |
EndingWith | findByNameEndingWith | {“bool” : {“must” : {“field” : {“name” : {“query” : “*?”,”analyze_wildcard” : true}}}}} |
Contains/Containing | findByNameContaining | {“bool” : {“must” : {“field” : {“name” : {“query” : “?”,”analyze_wildcard” : true}}}}} |
In | findByNameIn(Collectionnames) | {“bool” : {“must” : {“bool” : {“should” : [ {“field” : {“name” : “?”}}, {“field” : {“name” : “?”}} ]}}}} |
NotIn | findByNameNotIn(Collectionnames) | {“bool” : {“must_not” : {“bool” : {“should” : {“field” : {“name” : “?”}}}}}} |
True | findByAvailableTrue | {“bool” : {“must” : {“field” : {“available” : true}}}} |
False | findByAvailableFalse | {“bool” : {“must” : {“field” : {“available” : false}}}} |
OrderBy | findByAvailableTrueOrderByNameDesc | {“sort” : [{ “name” : {“order” : “desc”} }],”bool” : {“must” : {“field” : {“available” : true}}}} |