search-recommend/RestHighLevelClientDemo.md

152 lines
5.2 KiB
Markdown
Raw Permalink Normal View History

2022-03-30 07:07:18 +00:00
/**
*该实例代码包括了自定义评分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
}