文章目录
前言
本文主要介绍如何使用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));//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")//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();
- 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();
/**
以上的api操作对应的Rest请求为:
curl -XPUT http://127.0.0.1:9200/user/info/1
请求体:
{
"id": 1,
"name": "张三",
"introduction": "He is Chinese"
}
*/
client.close();
- 创建文档的方式有很多,分别如下:
- 1.手动编写json字符串方式
- 2.Map方式
- 3.序列化方式
- 4.借助内置的XContentBuilder类方式
以上的方式看似很多,但是万变不离其宗,就是先将内容变成json字符串形式,之后再放入请求体内发送。
查询文档
- 根据id查询
GetResponse responseGet = client.prepareGet("user", "info", "1").get();
相应Rest请求:Get user/info/1
- 更多相关api可查文档
删除文档
- 根据id删除
DeleteResponse responseDel = client.prepareDelete("user", "info", "1").get();
相应Rest请求:DELETE user/info/1
- 更多相关api可查文档
更新文档
- 根据id更新,并且仅修改部分数据
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": "李四"
}
}
- 更多相关api可查文档
批处理
- 若有大量相似数据的相同操作,可采用批处理的方式提高效率
- 批量添加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"}
- 更多相关api可查文档
总结
>>elasticsearch官方其实对自己的产品有非常好的对待菜鸟的教程>>
关于elastic的api非常多,但只要理解了核心概念,我们就可以借助文档轻松入门运用。本文只是简单的去说明java各个api对应的Rest请求是什么样子。