- 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:
参看类文件说明