本文主要介绍如何使用java API 对Elasticsearch进行CRUD
Elasticsearch是一个基于Lucene 的分布式的搜索引擎,我们可以通过Rest接口进行操作。
//集群名称 Settings settings = Settings.builder().put("cluster.name", "my_app").build(); //客户端建立 TransportClient client = new PreBuiltTransportClient(settings) .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));//9300默认服务端口 //客户端发送请求,创建索引 client.admin().indices().prepareCreate("user").get(); //关闭客户端 client.close();
PUT user/info/1 { "id": 1, "name": "张三", "introduction": "He is Chinese" }
XContentBuilder builder = XContentFactory.jsonBuilder() .startObject() .startObject("info") .startObject("properties") .startObject("id") .field("type", "integer") .field("store", "yes") .endObject() .startObject("name") .field("type", "string") .field("store", "yes") .field("analyzer", "ik_smart")//ik_smart中文分词 .endObject() .startObject("introduction") .field("type", "string") .field("store", "yes") .field("analyzer", "ik_smart") .endObject() .endObject() .endObject() .endObject(); PutMappingRequest mapping = Requests.putMappingRequest("user") .type("info").source(builder); /** 当你使用postman等进行测试时,使用9200端口(web平台端口),而使用java api发送请求数据使用9300端口 以上的api操作对应的Rest请求为: curl -XPUT http://127.0.0.1:9200/user 请求体: { "mapping": { "info": { "properties": { "id": { "type": "intger", "store": true, "index":"not_analyzed" }, "name": { "type": "text", "store": true, "index":"analyzed", "analyzer":"ik_smart" }, "introduction": { "type": "text", "store": true, "index":"analyzed", "analyzer":"ik_smart" } } } } } */ //客户端发送请求 client.admin().indices().putMapping(mapping).get(); client.close();
创建文档
XContentBuilder builder = XContentFactory.jsonBuilder() .startObject() .field("id", 27) .field("name", "张三") .field("introduction", "他是中国人") .endObject(); Settings settings = Settings.builder().put("cluster.name", "my_app").build(); TransportClient client = new PreBuiltTransportClient(settings) .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300)); //发送客户端请求 client.prepareIndex() .setIndex("user") .setType("info") .setId("1") .setSource(builder) .get(); /** 以上的api操作对应的Rest请求为: curl -XPUT http://127.0.0.1:9200/user/info/1 请求体: { "id": 1, "name": "张三", "introduction": "He is Chinese" } */ client.close();
以上的方式看似很多,但是万变不离其宗,就是先将内容变成json字符串形式,之后再放入请求体内发送。
查询文档
GetResponse responseGet = client.prepareGet("user", "info", "1").get();
相应Rest请求:Get user/info/1
删除文档
DeleteResponse responseDel = client.prepareDelete("user", "info", "1").get();
相应Rest请求:DELETE user/info/1
更新文档
UpdateRequest updateRequest = new UpdateRequest(); updateRequest.index("user"); updateRequest.type("info"); updateRequest.id("1"); updateRequest.doc(XContentFactory.jsonBuilder() .startObject() .field("name", "李四") .endObject()); client.update(updateRequest).get(); client.close();
相应Rest请求:
POST /user/_update/1 { "info": { "name": "李四" } }
批处理
BulkRequestBuilder bulkRequestBuilder = client.prepareBulk(); Map<String,Object> map = new HashMap<>(); map.put("name","王五"); map.put("introduction","he name is wangwu"); bulkRequestBuilder.add(client.prepareIndex("user","info","7").setSource(map)); map.clear(); map.put("name","赵六"); map.put("introduction","he name is zhaoliu"); bulkRequestBuilder.add(client.prepareIndex("user","info","8").setSource(map)); bulkRequestBuilder.get(); client.close();
相应Rest请求:
POST _bulk { "index" : { "user" : "info", "_id": 7} } {"name":"王五","introduction":"he name is wangwu"} { "index" : { "user" : "info", "_id": 8 }} {"name":"赵六","introduction":"he name is zhaoliu"}
>>elasticsearch官方其实对自己的产品有非常好的对待菜鸟的教程>>
关于elastic的api非常多,但只要理解了核心概念,我们就可以借助文档轻松入门运用。本文只是简单的去说明java各个api对应的Rest请求是什么样子。