elasticsearch的入门级CRUD
2021/8/3 23:06:33
本文主要是介绍elasticsearch的入门级CRUD,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
文章目录
- 前言
- 一、Elasticsearch是什么?
- 二、角色
- 三、使用步骤
- 1.创建索引 index
- 2.建立映射 mapping(文档结构)
- 3.文档 document 的 CRUD
- 总结
前言
本文主要介绍如何使用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请求是什么样子。
这篇关于elasticsearch的入门级CRUD的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-07-05feign默认connecttimeout和readtimeout是多少-icode9专业技术文章分享
- 2024-07-05idea控制台,日志太多,导致部分想看得日志被刷走 搜不到-icode9专业技术文章分享
- 2024-07-05The server selected protocol version Tls10 is not accepted by client preferences [TLs12]-icode9专业技术文章分享
- 2024-07-05怎么清理项目缓存-icode9专业技术文章分享
- 2024-07-04安装 Eyoucms详细图文教程-icode9专业技术文章分享
- 2024-07-04ueditor 复制文章时,图片的链接是一个下载图片地址,该如何处理?-icode9专业技术文章分享
- 2024-07-04怎样判断host有没有对wordpress有缓存呢-icode9专业技术文章分享
- 2024-07-04具有编译功能的系统make后,无法ssh连接-icode9专业技术文章分享
- 2024-07-04make后如何升级ssh-icode9专业技术文章分享
- 2024-07-03微信支付提示下单账户与支付账户不一致-icode9专业技术文章分享