ES服务器硬件,es客户端查询服务器的三种模式

该代码段展示了如何使用Elasticsearch进行基于经纬度的店铺搜索,并结合卖家评分、距离、关键字等多因素进行综合排序。首先通过mapper进行基本查询,然后填充卖家与类别信息。接着,构造Elasticsearch的请求,使用 Gauss 函数计算距离,并结合卖家禁用状态、名称匹配度、评分等因素构建函数评分查询。最后,解析响应,获取店铺信息并计算精确距离,返回排序后的店铺列表。
摘要由CSDN通过智能技术生成

@Overridepublic Listsearch(BigDecimal longitude, BigDecimal latitude, String keyword,Integer orderby,Integer categoryId,String tags) {

List shopModelList =shopModelMapper.search(longitude,latitude,keyword,orderby,categoryId,tags);

shopModelList.forEach(

shopModel->{

shopModel.setSellerModel(sellerService.get(shopModel.getSellerId()));

shopModel.setCategoryModel(categoryService.get(shopModel.getCategoryId()));

}

);returnshopModelList;

}

@Overridepublic Map searchES(BigDecimal longitude, BigDecimal latitude, String keyword, Integer orderby, Integer categoryId, String tags) throwsIOException {

Map result = new HashMap();//SearchRequest searchRequest = new SearchRequest("shop");//SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();//

//List shopIdsList = new ArrayList<>();//sourceBuilder.query(QueryBuilders.matchQuery("name",keyword));//sourceBuilder.timeout(new TimeValue(60,TimeUnit.SECONDS));//searchRequest.source(sourceBuilder);//

//SearchResponse searchResponse = highLevelClient.search(searchRequest, RequestOptions.DEFAULT);//SearchHit[] hits = searchResponse.getHits().getHits();//for(SearchHit hit : hits)//{//shopIdsList.add(new Integer(hit.getSourceAsMap().get("id").toString()));//}

Request request = new Request("GET","/shop/_search");

String reqJson=

"{\n" +

" \"_source\": \"*\", \n" +

" \"script_fields\": {\n" +

" \"distance\":{\n" +

" \"script\":{\n" +

" \"source\":\"haversin(lat,lon,doc[‘location‘].lat,doc[‘location‘].lon)\",\n" +

" \"lang\":\"expression\",\n" +

" \"params\":{\"lat\":" + latitude.toString() + ",\"lon\":" + longitude.toString() + "}\n" +

" \n" +

" }\n" +

" }\n" +

" },\n" +

" \"query\": {\n" +

" \"function_score\": {\n" +

" \"query\": {\n" +

" \"bool\": {\n" +

" \"must\": [\n" +

" {\"match\": {\"name\": {\"query\": \"" + keyword + "\",\"boost\": 0.1}}},\n" +

" {\"term\": {\"seller_disabled_flag\": 0}}\n" +

" ]}},\n" +

" \"functions\": [\n" +

" {\n" +

" \"gauss\": {\n" +

" \"location\": {\n" +

" \"origin\": \"" + latitude.toString() + "," + longitude.toString() + "\",\n" +

" \"scale\": \"100km\",\n" +

" \"offset\": \"0km\",\n" +

" \"decay\": 0.5\n" +

" }\n" +

" },\n" +

" \"weight\": 9\n" +

" },\n" +

" {\n" +

" \"field_value_factor\": {\n" +

" \"field\": \"remark_score\"\n" +

" },\n" +

" \"weight\": 0.2\n" +

" },\n" +

" {\n" +

" \"field_value_factor\": {\n" +

" \"field\": \"seller_remark_score\"\n" +

" },\n" +

" \"weight\": 0.1\n" +

" }\n" +

" ],\n" +

" \"score_mode\": \"sum\",\n" +

" \"boost_mode\": \"replace\"\n" +

" }\n" +

" }\n" +

" , \"sort\": [\n" +

" {\n" +

" \"_score\": {\n" +

" \"order\": \"desc\"\n" +

" }\n" +

" }\n" +

" ]\n" +

" \n" +

" \n" +

"}";

System.out.println(reqJson);

System.out.println("===========================================================");

request.setJsonEntity(reqJson);

Response response=highLevelClient.getLowLevelClient().performRequest(request);

String responseStr=EntityUtils.toString(response.getEntity());

System.out.println(responseStr);

JSONObject jsonObject=JSONObject.parseObject(responseStr);

JSONArray jsonArray= jsonObject.getJSONObject("hits").getJSONArray("hits");

List shopModelList = new ArrayList<>();for(int i = 0;i

{

JSONObject jsonObj=jsonArray.getJSONObject(i);

Integer id= new Integer(jsonObj.get("_id").toString());//jsonObj.getJSONObject("fields").getJSONArray("distance").get(0);

BigDecimal distance = new BigDecimal(jsonObj.getJSONObject("fields")

.getJSONArray("distance").get(0).toString());

ShopModel shopModel=get(id);//shopModel.setDistance(distance.setScale(0,BigDecimal.ROUND_CEILING).intValue() * 1000);

shopModel.setDistance(distance.multiply(new BigDecimal(1000).setScale(0,BigDecimal.ROUND_CEILING)).intValue());

shopModelList.add(shopModel);

}//List shopModelList = shopIdsList.stream().map(//id -> {//return get(id);//}//).collect(Collectors.toList());

result.put("shop",shopModelList);returnresult;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值