zoukankan      html  css  js  c++  java
  • elasticsearch-java

    • elastissearch的JAVA客户端

    官网  java api文档  https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/client.html

        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
        </dependency>

    目前有4种:

    TransportClient、JestClient、RestClient(一种网络请求,非集群中的一员)

    NodeClient(集群中一员,但不存储数据,可以查看集群的状况)

    这几个都需要引入对应的Client,同时要引入Netty,因为是基于netty进行网络通信。以TransportClient为例:

        <dependency>
                <groupId>org.elasticsearch.client</groupId>
                <artifactId>transport</artifactId>
            <version>6.2.3</version>
        </dependency>
    <dependency>
      <groupId>io.netty</groupId>
      <artifactId>netty-buffer</artifactId>
      <version>4.1.28.Final</version>
    </dependency>

    TransportClient 连接方式有3种,具体参见以下官网连接的例子

    https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/transport-client.html

    代码测试连接:

        @RequestMapping("/connTest")
        public String connectEs() {
            String result = "failure";
            Settings settings = Settings.builder()
                                        .put("cluster.name", "es_test")
    .put("client.transport.ping_timeout", "3s")                     //default 5s .put(
    "client.transport.sniff", true) //嗅探会自动发现集成的其它ip,只需要设置一个master就可以通过嗅味带出其它的 .build(); TransportClient client = new PreBuiltTransportClient(settings); try { client.addTransportAddress(new TransportAddress(InetAddress.getByName("192.168.201.105"), 9300)); List<DiscoveryNode> nodeList = client.connectedNodes(); if(nodeList != null && nodeList.size() > 0) { result = "success"; } client.close(); } catch (UnknownHostException e) { System.out.println(e); result = "failure"; } return result; }

    一般client被设置为单例模式。

    查询:

    prepareGet

    GET

            GetRequestBuilder reqBuilder = transportClient.prepareGet("ik_test", "type1", "kI1COGUB9PG2P1x3QBda");
            Map<String, Object> mapResult = reqBuilder.get().getSource()

    UPDATE

            XContentBuilder source = XContentFactory.jsonBuilder()
                    .startObject()
                    .field("name", "8月金融数据政策寒冬")
                    .field("title", "中国人民银行报道")
                    .field("content", "社会融资坏账率明显增多")
                    .endObject();
            UpdateResponse updateResp = transportClient.prepareUpdate("ik_test", "type1", "kI1COGUB9PG2P1x3QBda").setDoc(source).get();
            Result result = updateResp.getResult();

    IndexRequest :source

    注意 setSource(object...) 是 传入的 key,value,key,value,key,value.....

            // key value ...
            transportClient.prepareIndex("ik_test", "type1").setSource("title","BBC报道","name", "the blue planet", "content", "蓝色星球讲述海洋天空大地,以及人类环境对整个地球的影响").get();
            // json 
            IkTestVO vo2 = new IkTestVO("VOA报道", "it's a channel to learn english", "一家做voa报道学习英文用");
            transportClient.prepareIndex("ik_test", "type1").setSource(mapper.writeValueAsString(vo2), XContentType.JSON).get();
            //map
            Map<String, Object> vo3 = new HashMap<String, Object>();
            vo3.put("title", "美国之音");
            vo3.put("name", "美国之音广播电台");
            vo3.put("content", "讲述美国文化生活");
            transportClient.prepareIndex("ik_test", "type1").setSource(vo3).get();
            //XcontentBuilder
            XContentBuilder vo4 = XContentFactory.jsonBuilder()
                    .startObject()
                    .field("name", "9月金融数据政策寒冬")
                    .field("title", "中国证监会")
                    .field("content", "对于明星涉嫌非法股票套取交易的处罚规定")
                    .endObject();
            transportClient.prepareIndex("ik_test", "type1").setSource(vo4).get();

     DELETE

    transportClient.prepareDelete().setIndex("ik_test").setId("DTbzVWUBIcwRDuO5OPIA").setType("type1").get();

    BULK

            BulkRequestBuilder reqBuilder = transportClient.prepareBulk();
            // IndexRequest
            IndexRequest indexReq = new IndexRequest("ik_test","type1");
            IkTestVO vo = new IkTestVO("ABC报道", "the blue planet", "蓝色星球讲述海洋天空大地,以及人类环境对整个地球的影响");
            indexReq.source(mapper.writeValueAsString(vo), XContentType.JSON);
            
            // DeleteRequest
            DeleteRequest delReq = new DeleteRequest("ik_test","type1","DTbzVWUBIcwRDuO5OPIA");
            
            // UpdateRequest
            UpdateRequest updReq = new UpdateRequest("ik_test","type1", "DzYJVmUBIcwRDuO5U_If");
            Map<String, Object> vo3 = new HashMap<String, Object>();
            vo3.put("title", "美国之音2");
            vo3.put("name", "美国之音广播电台2");
            vo3.put("content", "讲述美国文化生活2");
            updReq.doc(vo3);
            
            reqBuilder.add(indexReq);
            reqBuilder.add(delReq);
            reqBuilder.add(updReq);
            BulkResponse bulkResp = reqBuilder.get();

     prepareSearch

        @Test
        public void testSearch() {
            SearchResponse search = transportClient.prepareSearch("ik_test")
                                        .setQuery(QueryBuilders.matchQuery("title", "美国"))
                                        .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
                                        .setFrom(0)
                                        .setSize(20)
                                        .get();
            SearchHits  hits = search.getHits();
            long count = hits.getTotalHits();
            System.out.println("count: " + count);
            if(count > 0) {
                for(SearchHit hit : hits) {
                    System.out.println(hit.getSourceAsString());
                }
            }
        }

     结果:

    count: 1
    {"name":"美国之音广播电台2","title":"美国之音2","content":"讲述美国文化生活2"}

     SearchType:

    es的四种查询类型SearchType:

    • QUERY_AND_FETCH  (由主节点分发查询,然后再汇总查询。 仅查一次,数据量和排序问题)@deprecated
    • QUERY_THEN_FETCH(主节点分发查询,汇总分查询的id,然后再查询数据, 查两次。同样牵扯数据量和排序) 默认形式DEFAULT
    • DFS_QUERY_THEN_FETCH (解决排序和数据量,但是运行效率差)

    QueryBuilders:

      参看类文件说明

  • 相关阅读:
    计算小于12的阶乘
    ubuntu下gvim启动出现gtk warning Invalid input string
    UBUNTU基础知识
    Ubuntu下创建软链接
    linux命令行介绍及使用(二)
    Ubuntu问题sudo: /etc/sudoers is mode 0640should be 0440的解决方法
    安装mp3插件
    Ubuntu下GTK的安装
    linux命令行介绍及使用(三)
    VB.NET中用GDI+画饼图
  • 原文地址:https://www.cnblogs.com/DennyZhao/p/9489616.html
Copyright © 2011-2022 走看看