• Elasticsearch7教程(1) 创建文档


    版本约定

    本系列博客ES版本如下:

    • Elasticsearch 7.17.X
    • Spring Data Elasticsearch 4.4.X

    Elasticsearch下载地址
    Spring Data Elasticsearch 下载地址

    创建文档API

    ES创建文档可以通过如下4种API,它们看着类似,功能上少许不同。

    • PUT //_doc/<_id>
    • POST //_doc/
    • PUT //_create/<_id>
    • POST //_create/<_id>

    命令中表示一个索引(index)或者数据流(data stream)
    命令中_doc是固定写法,无需深究
    命令中_create表示创建一个新的文档,如果指定的<_id>文档已经存在,则返回失败
    注意:数据流的情况比较复杂,学习先以索引为主,熟练后再考虑数据流场景

    命令含义id已经存在数据流
    PUT //_doc/<_id>创建或覆盖指定id的文档覆盖,相当于先删后创建不支持
    POST //_doc/创建自动生成id的文档X支持
    PUT //_create/<_id>创建指定id的文档返回失败支持
    POST //_create/<_id>创建指定id的文档返回失败支持

    1 PUT //_doc/<_id>

    创建或覆盖指定id的文档

    GET pigg_test/_search
    
    PUT pigg_test/_doc/1
    {
      "name": "亚瑟王",
      "age": 33
    }
    
    PUT pigg_test/_doc/1
    {
      "name": "马超",
      "sex": 1
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    运行结果如下,可看出文档被覆盖了
    在这里插入图片描述

    2 POST //_doc/

    用POST插入一个文档,不指定ID,会给文档自动生成ID

    POST pigg_test/_doc
    {
      "name": "吕布"
    }
    
    • 1
    • 2
    • 3
    • 4

    运行结果如下,可看出新创建的文档的ID是自生成的一串乱码
    在这里插入图片描述

    3 PUT //_create/<_id> & POST //_create/<_id>

    这2个命令指定/_create/<_id>,说明当id已经存在时,会返回错误。
    在这里插入图片描述

    Java API

    1 Elasticsearch Java API

    在用ES原生Java API创建文档时,可以设置opType(DocWriteRequest.OpType.CREATE)来指定是Create文档的操作。

    这个opType默认值是OpType.INDEX。

    IndexRequest request = new IndexRequest("pigg_test")
            .id("1")
            .source("name", "亚瑟")
            .opType(DocWriteRequest.OpType.CREATE);//指定是create
    
    try {
        IndexResponse response = client.index(request, RequestOptions.DEFAULT);
    } catch(ElasticsearchException e) {
        if (e.status() == RestStatus.CONFLICT) {
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    2 Spring Data Elasticsearch

    当使用Spring Data Elasticsearch时,可以使用CrudRepository接口里的方法也可以使用DocumentOperations接口里的方法。

    1 CrudRepository接口

    @NoRepositoryBean
    public interface CrudRepository<T, ID> extends Repository<T, ID> {
        <S extends T> S save(S entity);
    
        <S extends T> Iterable<S> saveAll(Iterable<S> entities);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2 DocumentOperations接口

    public interface DocumentOperations {
        <T> T save(T entity);
    
        <T> T save(T entity, IndexCoordinates index);
    
        <T> Iterable<T> save(Iterable<T> entities);
    
        <T> Iterable<T> save(Iterable<T> entities, IndexCoordinates index);
    
        <T> Iterable<T> save(T... entities);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • 相关阅读:
    你没见过的分库分表原理解析和解决方案(二)
    MyBatis在循环内查询序列值重复解决方法
    面向对象设计模式02.抽象工厂模式&责任链模式&观察者模式
    python使用LRU缓存算法,利用带缓存的动态规划法求解斐波那契数列
    Linux系统编程 102 alarm函数
    【CSDN】5周年创作纪念日,不忘初心,砥砺前行。
    缓冲区的管理
    Multihead Attention - 多头注意力
    R_Python_C_Rust效率对比(蒙特卡洛方法)
    Go :验证编译器是否强制执行了复制参数要求(附完整源码)
  • 原文地址:https://blog.csdn.net/winterking3/article/details/126461276