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根據索引的時間,進行范圍查找數據時性能不太好。