Elasticsearch 的Java API 提供了很是便捷的方法來索引和查詢數據等。 經過添加jar包,不須要編寫HTTP層的代碼就能夠開始着手進行鏈接到Elasticsearch的工做。它提供了兩種方法鏈接到Elasticsearch:建立一個本地節點並加入集羣(cluster),或者利用傳輸(transport)。這兩種方法都是利用一個Client(org.elasticsearch.client.Client)實例來實現的。node
使用第一種方法的思想,是講建立的本地節點做爲集羣的一部分,這樣這個建立的本地節點就能夠是知道整個集羣的狀況,好比relevant shard是如何分配的已經如何進行高效的查詢。網絡
Node node = nodeBuilder().clusterName("escluster2").client(true).node(); Client client = node.client();
使用NodeBuilder來建立一個node,使用clusterName()方法來指定咱們想要鏈接的集羣。爲了不本地節點關機後集羣將shard移動到本地節點,從而形成數據丟失的狀況,咱們須要client(true);異步
第二種方法:經過ImmutableSettings咱們設置了但願鏈接的集羣的名稱,接下來建立了一個TransportClient,經過創建InetSocketTransportAddress實例來提供Elasticsearch server所在的IP地址已經傳輸層的監聽端口(JAVA API 默認9300,並不是REST API的9200 )。elasticsearch
Settings settings = ImmutableSettings.settingsBuilder() .put("cluster.name", "escluster2").build(); TransportClient client = new TransportClient(settings); client.addTransportAddress(new InetSocketTransportAddress("127.0.0.1", 9300));
關於兩種方法的選擇,第一種方法:創建本地節點會須要一些時間,可是在執行一些操做的事情會節省不少時間,由於本地階段知道整個集羣中indice和shard狀況。 第二種方法:創建TransportClient是比較高效的,可是發送查詢信息以及數據就須要更多的資源,由於TransportClient不清楚整個集羣的拓撲,因此她不能直接將數據發送到目的節點,而是發送至一個初始化後的transport節點,ElasticSearch完成接下來的轉發。 注意::若是須要鏈接到不用網絡中的Elasticsearch集羣,就必須使用第二種方法(TransportClient對象)。函數
Client是與集羣進行通訊的關鍵,而prepareXXX等函數返回一個Binder(org.elasticsearch.action.get.GetRequestBuilder)對象來方便咱們設置參數。設置以後咱們可使用request()方法來保存這個request以便未來使用,或者使用execute()方法來當即執行一次查詢。
因爲Elasticsearch是天生異步的,執行execute後會在等到查詢結果以前就返回caller block,因此咱們能夠簡單的使用actionGet()方法來阻塞程序直到查詢結構返回。ui
GetResponse response = client .prepareGet("library", "book", "1") .setFields("title", "_source") .execute().actionGet();
public class ElasticSearchClient { private static Client client = null; private static Properties elasticsearch_properties = new Properties(); private static String PATH = ElasticSearchClient.class.getClassLoader().getResource("elasticsearch.properties").getPath(); private static String HOST = "elasticsearch.host"; private static String PORT = "elasticsearch.port"; public static void main(String[] args) { ElasticSearchClient client = new ElasticSearchClient(); client.init(); client.query(); client.close(); } public void init() { client = new TransportClient() .addTransportAddress(new InetSocketTransportAddress("YOURHOSTNAME",9300)); System.out.println("TransportClient: " + client.toString()); } public void query() { //匹配全部 //QueryBuilder queryBuilder = QueryBuilders.matchAllQuery(); //設置查詢條件 QueryBuilder queryBuilder = QueryBuilders.disMaxQuery() .add(QueryBuilders.termQuery("cmd-statistic", "http.avg5")); .add(QueryBuilders.prefixQuery("info-type", "statistic")); //System.out.println(queryBuilder.toString()); SearchResponse response = client.prepareSearch("INDEXNAME") .setQuery(queryBuilder).execute().actionGet(); for (SearchHit hit : response.getHits().getHits()) { System.out.println("---->>hit.getId(): " + hit.getId()); if (hit.getFields().containsKey("cmd-statistic")) { System.out.println("field.cmd-statistic: " + hit.getFields().get("cmd-statistic").getValue()); } System.out.println("cmd-statistic: " + hit.getSource().get("cmd-statistic")); } } public void close() { try { client.close(); } catch (Exception e) { e.printStackTrace(); }finally { try { client.close(); } catch (Exception e2) { e2.printStackTrace(); } } } }
SearchHit類表明了一個知足查詢條件的document,得到SearchHit後能夠經過便利來輸出每個hit的信息。addFiled()方法定義了須要返回的域。spa
參考:Mastering Elasticsearchcode