美文网首页
《ElasticSearch权威指南》实践 - 数据

《ElasticSearch权威指南》实践 - 数据

作者: SlowGO | 来源:发表于2019-07-09 16:06 被阅读0次

    当前使用的版本为 7.2

    索引一个文档

    文档通过 _index_type_id 唯一确定,_id 可以自己指定,也可以自动生成。

    自己指定id:

    curl -X PUT "localhost:9200/website/blog/123?pretty" -H 'Content-Type: application/json' -d'
    {
      "title": "My first blog entry", 
      "text": "Just trying this out...",     
      "date": "2014/01/01"
    }
    '
    

    自增ID:

    curl -X POST "localhost:9200/website/blog?pretty" -H 'Content-Type: application/json' -d'
    {
      "title": "My first blog entry", 
      "text": "Just trying this out...",     
      "date": "2014/01/01"
    }
    '
    

    没有指定ID时需要使用 POST

    获取文档

    查询所有文档,验证上面的添加结果:

    curl -X GET "localhost:9200/website/blog/_search?pretty"
    

    查看某个文档:

    curl -X GET "localhost:9200/website/blog/123?pretty"
    

    pretty 会让es美化输出,以格式化JSON结构显示结果,便于阅读,但 _source 部分不会被美化,与输入时的形式一致。

    默认返回文档的所有字段,可以指定只返回自己感兴趣的部分:

    curl -X GET "localhost:9200/website/blog/123?_source=title,text&pretty"
    

    返回结果:

    {
      "_index" : "website",
      "_type" : "blog",
      "_id" : "123",
      "_version" : 1,
      "_seq_no" : 0,
      "_primary_term" : 1,
      "found" : true,
      "_source" : {
        "text" : "Just trying this out...",
        "title" : "My first blog entry"
      }
    }
    

    也可以只看_source部分:

    curl -X GET "localhost:9200/website/blog/123/_source?pretty"
    

    检查文档是否存在

    curl -i -X HEAD "localhost:9200/website/_doc/123"
    

    如果存在,返回:

    HTTP/1.1 200 OK
    content-type: application/json; charset=UTF-8
    content-length: 219
    

    如果不存在,会返回 404

    更新文档

    ES中文档是不可变的,如果需要更新已经存在的文档,需要重建索引,或者替换它。

    curl -X PUT "localhost:9200/website/blog/123?pretty" -H 'Content-Type: application/json' -d'
    {
      "title": "My first blog entry", 
      "text": "I am starting to get the hang of this...",     
      "date": "2019/01/01"
    }
    '
    

    返回结果:

    {
      "_index" : "website",
      "_type" : "blog",
      "_id" : "123",
      "_version" : 2,
      "result" : "updated",
      ...
    }
    

    可以看到_version增加了,result为已更新。

    ES会把旧文档标记为”删除“,并添加一个完整的新文档。旧文档不会立即消失,但也不能访问,会在数据增加时进行清理。

    对于文档局部更新,过程也一样:

    1. 从旧文档中检索JSON
    2. 修改内容
    3. 删除旧文档
    4. 索引新文档

    删除文档

    curl -X DELETE "localhost:9200/website/blog/123?pretty"
    

    返回结果:

    {
      "_index" : "website",
      "_type" : "blog",
      "_id" : "123",
      "_version" : 3,
      "result" : "deleted",
      "_shards" : {
        "total" : 2,
        "successful" : 1,
        "failed" : 0
      },
      "_seq_no" : 3,
      "_primary_term" : 1
    }
    

    可以看到_version增加了。

    如果文档不存在,会返回not_found

     curl -X DELETE "localhost:9200/website/blog/123456?pretty"
    
    # 返回结果
    {
      "_index" : "website",
      "_type" : "blog",
      "_id" : "123456",
      "_version" : 1,
      "result" : "not_found",
      "_shards" : {
        "total" : 2,
        "successful" : 1,
        "failed" : 0
      },
      "_seq_no" : 5,
      "_primary_term" : 1
    }
    
    

    并发控制

    如果多个请求同时修改文档,会有并发问题,es中的文档有版本号的概念,可以通过版本号实现乐观锁机制。

    在 7.0 之前可以使用 _version 版本号,在之后,需要使用 _seq_no 顺序号。

    创建一个新的文档:

    curl -X PUT "localhost:9200/website/blog/10/_create?pretty" -H 'Content-Type: application/json' -d'
    {
      "title": "My first blog entry", 
      "text": "just trying this out..."
    }
    '
    

    返回结果:

    {
      "_index" : "website",
      "_type" : "blog",
      "_id" : "10",
      "_version" : 1,
      "result" : "created",
      "_shards" : {
        "total" : 2,
        "successful" : 1,
        "failed" : 0
      },
      "_seq_no" : 7,
      "_primary_term" : 1
    }
    

    查看文档:

    curl -X GET "localhost:9200/website/blog/10?pretty"
    

    返回文档:

    {
      "_index" : "website",
      "_type" : "blog",
      "_id" : "10",
      "_version" : 1,
      "_seq_no" : 7,
      "_primary_term" : 1,
      "found" : true,
      "_source" : {
        "title" : "My first blog entry",
        "text" : "just trying this out..."
      }
    }
    

    需要关注 _seq_no_primary_term,现在修改文档,并指定这两项:

    curl -X PUT "localhost:9200/website/blog/10?if_seq_no=7&if_primary_term=1&pretty" -H 'Content-Type: application/json' -d'
    {
      "title": "My first blog entry", 
      "text": "update ..."
    }
    '
    

    返回结果:

    {
      "_index" : "website",
      "_type" : "blog",
      "_id" : "10",
      "_version" : 2,
      "result" : "updated",
      "_shards" : {
        "total" : 2,
        "successful" : 1,
        "failed" : 0
      },
      "_seq_no" : 8,
      "_primary_term" : 1
    }
    

    "result" : "updated" 更新成功,_version_seq_no 都增加了。

    如果指定的顺序号与当前文档不符,则会报错,例如再执行一遍上面的修改,会报错:

    ...
    {
      "error" : {
        "root_cause" : [
          {
            "type" : "version_conflict_engine_exception",
            "reason" : "[10]: version conflict, required seqNo [7], primary term [1]. current document has seqNo [8] and primary term [1]",
            ...
          }
        ],
        ...
      },
      "status" : 409
    }
    
    

    相关文章

      网友评论

          本文标题:《ElasticSearch权威指南》实践 - 数据

          本文链接:https://www.haomeiwen.com/subject/nfzxkctx.html