1,獲得transport client連接實例
/**
* 獲取ES的連接client實例;
*
* @return TransportClient對象
*/
private static TransportClient getTransportClient(String esIp) throws IOException {
Settings settings = Settings.builder()
.put(CLUSTER_NAME, "xxx")
.put(ELASTIC.CLIENT_TRANSPORT_SNIFF, true)
.build();
TransportClient transportClient = TransportClient.builder().settings(settings).build();
String[] ips =esIp.split(",");
for (String ip : ips) {
try {
InetSocketTransportAddress ist = new InetSocketTransportAddress(InetAddress.getByName(ip),ELASTIC.ES_TRANSPORTCLIENT_PORT);
transportClient.addTransportAddress(ist);
}catch (Exception e){
}
}
return transportClient;
}
2, 封裝查詢對象,可以用* 通配索引庫,以及設置最大返回數量
@Test
public void querySearch() throws IOException {
long l = System.currentTimeMillis();
TransportClient transportClient = Factory.getTransportClient();
//封裝聚合的查詢條件
RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery(TIME_FIELD).from(startTime).to(endTime);
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("xx", "xxx");
// QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder().must(rangeQueryBuilder).must(matchQueryBuilder);
// 使用通配符‘*’來前綴匹配INDEX開頭的所有索引庫
SearchResponse response=transportClient.prepareSearch("INDEX*")
.setTypes("TYPE")
// 設置查詢類型
// 1.SearchType.DFS_QUERY_THEN_FETCH = 精確查詢
// 2.SearchType.SCAN = 掃描查詢,無序
// 3.SearchType.COUNT = 不設置的話,這個為默認值,還有的自己去試試吧
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
// 設置查詢關鍵詞
.setQuery(boolQueryBuilder)
// 設置查詢數據的位置,分頁用
.setFrom(0)
// 設置查詢結果集的最大條數
.setSize(1000)
// 設置是否按查詢匹配度排序
.setExplain(true)
// 最后就是返回搜索響應信息
.execute()
.actionGet();
SearchHits searchHits=response.getHits();
// System.out.println("-----------------在["+term+"]中搜索關鍵字["+queryString+"]---------------------");
System.out.println(System.currentTimeMillis() - l);
System.out.println("共匹配到:"+searchHits.getTotalHits()+"條記錄!");
SearchHit[]hits=searchHits.getHits();
for(SearchHit searchHit:hits){
Map<String, Object> sourceAsMap=searchHit.sourceAsMap();
Set<String> keySet=sourceAsMap.keySet();
for(String string:keySet){
//key value 值對應關系
System.out.println(string+":"+sourceAsMap.get(string));
}
System.out.println();
}
}
3, 根據id刪除索引文檔接口,單個與批量,刪除接口索引庫不能用通配'*'來匹配
1,單個id刪除索引文檔
//INDEX:索引庫名稱(不能用通配符),TYPE:索引庫的type ,ID索引庫的ID
DeleteResponse deleteResponse = client.prepareDelete("INDEX", "TYPE", "ID").get();
//成功刪除
if(deleteResponse.isFound()){
successEs.add(rowkey);
}else {
failedEs.add(rowkey);
}
2, 根據ids批量刪除索引文檔
@Test
public void removeDataFromEs() throws IOException { ArrayList<String> xxx= new ArrayList<>(); xxx.add("201801001"); xxx.add("201801001"); TransportClient client = Factory.getTransportClient(); BulkRequestBuilder builder=client.prepareBulk(); for(String id:xxx){ System.out.println(id); builder.add(client.prepareDelete("INDEX", "TYPE", id).request());
} } BulkResponse bulkResponse = builder.get();
3,Elasticseach根據索引的時間,進行范圍查找數據時性能不太好。
