ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

elasticsearch的入门级CRUD

2021-08-03 23:01:41  阅读:257  来源: 互联网

标签:info name field CRUD 入门级 client elasticsearch user 文档


文章目录


前言

本文主要介绍如何使用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请求是什么样子。

标签:info,name,field,CRUD,入门级,client,elasticsearch,user,文档
来源: https://blog.csdn.net/weixin_45799833/article/details/119281817

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有