搜索條件:在Index爲10000下查找標題包含“IPhone”,優先取“品牌手機”這個分類,銷量越高越前,結果隨機給用戶展示:
JAVA 代碼實現片段:
String searchContent = "IPhone";
TransportClient client = esClient.getTransportClient();
String index = "10000";
SearchRequestBuilder searchBuilder = client.prepareSearch(index);
//分頁
searchBuilder.setFrom(0).setSize(10);
//explain爲true表示根據數據相關度排序,和關鍵字匹配最高的排在前面
searchBuilder.setExplain(true);
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
// 搜索 title字段包含IPhone的數據
queryBuilder.must(QueryBuilders.matchQuery("title", searchContent));
FunctionScoreQueryBuilder.FilterFunctionBuilder[] filterFunctionBuilders = new FunctionScoreQueryBuilder.FilterFunctionBuilder[3];
//過濾條件1:分類爲:品牌手機最重要 -- 權重查詢Weight
ScoreFunctionBuilder<WeightBuilder> scoreFunctionBuilder = new WeightBuilder();
scoreFunctionBuilder.setWeight(2);
QueryBuilder termQuery = QueryBuilders.termQuery("categoryName", "品牌手機");
FunctionScoreQueryBuilder.FilterFunctionBuilder category = new FunctionScoreQueryBuilder.FilterFunctionBuilder(termQuery, scoreFunctionBuilder);
filterFunctionBuilders[0] = category;
// 過濾條件2:銷量越高越排前 --計分查詢 FieldValueFactor
ScoreFunctionBuilder<FieldValueFactorFunctionBuilder> fieldValueScoreFunction = new FieldValueFactorFunctionBuilder("salesVolume");
((FieldValueFactorFunctionBuilder) fieldValueScoreFunction).factor(1.2f);
FunctionScoreQueryBuilder.FilterFunctionBuilder sales = new FunctionScoreQueryBuilder.FilterFunctionBuilder(fieldValueScoreFunction);
filterFunctionBuilders[1] = sales;
// 給定每個用戶隨機展示: --random_score
ScoreFunctionBuilder<RandomScoreFunctionBuilder> randomScoreFilter = new RandomScoreFunctionBuilder();
((RandomScoreFunctionBuilder) randomScoreFilter).seed(2);
FunctionScoreQueryBuilder.FilterFunctionBuilder random = new FunctionScoreQueryBuilder.FilterFunctionBuilder(randomScoreFilter);
filterFunctionBuilders[2] = random;
// 多條件查詢 FunctionScore
FunctionScoreQueryBuilder query = QueryBuilders.functionScoreQuery(queryBuilder, filterFunctionBuilders)
.scoreMode(FunctionScoreQuery.ScoreMode.SUM).boostMode(CombineFunction.SUM);
searchBuilder.setQuery(query);
SearchResponse response = searchBuilder.execute().actionGet();
SearchHits hits = response.getHits();
String searchSource;
for (SearchHit hit : hits)
{
searchSource = hit.getSourceAsString();
System.out.println(searchSource);
}
// long took = response.getTook().getMillis();
long total = hits.getTotalHits();
System.out.println(total);
演示代碼地址:GitHub