wildcardQuery
GaussDecayFunctionBuilder 高斯函数比对
该配方包含此trade,且国家是140的更靠前,并且包含当前trade的纯度越高越靠前
EsQuery query = new EsQuery();
if(null==size){
query.setPager(0,10);
}else{
query.setPager(0,size);
}
query.includes( "id","tradeName","prd","coverImgId","coverImgSrc","ecoStatus","base64Image" );
//原点(origin):该字段最理想的值,这个值可以得到满分(1.0) 最佳只包含一个inci
//偏移量(offset):与原点相差在偏移量之内的值也可以得到满分
//衰减规模(scale):当值超出了原点到偏移量这段范围,它所得的分数就开始进行衰减了,衰减规模决定了这个分数衰减速度的快慢
//衰减值(decay):该字段可以被接受的值(默认为 0.5),相当于一个分界点,具体的效果与衰减的模式有关
double origin = 1, offset = 0, scale = 20,decay = 0.5;
//以 e 为底的指数函数
//1、最优先展示只含有当前成分的BASF Product(一对一)
ExponentialDecayFunctionBuilder functionBuilder = ScoreFunctionBuilders.exponentialDecayFunction("inciCount", origin, scale, offset, decay).setWeight(100l);
// 2、优先展示Released Country = Asia Pacific的BASF Product 在字典表中的id:140
BoolQueryBuilder countryBuilder= QueryBuilders.boolQuery()
.must(QueryBuilders.termsQuery("inci_ids_arr",tradeMap.get("id")))
.should(QueryBuilders.matchQuery("releasedCountryId",140).boost(25)); //提高评分
//联合分数
FunctionScoreQueryBuilder scoreQueryBuilder = QueryBuilders.functionScoreQuery(countryBuilder,functionBuilder).boostMode(CombineFunction.SUM);
query.boolQueryBuilder(scoreQueryBuilder);
query.orderByDesc("_score","hitNum","id");
//添加用户角色过滤
EsQueryUtil.addTargetUserAndRole(query);
EsResult result = elasticsearchService.createSearch(EsIndexConstant.es_basf_product,query,Map.class);
resultMaps = (List
越多匹配排序越靠前:
if (StrUtil.isNotBlank(formulationQuery.getFunctionClaimId()) && !formulationQuery.getFunctionClaimId().equals("0")) {
List claimIdList = CollUtil.convertToListFromString(formulationQuery.getFunctionClaimId(), ",");
FunctionScoreQueryBuilder.FilterFunctionBuilder[] filterFunctionBuilders = new FunctionScoreQueryBuilder.FilterFunctionBuilder[claimIdList.size() + 1];
ScoreFunctionBuilder claims = new WeightBuilder();
TermsQueryBuilder claimsQuery = QueryBuilders.termsQuery("functionClaimIdArray", claimIdList);
claims.setWeight(32);
FunctionScoreQueryBuilder.FilterFunctionBuilder claimsBuilder = new FunctionScoreQueryBuilder.FilterFunctionBuilder(claimsQuery, claims);
filterFunctionBuilders[0] = claimsBuilder;
for (Integer claimId : claimIdList) {
ScoreFunctionBuilder scoreFunctionBuilder = new WeightBuilder();
TermQueryBuilder functionClaimIdArray = QueryBuilders.termQuery("functionClaimIdArray", claimId);
scoreFunctionBuilder.setWeight(32f);
FunctionScoreQueryBuilder.FilterFunctionBuilder claim = new FunctionScoreQueryBuilder.FilterFunctionBuilder(functionClaimIdArray, scoreFunctionBuilder);
filterFunctionBuilders[claimIdList.indexOf(claimId) + 1] = claim;
}
boolQueryBuilder.should(QueryBuilders.functionScoreQuery(filterFunctionBuilders).scoreMode(FunctionScoreQuery.ScoreMode.SUM).boostMode(CombineFunction.REPLACE));
}



