Authored by 胡古飞

fix SearchLikeServiceImpl

... ... @@ -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");
... ...