...
|
...
|
@@ -35,10 +35,7 @@ import com.yoho.search.service.service.SearchCacheService; |
|
|
import com.yoho.search.service.service.SearchCommonService;
|
|
|
import com.yoho.search.service.service.base.ProductIndexBaseService;
|
|
|
import com.yoho.search.service.service.helper.AggProductListHelper;
|
|
|
import com.yoho.search.service.service.helper.FunctionScoreSearchHelper;
|
|
|
import com.yoho.search.service.service.helper.SearchCommonHelper;
|
|
|
import com.yoho.search.service.service.helper.SearchLikeHelper;
|
|
|
import com.yoho.search.service.service.helper.SearchSortHelper;
|
|
|
import com.yoho.search.service.servicenew.ISearchLikeService;
|
|
|
import com.yoho.search.service.utils.SearchRequestParams;
|
|
|
import com.yoho.search.service.vo.SearchApiResult;
|
...
|
...
|
@@ -47,14 +44,8 @@ import com.yoho.search.service.vo.SearchApiResult; |
|
|
public class SearchLikeServiceImpl implements ISearchLikeService {
|
|
|
|
|
|
@Autowired
|
|
|
private SearchCommonHelper searchCommonHelper;
|
|
|
@Autowired
|
|
|
private SearchCommonService searchCommonService;
|
|
|
@Autowired
|
|
|
private SearchSortHelper searchSortHelper;
|
|
|
@Autowired
|
|
|
private FunctionScoreSearchHelper functionScoreSearchHelper;
|
|
|
@Autowired
|
|
|
private AggProductListHelper aggProductListHelper;
|
|
|
@Autowired
|
|
|
private SearchLikeHelper searchLikeHelper;
|
...
|
...
|
@@ -64,10 +55,9 @@ public class SearchLikeServiceImpl implements ISearchLikeService { |
|
|
private SearchCacheService searchCacheService;
|
|
|
@Autowired
|
|
|
private SearchCacheFactory searchCacheFactory;
|
|
|
|
|
|
|
|
|
|
|
|
private SearchCache searchLikeSearchCache;
|
|
|
|
|
|
|
|
|
@PostConstruct
|
|
|
void init() {
|
|
|
searchLikeSearchCache = searchCacheFactory.getSearchLikeSearchCache();
|
...
|
...
|
@@ -110,7 +100,7 @@ public class SearchLikeServiceImpl implements ISearchLikeService { |
|
|
notInProductSkns.add(product.getString("product_skn"));
|
|
|
}
|
|
|
notInProductSkns.add(productSkn);
|
|
|
JSONArray notInBrandProductList = this.getProductListNotInBrand(productInfoInEs, paramMap, notInProductSkns, pageSize - inBrandProductList.size(), isGlobal);
|
|
|
JSONArray notInBrandProductList = this.getProductListNotInBrand(productInfoInEs, notInProductSkns, pageSize - inBrandProductList.size(), isGlobal);
|
|
|
|
|
|
// 6、构造返回结果
|
|
|
Map<String, Object> dataMap = new HashMap<String, Object>();
|
...
|
...
|
@@ -138,12 +128,11 @@ public class SearchLikeServiceImpl implements ISearchLikeService { |
|
|
private JSONArray getProductListInBrand(JSONObject productInfoInEs, Map<String, String> paramMap, int limit, boolean isGlobal) {
|
|
|
SearchParam searchParam = new SearchParam();
|
|
|
// 1、构建Query
|
|
|
QueryBuilder queryBuilder = this.genQueryBuilder(productInfoInEs, paramMap, true, isGlobal);
|
|
|
QueryBuilder queryBuilder = this.genQueryBuilder(productInfoInEs, true, isGlobal);
|
|
|
searchParam.setQuery(queryBuilder);
|
|
|
|
|
|
// 2、设置过滤条件
|
|
|
BoolQueryBuilder booleanQueryBuilder = this.genBoolQueryBuilder(productInfoInEs, paramMap, Arrays.asList(paramMap.get(SearchRequestParams.PARAM_SEARCH_PRODUCT_SKN)), true,
|
|
|
isGlobal);
|
|
|
BoolQueryBuilder booleanQueryBuilder = this.genBoolQueryBuilder(productInfoInEs, Arrays.asList(paramMap.get(SearchRequestParams.PARAM_SEARCH_PRODUCT_SKN)), true, isGlobal);
|
|
|
searchParam.setFiter(booleanQueryBuilder);
|
|
|
|
|
|
// 3、设置排序规则[按打分排序]
|
...
|
...
|
@@ -157,7 +146,7 @@ public class SearchLikeServiceImpl implements ISearchLikeService { |
|
|
|
|
|
// 5、从缓存中获取数据,有则直接返回
|
|
|
String productIndexName = ISearchConstants.INDEX_NAME_PRODUCT_INDEX;
|
|
|
JSONArray productJSONArray = searchCacheService.getJSONArrayFromCache(searchLikeSearchCache,productIndexName, searchParam);
|
|
|
JSONArray productJSONArray = searchCacheService.getJSONArrayFromCache(searchLikeSearchCache, productIndexName, searchParam);
|
|
|
if (productJSONArray != null) {
|
|
|
return productJSONArray;
|
|
|
}
|
...
|
...
|
@@ -169,7 +158,7 @@ public class SearchLikeServiceImpl implements ISearchLikeService { |
|
|
// 7、构造返回结果并加入缓存
|
|
|
List<Map<String, Object>> productList = productIndexBaseService.getProductListWithPricePlan(searchResult.getResultList());
|
|
|
productJSONArray = this.listToJsonArray(productList);
|
|
|
searchCacheService.addJSONArrayToCache(searchLikeSearchCache,productIndexName, searchParam, productJSONArray);
|
|
|
searchCacheService.addJSONArrayToCache(searchLikeSearchCache, productIndexName, searchParam, productJSONArray);
|
|
|
return productJSONArray;
|
|
|
}
|
|
|
|
...
|
...
|
@@ -181,33 +170,31 @@ public class SearchLikeServiceImpl implements ISearchLikeService { |
|
|
* @param limit
|
|
|
* @return
|
|
|
*/
|
|
|
private JSONArray getProductListNotInBrand(JSONObject productInfoInEs, Map<String, String> paramMap, List<String> notInProductSkns, int limit, boolean isGlobal) {
|
|
|
private JSONArray getProductListNotInBrand(JSONObject productInfoInEs, List<String> notInProductSkns, int limit, boolean isGlobal) {
|
|
|
if (limit <= 0) {
|
|
|
return new JSONArray();
|
|
|
}
|
|
|
SearchParam searchParam = new SearchParam();
|
|
|
// 1、构建Query
|
|
|
QueryBuilder queryBuilder = this.genQueryBuilder(productInfoInEs, paramMap, false, isGlobal);
|
|
|
QueryBuilder queryBuilder = this.genQueryBuilder(productInfoInEs, false, isGlobal);
|
|
|
searchParam.setQuery(queryBuilder);
|
|
|
|
|
|
// 2、设置过滤条件
|
|
|
BoolQueryBuilder booleanQueryBuilder = this.genBoolQueryBuilder(productInfoInEs, paramMap, notInProductSkns, false, isGlobal);
|
|
|
BoolQueryBuilder booleanQueryBuilder = this.genBoolQueryBuilder(productInfoInEs, notInProductSkns, false, isGlobal);
|
|
|
searchParam.setFiter(booleanQueryBuilder);
|
|
|
|
|
|
// 3、设置聚合条件
|
|
|
final String firstAggName = "firstAgg";
|
|
|
String order = "_score:desc";
|
|
|
String sortField = order.split(":")[0];
|
|
|
SortOrder sortOrder = order.split(":")[1].equals("desc") ? SortOrder.DESC : SortOrder.ASC;
|
|
|
String sortField = "_score";
|
|
|
SortOrder sortOrder = SortOrder.DESC;
|
|
|
List<AbstractAggregationBuilder> list = new ArrayList<AbstractAggregationBuilder>();
|
|
|
// 3.1)构造父聚合:品牌或品类聚合【同时按子聚合的sort字段排序】
|
|
|
TermsBuilder brandAggregationBuilder = AggregationBuilders.terms(firstAggName).field("brandId").order(Terms.Order.aggregation("sort", sortOrder.equals(SortOrder.ASC)))
|
|
|
.size(200 + limit);
|
|
|
TermsBuilder brandAggregation = AggregationBuilders.terms(firstAggName).field("brandId").order(Terms.Order.aggregation("sort", false)).size(200 + limit);
|
|
|
// 3.2)添加子聚合:取得分最大的值
|
|
|
brandAggregationBuilder.subAggregation(AggregationBuilders.max("sort").field(sortField));
|
|
|
brandAggregation.subAggregation(AggregationBuilders.max("sort").field(sortField));
|
|
|
// 3.3)添加孙聚合:取打分最高的一个product
|
|
|
brandAggregationBuilder.subAggregation(AggregationBuilders.topHits("product").addSort(SortBuilders.fieldSort(sortField).order(sortOrder)).setSize(2));
|
|
|
list.add(brandAggregationBuilder);
|
|
|
brandAggregation.subAggregation(AggregationBuilders.topHits("product").addSort(SortBuilders.fieldSort(sortField).order(sortOrder)).setSize(2));
|
|
|
list.add(brandAggregation);
|
|
|
searchParam.setAggregationBuilders(list);
|
|
|
|
|
|
// 4、设置分页参数
|
...
|
...
|
@@ -216,7 +203,7 @@ public class SearchLikeServiceImpl implements ISearchLikeService { |
|
|
searchParam.setSize(0);
|
|
|
|
|
|
// 5、先从缓存中获取,如果能取到,则直接返回
|
|
|
JSONArray productJSONArray = searchCacheService.getJSONArrayFromCache(searchLikeSearchCache,ISearchConstants.INDEX_NAME_PRODUCT_INDEX, searchParam);
|
|
|
JSONArray productJSONArray = searchCacheService.getJSONArrayFromCache(searchLikeSearchCache, ISearchConstants.INDEX_NAME_PRODUCT_INDEX, searchParam);
|
|
|
if (productJSONArray != null) {
|
|
|
return productJSONArray;
|
|
|
}
|
...
|
...
|
@@ -233,11 +220,11 @@ public class SearchLikeServiceImpl implements ISearchLikeService { |
|
|
List<Map<String, Object>> productList = aggProductListHelper.getProductListFromAggregation(((MultiBucketsAggregation) aggMaps.get(firstAggName)), limit, sortField,
|
|
|
sortOrder);
|
|
|
productJSONArray = this.listToJsonArray(productList);
|
|
|
searchCacheService.addJSONArrayToCache(searchLikeSearchCache,indexName, searchParam, productJSONArray);
|
|
|
searchCacheService.addJSONArrayToCache(searchLikeSearchCache, indexName, searchParam, productJSONArray);
|
|
|
return productJSONArray;
|
|
|
}
|
|
|
|
|
|
private QueryBuilder genQueryBuilder(JSONObject productInfoInEs, Map<String, String> paramMap, boolean isInBrand, boolean isGlobal) {
|
|
|
private QueryBuilder genQueryBuilder(JSONObject productInfoInEs, boolean isInBrand, boolean isGlobal) {
|
|
|
StringBuilder query = new StringBuilder();
|
|
|
// 1、如果是全球购,则直接用商品名称+品类名称去查
|
|
|
if (isGlobal) {
|
...
|
...
|
@@ -269,11 +256,11 @@ public class SearchLikeServiceImpl implements ISearchLikeService { |
|
|
|
|
|
private void append(StringBuilder stringBuilder, String word) {
|
|
|
if (StringUtils.isNotBlank(word)) {
|
|
|
stringBuilder.append(word).append(" ");
|
|
|
stringBuilder.append(word).append(' ');
|
|
|
}
|
|
|
}
|
|
|
|
|
|
private BoolQueryBuilder genBoolQueryBuilder(JSONObject productInfoInEs, Map<String, String> paramMap, List<String> notProductSkns, boolean isInBrand, boolean isGlobal) {
|
|
|
private BoolQueryBuilder genBoolQueryBuilder(JSONObject productInfoInEs, List<String> notProductSkns, boolean isInBrand, boolean isGlobal) {
|
|
|
BoolQueryBuilder boolFilter = searchLikeHelper.genDefaultQueryBuilder(notProductSkns, isInBrand ? isGlobal : false);// 前几个是全球购,后面找有货的就好
|
|
|
// 1)设置此SKN相关的过滤条件
|
|
|
String gender = productInfoInEs.getString("gender");
|
...
|
...
|
|