Data

作者: 潘大的笔记 | 来源:发表于2019-03-01 18:38 被阅读0次

在ES中,每个字段的所有数据都是默认被索引的。

什么是文档(document)

文档类似于对象,是指最顶层或者根对象,这个根对象被序列化成JSON并存储到ES中,且指定了唯一ID

文档元数据

一个文档不仅包含它的数据,也包含元数据
三个必须的元数据元素:
1、_index:文档存放位置
一个索引应该是因共同特性被分组到一起的文档集合。例如,存储所有的产品在索引products中。
实际上,在ES中,数据是被存储和索引在分片中,而一个索引仅仅是逻辑上的命名空间,这个命名空间由一个或者多个分片组成
索引名必须小写,不能以下划线开头,不能包含逗号

2、_type:文档表示的对象类型
特性:types(类型)。ES允许在索引中对数据进行逻辑分区。不同types的文档可能有不同的字段,但最好相似
类型命名可以大小写,不能以下划线或者句号开头,不应该包含逗号,长度限制256个字符

3、_id:文档唯一标识
ID是一个字符串,当它和_index以及_type组合可以唯一确定一个文档

4、其他元数据在mapping中介绍

索引

1、自定义的ID

PUT /{index}/{type}/{id}
{
  "field": "value",
  ...
}

2、自动生成ID

POST /{index}/{type}/
{
  "field": "value",
  ...
}

Version control

1、乐观并发控制
ES是分布式的。当文档修改时,新版本的文档必须复制到集群中的其他节点。
ES也是并发的,意味着复制请求是并行发送,并且达到目的地时也许顺序是乱的。
使用_version来忽略旧版本

2、通过外部系统使用版本控制
使用其它数据库作为主要的数据存储,ES作为数据检索。意味着主数据的索引更改发生时 都需要被复制到ES,如果多个进程负责这一数据同步,可能遇到并发问题。
如果主数据库已经有了版本号,或一个能作为版本号的字段值,比如timestamp,那么可以通过version_type=external

Partial update

检索-修改-重建 的修改过程,发生在分片内部
1、可以使用脚本部分更新文档
可以使用脚本编写自定义的逻辑,许多API都支持脚本的使用,包括搜索、排序、聚合和文档更新。
脚本可以作为请求的一部分被传递,从特殊的.scripts索引中检索,或者从磁盘加载脚本
默认的脚本语言是Groovy,默认禁用,可以通过设置集群中的所有节点的config/elassticsearch.yml文件来更改设置

script.groovy.sandbox.enabled: false

2、更新的文档可能不存在
如果指定文档不存在则应该先创建它
第一次运行时,upsert作为新文档被索引,初始化views字段为1
后续运行,script更新操作将替代upsert
3、更新和冲突
产生冲突,将会导致更新请求失败
部分场景文档被改变也没有关系,例如自增,先后顺序不重要。
可以尝试再次更新通过设置参数retry_on_conflict来自动完成,尝试次数,默认值是0

MGET

检索多个文档,可以使用multi-get或者mget来将这些检索放在一个请求中

Bulk

允许在单个步骤中执行多次create、index、update、delete请求
bulk请求不是原子的,不能用它来实现事务控制,每个请求都是单独处理的
格式:

{ action: { metadata }}\n
{ request body        }\n
{ action: { metadata }}\n
{ request body        }\n
...

一个完整的bulk请求

POST /_bulk
{ "delete": { "_index": "website", "_type": "blog", "_id": "123" }} (1)
{ "create": { "_index": "website", "_type": "blog", "_id": "123" }}
{ "title":    "My first blog post" }
{ "index":  { "_index": "website", "_type": "blog" }}
{ "title":    "My second blog post" }
{ "update": { "_index": "website", "_type": "blog", "_id": "123", "_retry_on_conflict" : 3} }
{ "doc" : {"title" : "My updated blog post"} } (2)

1、delete后面没有请求体
2、最后还是需要换行

返回的结果

{
   "took": 4,
   "errors": false, (1)
   "items": [
      {  "delete": {
            "_index":   "website",
            "_type":    "blog",
            "_id":      "123",
            "_version": 2,
            "status":   200,
            "found":    true
      }},
      {  "create": {
            "_index":   "website",
            "_type":    "blog",
            "_id":      "123",
            "_version": 3,
            "status":   201
      }},
      {  "create": {
            "_index":   "website",
            "_type":    "blog",
            "_id":      "EiwfApScQiiy7TIKFxRCTw",
            "_version": 1,
            "status":   201
      }},
      {  "update": {
            "_index":   "website",
            "_type":    "blog",
            "_id":      "123",
            "_version": 4,
            "status":   200
      }}
   ]
}

不要重复指定IndexType1,例如

POST /website/_bulk
{ "index": { "_type": "log" }}
{ "event": "User logged in" }

合并的请求不易过大(提升,请参考文档)

相关文章

网友评论

      本文标题:Data

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