zoukankan      html  css  js  c++  java
  • Elasticsearch中JAVA API的使用

    1.Elasticsearch中Java API的简介

      Elasticsearch 的Java API 提供了非常便捷的方法来索引和查询数据等。 通过添加jar包,不需要编写HTTP层的代码就可以开始着手进行连接到Elasticsearch的工作。它提供了两种方法连接到Elasticsearch:创建一个本地节点并加入集群(cluster),或者利用传输(transport)。这两种方法都是利用一个Client(org.elasticsearch.client.Client)实例来实现的。

    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 )。

    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()方法来阻塞程序直到查询结构返回。

    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()方法定义了需要返回的域。

     
     

        

  • 相关阅读:
    POJ 1984
    剑指offer 7. 斐波那契数列 & leetcode 剑指 Offer 10- I. 斐波那契数列
    剑指offer 60. 把二叉树打印成多行
    数据库的范式(建表的原则)
    剑指offer 59. 按之字形顺序打印二叉树
    力扣142.环形链表II & 剑指offer 55. 链表中环的入口结点
    GET 和 POST 的区别
    理解Cookie和Session的区别及使用
    基本排序算法代码实现,以及使用场景推荐
    The Castle OpenJ_Bailian
  • 原文地址:https://www.cnblogs.com/shuaiwang/p/4686224.html
Copyright © 2011-2022 走看看