Node接入 node client(客戶端相當於一個node接入)
Transport接入 transport client(5之前多用這種方式,基於二進制設計效率比較高)
Http接入 rest client(基於http通信,做到了不受語言限制,不受框架限制,5之后推介這種方式,7之后es會廢棄Transport方式)
#申明es服務地址
elasticsearch.ip1=192.168.1.67:9300 //記得是9200端口,看es配置,之前這里搞錯es通信連接不上很難判斷錯誤
/*
ES連接不上判斷方式
1.端口配置
2.是否網絡IO不足,超時時間太短
3.hostname是否配置對,第一次最好用ip
*/
public class ElasticsearchRestClient2 { @Value("${elasticsearch.ip1}") String ipAddress; @Bean(name="highLevelClient") public RestHighLevelClient highLevelClient() { String [] address = ipAddress.split(":"); String ip = address[0]; int port = Integer.valueOf(address[1]); HttpHost httpHost = new HttpHost(ip,port,"http"); RestClientBuilder builder = RestClient.builder( new HttpHost("192.168.1.67", 9200, "http")); builder.setRequestConfigCallback( new RestClientBuilder.RequestConfigCallback() { @Override public RequestConfig.Builder customizeRequestConfig( RequestConfig.Builder requestConfigBuilder) { return requestConfigBuilder.setConnectionRequestTimeout(-1); } }); return new RestHighLevelClient(builder); } //使用es查詢的方法,等有空獨立做個工具類,不過各個版本不同應該有區別我用的是7.6.1 @Override public Map<String, Object> searchES(BigDecimal longitude, BigDecimal latitude, String keyword, Integer orderby, Integer categoryId, String tags) throws IOException { Map<String,Object> result = new HashMap<String,Object>(); SearchRequest searchRequest = new SearchRequest("shop"); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); List<Integer> 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())); } List<ShopModel> shopModelList = shopIdsList.stream().map( id -> { return get(id); } ).collect(Collectors.toList()); result.put("shop",shopModelList); return result; }
//但是對於過於復雜的kibanna查詢,用java es 高階API去做查詢顯然十分麻煩,可以通過es的高階調用低階API去傳遞JSON字符串做類似KIBANNA查詢
@Override public List<ShopModel> search(BigDecimal longitude, BigDecimal latitude, String keyword,Integer orderby,Integer categoryId,String tags) { List<ShopModel> shopModelList = shopModelMapper.search(longitude,latitude,keyword,orderby,categoryId,tags); shopModelList.forEach( shopModel -> { shopModel.setSellerModel(sellerService.get(shopModel.getSellerId())); shopModel.setCategoryModel(categoryService.get(shopModel.getCategoryId())); } ); return shopModelList; } @Override public Map<String, Object> searchES(BigDecimal longitude, BigDecimal latitude, String keyword, Integer orderby, Integer categoryId, String tags) throws IOException { Map<String,Object> result = new HashMap<String,Object>(); // SearchRequest searchRequest = new SearchRequest("shop"); // SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); // // List<Integer> 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<ShopModel> shopModelList = new ArrayList<>(); for(int i = 0;i<jsonArray.size();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<ShopModel> shopModelList = shopIdsList.stream().map( // id -> { // return get(id); // } // ).collect(Collectors.toList()); result.put("shop",shopModelList); return result; }