前言
本文主要介绍如何使用java API 对Elasticsearch进行CRUD
一、Elasticsearch是什么?
Elasticsearch是一个基于Lucene 的分布式的搜索引擎,我们可以通过Rest接口进行操作。
二、角色
- 索引 index:对标SQL数据库
- 类型 type:对标SQL数据表
- 字段 field:elasticsearch数据最小粒度,对标SQL字段
- 文档 document:对标SQL数据表中的一条记录
- 映射 mapping:文档结构,比如文档有name字段其类型为text(此类型不是上面那个type类型)
三、使用步骤
1.创建索引 index
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.admin().indices().prepareCreate("user").get();
client.close();
2.建立映射 mapping(文档结构)
- elasticsearch支持通过如下的Rest请求即直接通过新建文档的方式,由elasticsearch自动猜测并生成mapping
PUT user/info/1 { "id": 1, "name": "张三", "introduction": "He is Chinese" } - 另一种方式是手动建立mapping,首先我们使用elasticsearch内置的帮助类 XContentFactory.jsonBuilder()先建立一个json文档
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")
.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);
client.admin().indices().putMapping(mapping).get();
client.close();
- id字段的数据类型为integer,那么elasticsearch还有那些数据类型?
- text、keyword、date 、 date_nanos、byte、 short、 integer、 long、boolean、float、double、half_float
3.文档 document 的 CRUD
创建文档
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();
client.close();
- 创建文档的方式有很多,分别如下:
- 1.手动编写json字符串方式
- 2.Map方式
- 3.序列化方式
- 4.借助内置的XContentBuilder类方式
以上的方式看似很多,但是万变不离其宗,就是先将内容变成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": "李四"
}
}
批处理
- 若有大量相似数据的相同操作,可采用批处理的方式提高效率
- 批量添加document
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请求是什么样子。
|