search-recommend/RestHighLevelClientDemo.md

152 lines
5.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
*该实例代码包括了自定义评分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
}