Commit c3359c9f authored by macro's avatar macro
Browse files

springboot升级至2.1.3,elasticsearch升级至6.2.2

parent 470c40eb
...@@ -3,7 +3,6 @@ package com.macro.mall.search.domain; ...@@ -3,7 +3,6 @@ package com.macro.mall.search.domain;
import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field; import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldIndex;
import org.springframework.data.elasticsearch.annotations.FieldType; import org.springframework.data.elasticsearch.annotations.FieldType;
import java.io.Serializable; import java.io.Serializable;
...@@ -19,20 +18,20 @@ public class EsProduct implements Serializable { ...@@ -19,20 +18,20 @@ public class EsProduct implements Serializable {
private static final long serialVersionUID = -1L; private static final long serialVersionUID = -1L;
@Id @Id
private Long id; private Long id;
@Field(index = FieldIndex.not_analyzed,type = FieldType.String) @Field(index = false)
private String productSn; private String productSn;
private Long brandId; private Long brandId;
@Field(index = FieldIndex.not_analyzed,type = FieldType.String) @Field(index = false)
private String brandName; private String brandName;
private Long productCategoryId; private Long productCategoryId;
@Field(index = FieldIndex.not_analyzed,type = FieldType.String) @Field(index = false)
private String productCategoryName; private String productCategoryName;
private String pic; private String pic;
@Field(analyzer = "ik_max_word",type = FieldType.String) @Field(analyzer = "ik_max_word")
private String name; private String name;
@Field(analyzer = "ik_max_word",type = FieldType.String) @Field(analyzer = "ik_max_word")
private String subTitle; private String subTitle;
@Field(analyzer = "ik_max_word",type = FieldType.String) @Field(analyzer = "ik_max_word")
private String keywords; private String keywords;
private BigDecimal price; private BigDecimal price;
private Integer sale; private Integer sale;
......
package com.macro.mall.search.domain; package com.macro.mall.search.domain;
import org.springframework.data.elasticsearch.annotations.Field; import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldIndex;
import org.springframework.data.elasticsearch.annotations.FieldType;
import java.io.Serializable; import java.io.Serializable;
...@@ -15,12 +13,12 @@ public class EsProductAttributeValue implements Serializable { ...@@ -15,12 +13,12 @@ public class EsProductAttributeValue implements Serializable {
private Long id; private Long id;
private Long productAttributeId; private Long productAttributeId;
//属性值 //属性值
@Field(index = FieldIndex.not_analyzed, type = FieldType.String) @Field(index = false)
private String value; private String value;
//属性参数:0->规格;1->参数 //属性参数:0->规格;1->参数
private Integer type; private Integer type;
//属性名称 //属性名称
@Field(index = FieldIndex.not_analyzed, type = FieldType.String) @Field(index = false)
private String name; private String name;
public Long getId() { public Long getId() {
return id; return id;
......
...@@ -6,6 +6,7 @@ import com.macro.mall.search.domain.EsProductRelatedInfo; ...@@ -6,6 +6,7 @@ import com.macro.mall.search.domain.EsProductRelatedInfo;
import com.macro.mall.search.repository.EsProductRepository; import com.macro.mall.search.repository.EsProductRepository;
import com.macro.mall.search.service.EsProductService; import com.macro.mall.search.service.EsProductService;
import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.common.lucene.search.function.FunctionScoreQuery;
import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder; import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder;
...@@ -55,7 +56,7 @@ public class EsProductServiceImpl implements EsProductService { ...@@ -55,7 +56,7 @@ public class EsProductServiceImpl implements EsProductService {
@Override @Override
public int importAll() { public int importAll() {
List<EsProduct> esProductList = productDao.getAllEsProductList(null); List<EsProduct> esProductList = productDao.getAllEsProductList(null);
Iterable<EsProduct> esProductIterable = productRepository.save(esProductList); Iterable<EsProduct> esProductIterable = productRepository.saveAll(esProductList);
Iterator<EsProduct> iterator = esProductIterable.iterator(); Iterator<EsProduct> iterator = esProductIterable.iterator();
int result = 0; int result = 0;
while (iterator.hasNext()) { while (iterator.hasNext()) {
...@@ -67,7 +68,7 @@ public class EsProductServiceImpl implements EsProductService { ...@@ -67,7 +68,7 @@ public class EsProductServiceImpl implements EsProductService {
@Override @Override
public void delete(Long id) { public void delete(Long id) {
productRepository.delete(id); productRepository.deleteById(id);
} }
@Override @Override
...@@ -90,19 +91,19 @@ public class EsProductServiceImpl implements EsProductService { ...@@ -90,19 +91,19 @@ public class EsProductServiceImpl implements EsProductService {
esProduct.setId(id); esProduct.setId(id);
esProductList.add(esProduct); esProductList.add(esProduct);
} }
productRepository.delete(esProductList); productRepository.deleteAll(esProductList);
} }
} }
@Override @Override
public Page<EsProduct> search(String keyword, Integer pageNum, Integer pageSize) { public Page<EsProduct> search(String keyword, Integer pageNum, Integer pageSize) {
Pageable pageable = new PageRequest(pageNum, pageSize); Pageable pageable = PageRequest.of(pageNum, pageSize);
return productRepository.findByNameOrSubTitleOrKeywords(keyword, keyword, keyword, pageable); return productRepository.findByNameOrSubTitleOrKeywords(keyword, keyword, keyword, pageable);
} }
@Override @Override
public Page<EsProduct> search(String keyword, Long brandId, Long productCategoryId, Integer pageNum, Integer pageSize,Integer sort) { public Page<EsProduct> search(String keyword, Long brandId, Long productCategoryId, Integer pageNum, Integer pageSize,Integer sort) {
Pageable pageable = new PageRequest(pageNum, pageSize); Pageable pageable = PageRequest.of(pageNum, pageSize);
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder(); NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
//分页 //分页
nativeSearchQueryBuilder.withPageable(pageable); nativeSearchQueryBuilder.withPageable(pageable);
...@@ -117,19 +118,32 @@ public class EsProductServiceImpl implements EsProductService { ...@@ -117,19 +118,32 @@ public class EsProductServiceImpl implements EsProductService {
} }
nativeSearchQueryBuilder.withFilter(boolQueryBuilder); nativeSearchQueryBuilder.withFilter(boolQueryBuilder);
} }
//elasticsearch2.4.6的用法
// FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery()
// .add(QueryBuilders.matchQuery("name", keyword),
// ScoreFunctionBuilders.weightFactorFunction(10))
// .add(QueryBuilders.matchQuery("subTitle", keyword),
// ScoreFunctionBuilders.weightFactorFunction(5))
// .add(QueryBuilders.matchQuery("keywords", keyword),
// ScoreFunctionBuilders.weightFactorFunction(2))
// .scoreMode("sum")
// .setMinScore(2);
//搜索 //搜索
FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery()
.add(QueryBuilders.matchQuery("name", keyword),
ScoreFunctionBuilders.weightFactorFunction(10))
.add(QueryBuilders.matchQuery("subTitle", keyword),
ScoreFunctionBuilders.weightFactorFunction(5))
.add(QueryBuilders.matchQuery("keywords", keyword),
ScoreFunctionBuilders.weightFactorFunction(2))
.scoreMode("sum")
.setMinScore(2);
if (StringUtils.isEmpty(keyword)) { if (StringUtils.isEmpty(keyword)) {
nativeSearchQueryBuilder.withQuery(QueryBuilders.matchAllQuery()); nativeSearchQueryBuilder.withQuery(QueryBuilders.matchAllQuery());
} else { } else {
List<FunctionScoreQueryBuilder.FilterFunctionBuilder> filterFunctionBuilders = new ArrayList<>();
filterFunctionBuilders.add(new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.matchQuery("name", keyword),
ScoreFunctionBuilders.weightFactorFunction(10)));
filterFunctionBuilders.add(new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.matchQuery("subTitle", keyword),
ScoreFunctionBuilders.weightFactorFunction(5)));
filterFunctionBuilders.add(new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.matchQuery("keywords", keyword),
ScoreFunctionBuilders.weightFactorFunction(2)));
FunctionScoreQueryBuilder.FilterFunctionBuilder[] builders = new FunctionScoreQueryBuilder.FilterFunctionBuilder[filterFunctionBuilders.size()];
filterFunctionBuilders.toArray(builders);
FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(builders)
.scoreMode(FunctionScoreQuery.ScoreMode.SUM)
.setMinScore(2);
nativeSearchQueryBuilder.withQuery(functionScoreQueryBuilder); nativeSearchQueryBuilder.withQuery(functionScoreQueryBuilder);
} }
//排序 //排序
...@@ -157,7 +171,7 @@ public class EsProductServiceImpl implements EsProductService { ...@@ -157,7 +171,7 @@ public class EsProductServiceImpl implements EsProductService {
@Override @Override
public Page<EsProduct> recommend(Long id, Integer pageNum, Integer pageSize) { public Page<EsProduct> recommend(Long id, Integer pageNum, Integer pageSize) {
Pageable pageable = new PageRequest(pageNum, pageSize); Pageable pageable = PageRequest.of(pageNum, pageSize);
List<EsProduct> esProductList = productDao.getAllEsProductList(id); List<EsProduct> esProductList = productDao.getAllEsProductList(id);
if (esProductList.size() > 0) { if (esProductList.size() > 0) {
EsProduct esProduct = esProductList.get(0); EsProduct esProduct = esProductList.get(0);
...@@ -165,13 +179,30 @@ public class EsProductServiceImpl implements EsProductService { ...@@ -165,13 +179,30 @@ public class EsProductServiceImpl implements EsProductService {
Long brandId = esProduct.getBrandId(); Long brandId = esProduct.getBrandId();
Long productCategoryId = esProduct.getProductCategoryId(); Long productCategoryId = esProduct.getProductCategoryId();
//根据商品标题、品牌、分类进行搜索 //根据商品标题、品牌、分类进行搜索
FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery() //elasticsearch2.4.6的用法
.add(QueryBuilders.matchQuery("name",keyword),ScoreFunctionBuilders.weightFactorFunction(8)) // FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery()
.add(QueryBuilders.matchQuery("subTitle",keyword),ScoreFunctionBuilders.weightFactorFunction(2)) // .add(QueryBuilders.matchQuery("name",keyword),ScoreFunctionBuilders.weightFactorFunction(8))
.add(QueryBuilders.matchQuery("keywords",keyword),ScoreFunctionBuilders.weightFactorFunction(2)) // .add(QueryBuilders.matchQuery("subTitle",keyword),ScoreFunctionBuilders.weightFactorFunction(2))
.add(QueryBuilders.termQuery("brandId",brandId),ScoreFunctionBuilders.weightFactorFunction(10)) // .add(QueryBuilders.matchQuery("keywords",keyword),ScoreFunctionBuilders.weightFactorFunction(2))
.add(QueryBuilders.matchQuery("productCategoryId",productCategoryId),ScoreFunctionBuilders.weightFactorFunction(6)) // .add(QueryBuilders.termQuery("brandId",brandId),ScoreFunctionBuilders.weightFactorFunction(10))
.scoreMode("sum") // .add(QueryBuilders.matchQuery("productCategoryId",productCategoryId),ScoreFunctionBuilders.weightFactorFunction(6))
// .scoreMode("sum")
// .setMinScore(2);
List<FunctionScoreQueryBuilder.FilterFunctionBuilder> filterFunctionBuilders = new ArrayList<>();
filterFunctionBuilders.add(new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.matchQuery("name", keyword),
ScoreFunctionBuilders.weightFactorFunction(8)));
filterFunctionBuilders.add(new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.matchQuery("subTitle", keyword),
ScoreFunctionBuilders.weightFactorFunction(2)));
filterFunctionBuilders.add(new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.matchQuery("keywords", keyword),
ScoreFunctionBuilders.weightFactorFunction(2)));
filterFunctionBuilders.add(new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.matchQuery("brandId", brandId),
ScoreFunctionBuilders.weightFactorFunction(10)));
filterFunctionBuilders.add(new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.matchQuery("productCategoryId", productCategoryId),
ScoreFunctionBuilders.weightFactorFunction(6)));
FunctionScoreQueryBuilder.FilterFunctionBuilder[] builders = new FunctionScoreQueryBuilder.FilterFunctionBuilder[filterFunctionBuilders.size()];
filterFunctionBuilders.toArray(builders);
FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(builders)
.scoreMode(FunctionScoreQuery.ScoreMode.SUM)
.setMinScore(2); .setMinScore(2);
NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder(); NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();
builder.withQuery(functionScoreQueryBuilder); builder.withQuery(functionScoreQueryBuilder);
...@@ -197,10 +228,8 @@ public class EsProductServiceImpl implements EsProductService { ...@@ -197,10 +228,8 @@ public class EsProductServiceImpl implements EsProductService {
//集合搜索分类名称 //集合搜索分类名称
builder.addAggregation(AggregationBuilders.terms("productCategoryNames").field("productCategoryName")); builder.addAggregation(AggregationBuilders.terms("productCategoryNames").field("productCategoryName"));
//聚合搜索商品属性,去除type=1的属性 //聚合搜索商品属性,去除type=1的属性
AbstractAggregationBuilder aggregationBuilder = AggregationBuilders.nested("allAttrValues") AbstractAggregationBuilder aggregationBuilder = AggregationBuilders.nested("allAttrValues","attrValueList")
.path("attrValueList") .subAggregation(AggregationBuilders.filter("productAttrs",QueryBuilders.termQuery("attrValueList.type",1))
.subAggregation(AggregationBuilders.filter("productAttrs")
.filter(QueryBuilders.termQuery("attrValueList.type",1))
.subAggregation(AggregationBuilders.terms("attrIds") .subAggregation(AggregationBuilders.terms("attrIds")
.field("attrValueList.productAttributeId") .field("attrValueList.productAttributeId")
.subAggregation(AggregationBuilders.terms("attrValues") .subAggregation(AggregationBuilders.terms("attrValues")
...@@ -224,38 +253,38 @@ public class EsProductServiceImpl implements EsProductService { ...@@ -224,38 +253,38 @@ public class EsProductServiceImpl implements EsProductService {
//设置品牌 //设置品牌
Aggregation brandNames = aggregationMap.get("brandNames"); Aggregation brandNames = aggregationMap.get("brandNames");
List<String> brandNameList = new ArrayList<>(); List<String> brandNameList = new ArrayList<>();
for(int i = 0; i<((StringTerms) brandNames).getBuckets().size(); i++){ for(int i = 0; i<((Terms) brandNames).getBuckets().size(); i++){
brandNameList.add(((StringTerms) brandNames).getBuckets().get(i).getKeyAsString()); brandNameList.add(((Terms) brandNames).getBuckets().get(i).getKeyAsString());
} }
productRelatedInfo.setBrandNames(brandNameList); productRelatedInfo.setBrandNames(brandNameList);
//设置分类 //设置分类
Aggregation productCategoryNames = aggregationMap.get("productCategoryNames"); Aggregation productCategoryNames = aggregationMap.get("productCategoryNames");
List<String> productCategoryNameList = new ArrayList<>(); List<String> productCategoryNameList = new ArrayList<>();
for(int i=0;i<((StringTerms) productCategoryNames).getBuckets().size();i++){ for(int i=0;i<((Terms) productCategoryNames).getBuckets().size();i++){
productCategoryNameList.add(((StringTerms) productCategoryNames).getBuckets().get(i).getKeyAsString()); productCategoryNameList.add(((Terms) productCategoryNames).getBuckets().get(i).getKeyAsString());
} }
productRelatedInfo.setProductCategoryNames(productCategoryNameList); productRelatedInfo.setProductCategoryNames(productCategoryNameList);
//设置参数 //设置参数
Aggregation productAttrs = aggregationMap.get("allAttrValues"); Aggregation productAttrs = aggregationMap.get("allAttrValues");
List<Terms.Bucket> attrIds = ((LongTerms) ((InternalFilter)productAttrs.getProperty("productAttrs")).getAggregations().getProperty("attrIds")).getBuckets(); // List<Terms.Bucket> attrIds = ((LongTerms) ((InternalFilter)productAttrs.getProperty("productAttrs")).getAggregations().getProperty("attrIds")).getBuckets();
List<EsProductRelatedInfo.ProductAttr> attrList = new ArrayList<>(); // List<EsProductRelatedInfo.ProductAttr> attrList = new ArrayList<>();
for (Terms.Bucket attrId : attrIds) { // for (Terms.Bucket attrId : attrIds) {
EsProductRelatedInfo.ProductAttr attr = new EsProductRelatedInfo.ProductAttr(); // EsProductRelatedInfo.ProductAttr attr = new EsProductRelatedInfo.ProductAttr();
attr.setAttrId((Long) attrId.getKey()); // attr.setAttrId((Long) attrId.getKey());
List<String> attrValueList = new ArrayList<>(); // List<String> attrValueList = new ArrayList<>();
List<Terms.Bucket> attrValues = ((StringTerms) attrId.getAggregations().get("attrValues")).getBuckets(); // List<Terms.Bucket> attrValues = ((StringTerms) attrId.getAggregations().get("attrValues")).getBuckets();
List<Terms.Bucket> attrNames = ((StringTerms) attrId.getAggregations().get("attrNames")).getBuckets(); // List<Terms.Bucket> attrNames = ((StringTerms) attrId.getAggregations().get("attrNames")).getBuckets();
for (Terms.Bucket attrValue : attrValues) { // for (Terms.Bucket attrValue : attrValues) {
attrValueList.add(attrValue.getKeyAsString()); // attrValueList.add(attrValue.getKeyAsString());
} // }
attr.setAttrValues(attrValueList); // attr.setAttrValues(attrValueList);
if(!CollectionUtils.isEmpty(attrNames)){ // if(!CollectionUtils.isEmpty(attrNames)){
String attrName = attrNames.get(0).getKeyAsString(); // String attrName = attrNames.get(0).getKeyAsString();
attr.setAttrName(attrName); // attr.setAttrName(attrName);
} // }
attrList.add(attr); // attrList.add(attr);
} // }
productRelatedInfo.setProductAttrs(attrList); // productRelatedInfo.setProductAttrs(attrList);
return productRelatedInfo; return productRelatedInfo;
} }
} }
#===datasource start=== #===datasource start===
spring.datasource.url=jdbc:mysql://localhost:3306/mall?useUnicode=true&characterEncoding=utf-8 spring.datasource.url=jdbc:mysql://localhost:3306/mall?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
spring.datasource.username=root spring.datasource.username=root
spring.datasource.password=root spring.datasource.password=root
#===datasource end=== #===datasource end===
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment