...
|
...
|
@@ -47,32 +47,36 @@ public class BigdataSimilarSknService { |
|
|
}
|
|
|
// 2、检测分页参数【默认30条,最多60条】
|
|
|
int pageSize = searchLikeHelper.getPageSize(paramMap);
|
|
|
// 2、获取当前查询的SKN的基本信息
|
|
|
// 3、获取当前查询的SKN的基本信息
|
|
|
JSONObject productInfoInEs = searchLikeHelper.getProductInfoInEs(productSkn);
|
|
|
if (productInfoInEs == null) {
|
|
|
return new SearchApiResult().setCode(400).setMessage("SKN不存在");
|
|
|
}
|
|
|
//查similarskn
|
|
|
//4、获取similarskn
|
|
|
SimilarSkn similarSkn = new SimilarSkn();
|
|
|
BeanUtils.populate(similarSkn, searchLikeHelper.searchSimilarSkn(productSkn));
|
|
|
|
|
|
//5、构造searchParams
|
|
|
List<SearchParam> searchParams = new ArrayList<>();
|
|
|
if (StringUtils.isNotEmpty(similarSkn.getDiffShopActionSimilarSkns())) {
|
|
|
List<String> diffShopActionSimilarSkns = CollectionUtils.arrayToList(similarSkn.getDiffShopActionSimilarSkns().split(","));
|
|
|
searchParams.add(builderSimilarSknSearchParam(productInfoInEs, diffShopActionSimilarSkns, pageSize/3));
|
|
|
}
|
|
|
//5.1)图片[性别+不同店铺]
|
|
|
if (StringUtils.isNotEmpty(similarSkn.getDiffShopImgSimilarSkns())) {
|
|
|
List<String> diffShopImgSimilarSkns = CollectionUtils.arrayToList(similarSkn.getDiffShopImgSimilarSkns().split(","));
|
|
|
searchParams.add(builderSimilarSknSearchParam(productInfoInEs, diffShopImgSimilarSkns, pageSize/3));
|
|
|
searchParams.add(this.builderSimilarSknSearchParam(productInfoInEs, diffShopImgSimilarSkns, false,pageSize/3));
|
|
|
}
|
|
|
//5.2)行为[性别+不同店铺+同品类]
|
|
|
if (StringUtils.isNotEmpty(similarSkn.getDiffShopActionSimilarSkns())) {
|
|
|
List<String> diffShopActionSimilarSkns = CollectionUtils.arrayToList(similarSkn.getDiffShopActionSimilarSkns().split(","));
|
|
|
searchParams.add(this.builderSimilarSknSearchParam(productInfoInEs, diffShopActionSimilarSkns, true,pageSize/3));
|
|
|
}
|
|
|
//5.3)文字兜底[性别+不同店铺+文字相似性]
|
|
|
searchParams.add(this.builderCharactersSearchParam(productInfoInEs, Arrays.asList(productSkn), pageSize, true));
|
|
|
|
|
|
// 4、获取搜索结果[截取条数]
|
|
|
// 6、获取搜索结果[截取条数]
|
|
|
List<Map<String, Object>> tempProductList = searchLikeHelper.queryProductList(searchParams);
|
|
|
if (tempProductList.size() > pageSize) {
|
|
|
tempProductList = CollectionUtils.safeSubList(tempProductList,0, pageSize);
|
|
|
}
|
|
|
// 5、构造真实返回结果
|
|
|
// 7、构造真实返回结果
|
|
|
List<Map<String, Object>> productListResults = new ArrayList<>();
|
|
|
if (!tempProductList.isEmpty()) {
|
|
|
productListResults = productIndexBaseService.getProductListWithPricePlan(tempProductList);
|
...
|
...
|
@@ -84,7 +88,6 @@ public class BigdataSimilarSknService { |
|
|
result.put("total", productListResults.size());
|
|
|
result.put("product_info", searchLikeHelper.genProductInfoResult(productInfoInEs));
|
|
|
result.put("product_list", productListResults);
|
|
|
// 8、结果加入缓存
|
|
|
return new SearchApiResult().setData(result);
|
|
|
} catch (Exception e) {
|
|
|
logger.error(e.getMessage(), e);
|
...
|
...
|
@@ -147,11 +150,11 @@ public class BigdataSimilarSknService { |
|
|
return boolFilter;
|
|
|
}
|
|
|
|
|
|
private SearchParam builderSimilarSknSearchParam(JSONObject productInfoInEs, List<String> productSkns, int pageSize) {
|
|
|
private SearchParam builderSimilarSknSearchParam(JSONObject productInfoInEs, List<String> productSkns,boolean filterSameSort, int pageSize) {
|
|
|
// 1、设置SearchParam
|
|
|
SearchParam searchParam = new SearchParam();
|
|
|
// 2)设置query和filter
|
|
|
searchParam.setFiter(builderSimilarSknFilterBuilder(productInfoInEs, productSkns));
|
|
|
searchParam.setFiter(this.builderSimilarSknFilterBuilder(productInfoInEs, productSkns,filterSameSort));
|
|
|
// 3、设置排序规则[按打分排序]
|
|
|
List<SortBuilder<?>> sortBuilders = new ArrayList<>();
|
|
|
sortBuilders.add(SortBuilders.scoreSort().order(SortOrder.DESC));
|
...
|
...
|
@@ -165,7 +168,7 @@ public class BigdataSimilarSknService { |
|
|
return searchParam;
|
|
|
}
|
|
|
|
|
|
private QueryBuilder builderSimilarSknFilterBuilder(JSONObject productInfoInEs, List<String> inProductSkns) {
|
|
|
private QueryBuilder builderSimilarSknFilterBuilder(JSONObject productInfoInEs, List<String> inProductSkns,boolean filterSameSort) {
|
|
|
String isGlobalInEs = productInfoInEs.getString(ProductIndexEsField.isGlobal);
|
|
|
boolean isGlobal = "Y".equalsIgnoreCase(isGlobalInEs);
|
|
|
BoolQueryBuilder boolFilter = searchLikeHelper.genDefaultSearchLikeFilter(null, isGlobal);
|
...
|
...
|
@@ -175,11 +178,11 @@ public class BigdataSimilarSknService { |
|
|
if (genderList != null && !genderList.isEmpty()) {
|
|
|
boolFilter.must(QueryBuilders.termsQuery(ProductIndexEsField.gender, genderList));
|
|
|
}
|
|
|
//設置productskn
|
|
|
// 2)設置productskn
|
|
|
if (inProductSkns != null && !inProductSkns.isEmpty()) {
|
|
|
boolFilter.must(QueryBuilders.termsQuery(ProductIndexEsField.productSkn, inProductSkns));
|
|
|
}
|
|
|
// 2)设置品牌或店铺信息
|
|
|
// 3)设置品牌或店铺信息
|
|
|
Integer brandId = productInfoInEs.getInteger(ProductIndexEsField.brandId);
|
|
|
Integer shopId = productInfoInEs.getInteger(ProductIndexEsField.shopId);
|
|
|
if (searchLikeHelper.isLegalInteger(shopId)) {
|
...
|
...
|
@@ -187,6 +190,11 @@ public class BigdataSimilarSknService { |
|
|
} else if (searchLikeHelper.isLegalInteger(brandId)) {
|
|
|
boolFilter.mustNot(QueryBuilders.termQuery(ProductIndexEsField.brandId, brandId));
|
|
|
}
|
|
|
// 4)是否需要同品类
|
|
|
Integer middleSortId = productInfoInEs.getInteger(ProductIndexEsField.middleSortId);
|
|
|
if (filterSameSort && searchLikeHelper.isLegalInteger(middleSortId)) {
|
|
|
boolFilter.must(QueryBuilders.termQuery(ProductIndexEsField.middleSortId, middleSortId));
|
|
|
}
|
|
|
return boolFilter;
|
|
|
}
|
|
|
|
...
|
...
|
|