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

相关文章
相关标签/搜索