152 lines
5.2 KiB
Markdown
152 lines
5.2 KiB
Markdown
|
/**
|
|||
|
*该实例代码包括了自定义评分function_score(用script评分),以及精确匹配(包含script筛选),已经用script排序
|
|||
|
*/
|
|||
|
public List<GoodsDto> searchByKey(String key) {
|
|||
|
/**
|
|||
|
* 自定义评分计算
|
|||
|
*/
|
|||
|
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
|
|||
|
// 混合查询
|
|||
|
boolQueryBuilder.must(QueryBuilders.multiMatchQuery("飞利浦", "title", "short_title", "goods_description")
|
|||
|
.minimumShouldMatch("1").type(Type.BEST_FIELDS).tieBreaker(0.3f));
|
|||
|
//根据当前价格(有活动价的取活动价,没有活动价取当前价)筛选
|
|||
|
Map<String, Object> params = new HashMap<String, Object>();
|
|||
|
params.put("lprice", 100.0);
|
|||
|
params.put("hprice", 200.0);
|
|||
|
Script script = new Script(ScriptType.INLINE, "painless",
|
|||
|
"if(doc['goods_price_activity'].size()>0){doc['goods_price_activity'].value>params['lprice'] && doc['goods_price_activity'].value<params['hprice']} else {doc['goods_price_now'].value>params['lprice'] && doc['goods_price_now'].value<params['hprice']}",
|
|||
|
params);
|
|||
|
boolQueryBuilder.must(
|
|||
|
QueryBuilders.scriptQuery(script)
|
|||
|
);
|
|||
|
// 精确匹配查询
|
|||
|
Map<String, Object> parameters = new HashMap<String, Object>();
|
|||
|
parameters.put("ntime", System.currentTimeMillis());
|
|||
|
Script inline = new Script(ScriptType.INLINE, "painless",
|
|||
|
"doc['begin_time'].size()>0 && doc['end_time'].size()>0 && doc['begin_time'].value.toInstant().toEpochMilli() < params['ntime'] && doc['end_time'].value.toInstant().toEpochMilli() > params['ntime'] ? doc['goods_price_activity'].value:doc['goods_price_now'].value",
|
|||
|
parameters);
|
|||
|
ScriptScoreFunctionBuilder scriptFunction = ScoreFunctionBuilders.scriptFunction(inline);
|
|||
|
// FunctionScoreQueryBuilder.FilterFunctionBuilder[] filterFunctionBuilders = new FunctionScoreQueryBuilder.FilterFunctionBuilder[] {
|
|||
|
// filterFunctionBuilder2 };
|
|||
|
FunctionScoreQueryBuilder query = QueryBuilders.functionScoreQuery(boolQueryBuilder, scriptFunction);
|
|||
|
|
|||
|
SearchSourceBuilder builder = new SearchSourceBuilder();
|
|||
|
builder.size(10).query(boolQueryBuilder);
|
|||
|
builder.query(query);
|
|||
|
builder.sort("_score", SortOrder.DESC);
|
|||
|
|
|||
|
Script script2 = new Script(
|
|||
|
"doc['goods_price_activity'].size()>0? doc['goods_price_activity'].value:doc['goods_price_now'].value");
|
|||
|
ScriptSortBuilder scriptSortBuilder = new ScriptSortBuilder(script2,ScriptSortType.NUMBER);
|
|||
|
builder.sort(scriptSortBuilder.order(SortOrder.DESC));
|
|||
|
return esUtil.search("goods_list", builder, GoodsDto.class);
|
|||
|
}
|
|||
|
|
|||
|
kibana的rest请求写法:
|
|||
|
GET goods_list/_search
|
|||
|
{
|
|||
|
"query": {
|
|||
|
"bool": {
|
|||
|
"must": [
|
|||
|
{"multi_match": {
|
|||
|
"query": "",
|
|||
|
"type": "best_fields",
|
|||
|
"fields": ["title","short_title","goods_description"],
|
|||
|
"tie_breaker": 0.3
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
},
|
|||
|
{
|
|||
|
"script": {
|
|||
|
"script": {
|
|||
|
"lang":"painless",
|
|||
|
"source": "if(doc['goods_price_activity'].size()>0){doc['goods_price_activity'].value>params['lprice'] && doc['goods_price_activity'].value<params['hprice']} else {doc['goods_price_now'].value>params['lprice'] && doc['goods_price_now'].value<params['hprice']}",
|
|||
|
"params": {
|
|||
|
"lprice":100.0,
|
|||
|
"hprice":200.0
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
],
|
|||
|
"filter": [
|
|||
|
{"term": {
|
|||
|
"terminal_code": "6"
|
|||
|
}}
|
|||
|
]
|
|||
|
}
|
|||
|
},
|
|||
|
"sort": [
|
|||
|
{
|
|||
|
"_script" : {
|
|||
|
"script" : {
|
|||
|
"source" : "doc['goods_price_activity'].size()>0? doc['goods_price_activity'].value:doc['goods_price_now'].value"
|
|||
|
},
|
|||
|
"type" : "number",
|
|||
|
"order" : "desc"
|
|||
|
}
|
|||
|
}
|
|||
|
],
|
|||
|
"from": 0,
|
|||
|
"size": 100
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//最接近生产使用的rest调用示例:
|
|||
|
GET goods_list/_search
|
|||
|
{
|
|||
|
"query": {
|
|||
|
"bool": {
|
|||
|
"must": [
|
|||
|
{"multi_match": {
|
|||
|
"query": "摩飞冷暖风机",
|
|||
|
"type": "best_fields",
|
|||
|
"fields": ["title","short_title","goods_description"],
|
|||
|
"tie_breaker": 0.3
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
},
|
|||
|
{
|
|||
|
"script": {
|
|||
|
"script": {
|
|||
|
"lang":"painless",
|
|||
|
"source": "if(doc['goods_price_activity'].size()>0){doc['goods_price_activity'].value>params['lprice'] && doc['goods_price_activity'].value<params['hprice']} else {doc['goods_price_now'].value>params['lprice'] && doc['goods_price_now'].value<params['hprice']}",
|
|||
|
"params": {
|
|||
|
"lprice":100.0,
|
|||
|
"hprice":200.0
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
],
|
|||
|
"filter": [
|
|||
|
{"term": {
|
|||
|
"terminal_code": "6"
|
|||
|
}
|
|||
|
},
|
|||
|
{
|
|||
|
"term": {
|
|||
|
"terminal_code": "7"
|
|||
|
}
|
|||
|
},
|
|||
|
{
|
|||
|
"term": {
|
|||
|
"terminal_code": "8"
|
|||
|
}
|
|||
|
}
|
|||
|
]
|
|||
|
}
|
|||
|
},
|
|||
|
"sort": [
|
|||
|
{
|
|||
|
"sale_time": {
|
|||
|
"order": "desc"
|
|||
|
}
|
|||
|
}
|
|||
|
],
|
|||
|
"from": 0,
|
|||
|
"size": 100
|
|||
|
}
|
|||
|
|