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:

  参看类文件说明

 

转载于:https://www.cnblogs.com/DennyZhao/p/9489616.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值