公司要重構一個項目,有部分數據是用阿里的雲elasticsearch作為數據存儲,大概兩千萬,這邊Java主要是做查詢,由於阿里雲文檔不全,記錄下一些比較困難的操作~由於項目緊急,以下僅為個人理解,勿噴。
1.Java連接elasticsearch
引入elasticsearch依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>
創建elasticsearch連接
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("es客戶端用戶名", "es客戶端密碼")); restClient = RestClient.builder(new HttpHost("es地址", 9200, "http")) .setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() { @Override public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) { return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider); } }).build();
設置請求方式,查詢就用get或者post
String method = "POST";
設置要查詢的庫、表的名稱
String endpoint = "/date/date/_search";
至此,基礎設置已經完成。
2.多個字段的模糊查詢
這里就類似於MySQL中的 select * from user where name like '%張三%' and tel like '%155%';
{ "query":{ "bool":{ "must":[ { "match_phrase":{ "name":"張三" } }, { "match_phrase":{ "tel":"188" } } ], "minimum_should_match":1 } } }
must: must的兩個條件都必須滿足,類似於mysql中的and,如果想用or的話,可以替換成should
match_phrase:不分詞,不分詞,不分詞,也就是說符合條件的字段內容中必須包含你要搜索的信息,等同於模糊查詢。
3.去重查詢
{ "query":{ "collapse":{ "field":"tel" }, "bool":{ "must":[ { "match_phrase":{ "name":"小明" } }, { "match_phrase":{ "tel":"188" } } ], "minimum_should_match":1 } } }
field:tel 以tel為條件把重復的數據進行折疊,來達到去重的效果,可是到這里還有問題,查詢出來的條數還是折疊之前的條數,下面我們要統計一下,折疊之后的條數。
{ "query":{ "collapse":{ "field":"tel" }, "bool":{ "must":[ { "match_phrase":{ "name":"天津" } }, { "match_phrase":{ "tel":"188" } } ], "minimum_should_match":1 } }, "aggs":{ "count":{ "cardinality":{ "field":"tel" } } }, "size":10, "from":0 }
使用aggs count 來統計折疊之后的條數,解析JSON時就可以獲取到了
解析時使用fastjson進行解析~
4.發送請求(查詢)
Response response = restClient.performRequest(method, endpoint, Collections.<String, String>emptyMap(), entity);
我使用的springboot內置的restclient發送的http請求
5.接收請求並進行解析
//響應的數據 String str = EntityUtils.toString(response.getEntity()); //獲得總條數 Object countObject = JSON.parseObject(str).get("aggregations"); Object total = JSON.parseObject(countObject.toString()).get("count"); total = JSON.parseObject(total.toString()).get("value");
//獲得響應的數據
Object json_test = JSON.parseObject(str).get("hits");
Object o = JSON.parseObject(json_test.toString()).get("hits");
List<restEntity> list = JSON.parseArray(o.toString(), restEntity.class);