elasticsearch的入门级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请求是什么样子。

上一篇:SPA项目开发之CRUD+表单验证


下一篇:基于Hibernate实现CRUD