Elasticsearch 索引和文档

·  阅读 27

在 es 中,索引和文档是 REST 接口操作的最基本资源,所以对索引和文档的 管理也是我们必须要知道的。索引一般是以索引名称出现在 REST 请求操作的资 源路径上,而文档是以文档 ID 为标识出现在资源路径上。映射类型_doc 也可以 认为是一种资源,但在 es7 中废除了映射类型,所以可以_doc 也视为一种接口。

索引的管理

在前面的学习中我们已经知道,GET 用来获取资源,PUT 用来更新资源, DELETE 用来删除资源。所以对索引,GET 用来查看索引,PUT 用来创建索引,DELETE 用来删除索引,还有一个 HEAD 请求,用来检验索引是否存在。除此之外,对索 引的管理还有

列出所有索引

GET /_cat/indices?v
复制代码

image.png

关闭索引和打开

POST /open-soft/_close
复制代码

除了删除索引,还可以选择关闭它们。如果关闭了一个索引,就无法通过 Elasticsearch 来读取和写人其中的数据,直到再次打开它。

在现实世界中,最好永久地保存应用日志,以防要查看很久之前的信息。另 一方面,在 Elasticsearch 中存放大量数据需要增加资源。对于这种使用案例,关 闭旧的索引非常有意义。你可能并不需要那些数据,但是也不想删除它们

一旦索引被关闭,它在 Elasticsearch 内存中唯-的痕迹是其元数据,如名字 以及分片的位置。如果有足够的磁盘空间,而且也不确定是否需要在那个数据中 再次搜索,关闭索引要比删除索引更好。关闭它们会让你非常安心,永远可以重 新打开被关闭的索引,然后在其中再次搜索。

重新打开

POST /open-soft/_open
复制代码

配置索引

通过 settings 参数配置索引,索引的所有配置项都以“index”开头。索引的 管理分为静态设置和动态设置两种

静态设置

静态设置:只能在索引创建时或在状态为 closed index(闭合索引)上设置,主要配置 索引主分片、压缩编码、路由等相关信息 index.number_of_shards主分片数,默认为 5.只能在创建索引时设置,不能修改。

index.shard.check_on_startup 是否应在索引打开前检查分片是否损坏,当 检查到分片损坏将禁止分片被打开。false:默认值;checksum:检查物理损坏; true:检查物理和逻辑损坏,这将消耗大量内存和 CPU;fix:检查物理和逻辑损坏。 有损坏的分片将被集群自动删除,这可能导致数据丢失

index.routing_partition_size 自定义路由值可以转发的目的分片数。默认为 1, 只能在索引创建时设置。此值必须小于 index.number_of_shards

index.codec 默认使用 LZ4 压缩方式存储数据,也可以设置为best_compression,它使用 DEFLATE 方式以牺牲字段存储性能为代价来获得更高的压缩比例。

例如:

put test1
{
    "settings":**{
        "index.number_of_shards":3,
        "index.codec":"best_compression"
    }
}
复制代码

动态设置

通过接口“_settings”进行,同时查询配置也通过这个接口进行,比如: 查看索引

get _settings #获取机器所有索引的配置。

get /open-soft/_settings  #获取制定索引的配置。

get /open-soft,test1/_settings#多个索引的配置信息。
复制代码

配置索引

put test1/_settings
{
"refresh_interval":"2s"
}
复制代码

常用配置

index.number_of_replicas每个主分片的副本数。默认为 1

index.auto_expand_replicas 基于可用节点的数量自动分配副本数量,默认为false(即禁用此功能)

index.refresh_interval 执行刷新操作的频率。默认为 1s。可以设置为 -1 以禁用刷新。

index.max_result_window用于索引搜索的 from+size 的最大值。默认为10000

index.blocks.read_only 设置为 true 使索引和索引元数据为只读,false 为允许写入和元数据更改。

index.blocks.read设置为 true 可禁用对索引的读取操作

index.blocks.write 设置为 true 可禁用对索引的写入操作

index.blocks.metadata 设置为 true 可禁用索引元数据的读取和写入

index.max_refresh_listeners 索引的每个分片上可用的最大刷新侦听器数

index.max_docvalue_fields_search一次查询最多包含开启 doc_values 字段的个数,默认为 100

index.max_script_fields 查询中允许的最大 script_fields 数量。默认为 32。

index.max_terms_count 可以在 terms 查询中使用的术语的最大数量。默认为 65536。

index.routing.allocation.enable 控制索引分片分配。All(所有分片)、primaries(主分片)、new_primaries(新创建分片)、none(不分片)
index.routing.rebalance.enable 索引的分片重新平衡机制。all、primaries、replicas、none
index.gc_deletes文档删除后(删除后版本号)还可以存活的周期,默认为 60s
index.max_regex_length 用于正在表达式查询(regex query)正在表达式长度,默认为 1000
复制代码

配置映射

通过_mapping 接口进行,在我们前面的章节中,已经展示过了

get /open-soft/_mapping
复制代码

或者只看某个字段的属性:

get /open-soft/_mapping/field/lang
复制代码

修改映射,当然就是通过 put 或者 post 方法了。但是要注意,已经存在的 映射只能添加字段或者字段的多类型。但是字段创建后就不能删除,大多数参数 也不能修改,可以改的是 ignore_above。所以设计索引时要做好规划,至少初始 时的必要字段要规划好

文档的管理

增加文档

增加文档,我们在前面的章节已经知道了,比如

put /open-soft/_doc/1
{
"name": "Apache Hadoop",
"lang": "Java",
"corp": "Apache",
"stars":200
}
复制代码

如果增加文档时,在 Elasticsearch 中如果有相同 ID 的文档存在,则更新此文 档,比如执行

put /open-soft/_doc/1
{
"name": "Apache Hadoop2",
"lang": "Java8",
"corp": "Apache",
"stars":300
}
复制代码

则会发现已有文档的内容被更新了。

文档的 id

当创建文档的时候,如果不指定 ID,系统会自动创建 ID。自动生成的 ID 是 一个不会重复的随机数。使用 GUID 算法,可以保证在分布式环境下,不同节点 同一时间创建的_id 一定是不冲突的。比如:

post /open-soft/_doc
{
"message":"Hello"
}
复制代码
{
  "_index" : "open-soft",
  "_type" : "_doc",
  "_id" : "W9yuVIIBVFnSsmDbr8wo",  分布式id
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 4,
  "_primary_term" : 3
}

复制代码

image.png

查询文档

get /open-soft/_doc/1
复制代码

更新文档

前面我们用 put 方法更新了已经存在的文档,但是可以看见他是整体更新文 档,如果我们要更新文档中的某个字段怎么办?需要使用_update 接口。

post /open-soft/_update/1/
{
"doc":{
"year": 2016
}
}
复制代码

如果文档中存在 year 字段,更新 year 字段的值,如果不存在 year 字段,则 会新增 year 字段,并将值设为 2016。

update 接口在文档不存在时提示错误,如果希望在文档不存在时创建文档, 则可以在请求中添加 upsert 参数或 doc_as_upsert 参数,例如:

POST /open-soft/_update/5
{
    "doc":{
        "year":"2020" #更新字段的新值。
    },
    "upsert":{
        "name":"Enjoyedu Framework",
        "corp":"enjoyedu "
    }
}
复制代码

POST /open-soft/_update/6
{
"doc": {
"year": "2020"
},
"doc_as_upsert" : true
}
复制代码

upsert 参数定义了创建新文档使用的文档内容,而 doc_as_upsert 参数的含 义是直接使用 doc 参数中的内容作为创建文档时使用的文档内容。

删除文档

delete /open-soft/_doc/1
复制代码
分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改