ES入门之CURD-1

  • Post author:
  • Post category:其他


基本名词解释:
> Index
  相似于mysql数据库中的database
> Type
  相似于mysql数据库中的table表,es中能够在Index中创建type(table),经过mapping进行映射。
> Document
  因为es存储的数据是文档型的,一条数据对应一篇文档即至关于mysql数据库中的一行数据row,一个文档中能够有多个字段也就是mysql数据库一行能够有多列。
> Field
  es中一个文档中对应的多个列与mysql数据库中每一列对应
> Mapping
  能够理解为mysql或者solr中对应的schema,只不过有些时候es中的mapping增长了动态识别功能,感觉很强大的样子,其实实际生产环境上不建议使用,最好仍是开始制定好了对应的schema为主。
> Indexed
  就是名义上的创建索引。mysql中通常会对常用的列增长相应的索引用于提升查询速度,而在es中默认都是会加上索引的,除非你特殊制定不创建索引只是进行存储用于展现,这个须要看你具体的需求和业务进行设定了。
> Query DSL
  相似于mysql的sql语句,只不过在es中是使用的json格式的查询语句

ES的CURD

1. ES的查询:NoSql形式的文档存储
 - 结构化查询
 - 相关性排序

2. 数据存储,文档的3个必须的元数据信息(3个元数据组合确定唯一的文档)
_index:文档在哪存放(索引名)
_type:文档表示的对象类别(索引中的逻辑分区)
_id:文档唯一标识(主键)

3. RestApi:索引基础操作
> 创建索引(自定义id)
  PUT /_index/_type/_id
  -H 'ContextType:application/json'
  -d {"name":"admin","age":23}

> 创建索引(ES自动生成id)
  PUT /_index/_type
  -H 'ContextType:application/json'
  -d {"name":"admin","age":23}

> 获取文档数据
  GET /_index/_type/_id                             获取携带元数据的文档信息
  GET /_index/_type/_id/_source                     获取_source的信息,即:put时的json数据
  GET /_index/_type/_id?_source=field1,field2       获取_source中指定属性信息,即:json中的属性信息

> 校验文档存在
  HEAD /_index/_type/_id                            相应状态码200,则表示存在

> 更新文档:同所有NoSQL一样,非结构数据不可以更新,可以覆盖(官网解释:在内部,Elasticsearch 已将旧
文档标记为已删除,并增加一个全新的文档。 尽管你不能再对旧版本的文档进行访问,但它并不会立即消失。当
继续索引更多的数据,Elasticsearch 会在后台清理这些已删除文档)
  PUT /_index/_type/_id                             相应数据中_version字段标识更新的次数
  -H 'ContextType:application/json'
  -d {"name":"admin2","age":23}

> 文档存在不插入,不存在插入(主要区分:创建、更新)
  PUT /_index/_type/_id/_create
  - 插入成功:201 Created
  - 插入失败:409 Conflict

> 删除文档
  DELETE /_index/_type/_id

4. 并发处理:乐观锁思路
  - 之前有提到的更新的时候_version也会随之改变,所以利用乐观锁的方式校验_version来空值并发问题。
    - PUT /_index/_type/_id?version=1 (只有当文档中_version=1的时候,更新成功)
  - 使用外部系统控制
    - PUT /_index/_type/_id?version_type=external&version=10(当文档中_version<10的时候更新,并将_version设置为10)

5. 更新原理:
    a. 检索并修改它,然后重新索引整个文档(检索-修改-重建索引)
    b. 文档不能被修改,只能被替换

6. 修改文档部分字段:
    a. POST /_index/_type/_id/_update        (可以减少重建索引的步骤,从而优化时间)
       -H 'ContextType:application/json'
       -d {"name":"admin2","age":23}
    b. POST /_index/_type/_id/_update        (脚本执行:ctx._source)
       -H 'ContextType:application/json'
       -d {"script":"ctx._source.age+=1"}
     &脚本调用方式随之版本改动 (ElasticSearch 6.2.1使用官网处理数组失败)
      官网使用说明:https://www.elastic.co/guide/cn/elasticsearch/guide/current/partial-updates.html

7. 修改文档的并发问题:在检索的时候获取当前_version,更新时重建索引会校验_version。
   如果出现并发问题,这会提交失败。官网推出属性:retry_on_conflict
   - POST /website/pageviews/1/_update?retry_on_conflict=5
   疑问:
      a. 如果每次更新ES都做这样的处理,岂不是没有并发问题,那又何来Put时,携带version参数来实现乐观锁的操作?
      b. 官网说修改部分字段可以缩小(检索-重建索引)的时间,说明 索引-修改-重建索引 的步骤并没有减少吗?
         官网说:update API 简单使用与之前描述相同的 检索-修改-重建索引 的处理过程。 区别在于这个过程发生在分片内部,
         这样就避免了多次请求的网络开销。(我的理解:PUT方式修改重建索引是发生在所有分片中,update发生在单个分片中)
      c. 数据是如何分片存储的?

8. 批量获取:mgetAPI要求有一个docs数组作为参数,每个元素包含需要检索文档的元数据,包括_index、 _type 和 _id
eg: GET http://124.71.80.133:9201/website_index/blog_type/_mget
    {
         "ids": [
             "00000001",
             "00000002"
         ]
     }
eg: GET http://124.71.80.133:9201/_mget
    {
        "docs":[
            {
                "_index":"website_index",
                "_type":"blog_type",
                "_id":"00000001"
            },
            {
                "_index":"website_index",
                "_type":"blog_type",
                "_id":"00000002",
                "_source":"title"
            }
        ]
    }

9. 批量操作:bulk API (批处理api)
    - 与 mget 可以使我们一次取回多个文档同样的方式, bulk API 允许在单个步骤中进行多次 create 、
    index 、 update 或 delete 请求。 如果你需要索引一个数据流比如日志事件,它可以排队和索引数百或数千批次。
    官网URL: https://www.elastic.co/guide/cn/elasticsearch/guide/current/bulk.html








版权声明:本文为weixin_38289303原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。