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
|
||
}
|
||
|