• ES(ElasticSearch)文档的表现形式以及增删改查


     1、 ES中的文档 

      ES是面向文档(document oriented)的,这意味着它可以存储整个对象或文档(document)。然而它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索。在ES中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。

      ES使用Javascript对象符号(JavaScript Object Notation),也就是JSON,作为文档序列化格式。JSON现在已经被大多语言所支持,而且已经成为NoSQL领域的标准格式。

      

      _index:索引库,类似于关系型数据库里的“数据库”—它是我们存储和索引关联数据的地方。

      _type:类型,类似于关系型数据库中。可以是大写或小写,不能包含下划线或逗号。我们将使用 employee 做为类型名。

      _id:与 _index  和 _type  组合时,就可以在ELasticsearch中唯一标识(类似于主键)一个文档。当创建一个文档,你可以自定义 _id  ,也可以让Elasticsearch帮你自动生成。

      另外还包括:

      _uid:文档唯一标识(_type#_id)

      _source:文档原始数据

      _all:所有字段的连接字符串

    2、文档的增删改

      我们以员工对象为例,我们首先要做的是存储员工数据,每个文档代表一个员工。在ES中存储数据的行为就叫做索引(indexing),文档归属于一种类型(type),而这些类型存在于索引(index)中,我们可以简单的对比传统数据库和ES的对应关系:

      关系数据库(MYSQL) -> 数据库DB-> 表TABLE-> 行ROW-> 列Column

      Elasticsearch -> 索引库Indices (数据库)-> 类型Types(表) -> 文档Documents(行) -> 字段Fields(列)

      ES集群可以包含多个索引(indices)(数据库),每一个索引库中可以包含多个类型(types)(表),每一个类型包含多个文档(documents)(行),然后每个文档包含多个字段(Fields)(列)。

     创建索引文档

        ①使用自己的ID创建:

        PUT{index}/{type}/{id}

        {

          "field": "value",

          ...

        }

        ②ES内置ID创建:

        POST{index}/{type}/

        {

          "field": "value",

          ...

        }

        ①②ES响应内容:

        {

          "_index": "wang",

          "_type": "employee",

          "_id": xxxxxx,

          "_version": 1, //文档版本号

          "created": true //是否新增

        }

        ③ 获取指定ID的文档

          GET wang/employee/123?pretty

        ③返回的内容:

         {

          "_index" : "wang",

          "_type" : "employee",

          "_id" : "123",

          "_version" : 1,

          "found" : true,

          "_source" : {

              "email": "sss@qq.cn",

              "fullName": "张三",

              ...

              "joine_date": "2016-06-01"

          }

         } 

    返回文档的部分字段:

        GET默认返回整个文档,通过GET /wang/employee/123?_source=fullName,email

    只返回文档内容,不要元数据:

        GET wang/employee/123/_source

      

    修改文档

      更新整个文档

      同PUT {index}/{type}/{id}

      在响应中,我们可以看到Elasticsearch _version  增加了。

      {

         ...

        "_version" : 2,

        "created": false

      }

      created  标识为 false  因为同索引、同类型下已经存在同ID的文档。

      在内部,Elasticsearch已经标记旧文档为删除并添加了一个完整的新文档。旧版本文档不会立即消失,但你也不能去访问它。Elasticsearch会在你继续索引更多数据时清理被删除的文档。

      局部更新文档

      接受一个局部文档参数 doc,它会合并到现有文档中,对象合并在一起,存在的标量字段被覆盖,新字段被添加。

      POST wang/employee/123/_update

      {

    doc{

    "email" : "sss@qq.cn",

    "salary": 1000

    }

      }

      email会被更新覆盖,salary会新增。

      这个API 似乎 允许你修改文档的局部,但事实上Elasticsearch

      遵循与之前所说完全相同的过程,这个过程如下:

        1. 从旧文档中检索JSON

        2. 修改它

        3. 删除旧文档

        4. 索引新文档

    脚本更新文档

      也可以通过使用简单的脚本来进行。这个例子使用一个脚本将age5

      POST wang/emploee/123/_update

      {

        "script" : "ctx._source.age += 5"

      }

      在上面的例子中, ctx._source指向当前被更新的文档。

      注意,目前的更新操作只能一次应用在一个文档上。

     

    删除文档

      DELETE {index}/{type}/{id}

      存在文档的返回:

      {

        "found" : true,

        "_index" : "wang",

        "_type" : "blog",

        "_id" : "123",

        "_version" : 3

      }

      不存在的返回:

      {

        "found" : false,

        "_index" : "wang",

        "_type" : "blog",

        "_id" : "123",

        "_version" : 4

      }

    注意:尽管文档不存在,但_version依旧增加了。这是内部记录的一部分,它确保在多节点间不同操作可以有正确的顺序。

    批量操bulk  API

        使用单一请求来实现多个文档的createindexupdate delete

        Bulk请求体格式:

        { action: { metadata }}

        { request body }

        { action: { metadata }}

        { request body }

        每行必须以 " "  符号结尾,包括最后一行。这些都是作为每行有效的分离而做的标记。

        create当文档不存在时创建之。

        index创建新文档或替换已有文档。

        update局部更新文档。

        delete删除一个文档。

        例如:

        POST _bulk

        { "delete": { "_index": "wang", "_type": "employee", "_id": "123" }}

        { "create": { "_index": "wang", "_type": "blog", "_id": "123" }}

        { "title": "我下班了" }

        { "index": { "_index": "wang", "_type": "blog" }}

        { "title": "我真的下班了" }

    注意:delete后不需要请求体,最后一行要有回车。

    3、文档的简单查询

    3.1   通过文档ID获取

        略

        GET /test/employee/1

    3.2   批量获取

        mget  API参数是一个 docs数组,数组的每个节点定义一个文档的 _index  _type  _id  元数据。如果你只想检索一个或几个确定的字段,也可以定义一个 _source    参数:

        方式1GET _mget

        {

          "docs" : [

    {

    "_index" : "itsource",

    "_type" : "blog",

    "_id" : 2

    },

    {

    "_index" : "itsource",

    "_type" : "employee",

    "_id" : 1,

    "_source": "email,age"

    }

          ]

        }

      方式2同一个索引库的同一个类型下

      GET itsource/blog/_mget

      {

        "ids" : [ "2", "1" ]

      }

    3.3  空搜索-查询所有

      没有指定任何的查询条件,只返回集群索引中的所有文档:

       GET test/employee/_search 查询所有的employee

      GET _search

    3.4   分页搜索

      和SQL使用 LIMIT from,size关键字返回只有一页的结果一样,Elasticsearch接受 from  size  参数:

        size  : 每页条数,默认 10

        from  : 跳过开始的结果数,默认 0

      如果你想每页显示5个结果,页码从13,那请求如下:

        GET crm/emp/_search?size=5 #查询5

        GET crm/emp/_search?size=5&from=5 #查询6-10

        GET crm/emp/_search?size=5&from=10 #查询11-15

    3.5   查询字符串搜索

      一个搜索可以用纯粹的uri来执行查询。在这种模式下使用搜索,并不是所有的选项都是暴露的。它可以方便快速进行 curl 测试。

      Sql查询:

      查询年龄为25岁的员工

        GET itsource/employee/_search?q=age:25

      如果q后的参数不指定Fileds则默认查询_all字段(隐含的文档所有字段的连接内容)

      类似的查询语法参考lucene,如:

      组合查询:

       +表示并且,多个条件做且运算====>MUST

       空格表示或,多个条件做或运算====>SHOULD

       -表示非,多个条件做非运算====>MUST_NOT

     

      +name:john +tweet:mary

      +name:(mary john) +date:>2014-09-10 +(aggregations geo)

      age[20 TO 30] 

      Select name,age from t_emp where age between and 10 order by age desc;

    创建索引文档

    使用自己的ID创建:

    PUT{index}/{type}/{id}

    {

      "field": "value",

      ...

    }

    ES内置ID创建:

    POST{index}/{type}/

    {

      "field": "value",

      ...

    }

    ①②ES响应内容:

    {

    "_index": "itsource",

    "_type": "employee",

    "_id": xxxxxx,

    "_version": 1, //文档版本号

    "created": true //是否新增

    }

     

    获取指定ID的文档

    GET itsource/employee/123?pretty

    ③返回的内容:

    {

    "_index" : "itsource",

    "_type" : "employee",

    "_id" : "123",

    "_version" : 1,

    "found" : true,

    "_source" : {

       "email": "wb@itsource.cn",

       "fullName": "文兵",

       ...

       "joine_date": "2016-06-01"

    }

    }

    返回文档的部分字段:

    GET默认返回整个文档,通过GET /itsource/employee/123?_source=fullName,email

    只返回文档内容,不要元数据:

    GET itsource/employee/123/_source

        只检查文档是否存在(查询头信息)

    curl -i -X HEAD http://localhost:9200/itsource/employee/123

    修改文档

    更新整个文档

    PUT {index}/{type}/{id}

    在响应中,我们可以看到Elasticsearch _version  增加了。

    {

    ...

    "_version" : 2,

    "created": false

    }

    created  标识为 false  因为同索引、同类型下已经存在同ID的文档。

    在内部,Elasticsearch已经标记旧文档为删除并添加了一个完整的新文档。旧版本文档不会立即消失,但你也不能去访问它。Elasticsearch会在你继续索引更多数据时清理被删除的文档。

    局部更新文档

    接受一个局部文档参数 doc,它会合并到现有文档中,对象合并在一起,存在的标量字段被覆盖,新字段被添加。

    POST itsource/employee/123/_update

    {

    doc{

    "email" : "wb@itsource.cn",

    "salary": 1000

    }

    }

    email会被更新覆盖,salary会新增。

    这个API 似乎 允许你修改文档的局部,但事实上Elasticsearch

    遵循与之前所说完全相同的过程,这个过程如下:

    1. 从旧文档中检索JSON

    2. 修改它

    3. 删除旧文档

    4. 索引新文档

    脚本更新文档

    也可以通过使用简单的脚本来进行。这个例子使用一个脚本将age5

    POST itsource/emploee/123/_update

    {

    "script" : "ctx._source.age += 5"

    }

    在上面的例子中, ctx._source指向当前被更新的文档。

    注意,目前的更新操作只能一次应用在一个文档上。

    删除文档

    DELETE {index}/{type}/{id}

    存在文档的返回:

    {

    "found" : true,

    "_index" : "website",

    "_type" : "blog",

    "_id" : "123",

    "_version" : 3

    }

    不存在的返回:

    {

    "found" : false,

    "_index" : "website",

    "_type" : "blog",

    "_id" : "123",

    "_version" : 4

    }

    注意:尽管文档不存在,但_version依旧增加了。这是内部记录的一部分,它确保在多节点间不同操作可以有正确的顺序。

    批量操bulk  API

    使用单一请求来实现多个文档的createindexupdate delete

    Bulk请求体格式:

    { action: { metadata }}

    { request body }

    { action: { metadata }}

    { request body }

    每行必须以 " "  符号结尾,包括最后一行。这些都是作为每行有效的分离而做的标记。

    create当文档不存在时创建之。

    index创建新文档或替换已有文档。

    update局部更新文档。

    delete删除一个文档。

    例如:

    POST _bulk

    { "delete": { "_index": "itsource", "_type": "employee", "_id": "123" }}

    { "create": { "_index": "itsource", "_type": "blog", "_id": "123" }}

    { "title": "我发布的博客" }

    { "index": { "_index": "itsource", "_type": "blog" }}

    { "title": "我的第二博客" }

     

    注意:delete后不需要请求体,最后一行要有回车

  • 相关阅读:
    饿汉模式单例模板
    QT高级01----自定义日志工具
    QT基础01----添加应用程序图标
    QML博客转载
    QML---自定义滚动条
    Mycat的做分库正确步骤
    Spring Cloud sentinel使用总结
    SpringCloud之Gateway原理解析(二)--调用过程
    SpringCloud之Gateway原理解析(一)--准备
    SpringCloud之Feign注解@EnableFeignClients
  • 原文地址:https://www.cnblogs.com/wanghj-15/p/11307999.html
Copyright © 2020-2023  润新知