search-recommend/RestHighLevelClientDemo.md

5.2 KiB
Raw Blame History

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