Elasticsearch中JAVA API的使用

1.Elasticsearch中Java API的簡介

  Elasticsearch 的Java API 提供了很是便捷的方法來索引和查詢數據等。 經過添加jar包,不須要編寫HTTP層的代碼就能夠開始着手進行鏈接到Elasticsearch的工做。它提供了兩種方法鏈接到Elasticsearch:建立一個本地節點並加入集羣(cluster),或者利用傳輸(transport)。這兩種方法都是利用一個Client(org.elasticsearch.client.Client)實例來實現的。node

 

2.兩種鏈接方法的說明和比較

  使用第一種方法的思想,是講建立的本地節點做爲集羣的一部分,這樣這個建立的本地節點就能夠是知道整個集羣的狀況,好比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對象)。函數

 

3.Client的查詢設置

  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();

 

4.query舉例

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

相關文章
相關標籤/搜索