5 索引的操作

1. 滚动索引

接上回索引别名

当一个索引数据量太大时,如果继续写入数据可能会导致分片容量过大,查询时会因内存不足引起集群崩溃。

为了避免所有的数据都写入同一个索引,可以考虑使用滚动索引。

滚动索引需要配合索引别名一起使用,可实现把原先写入一个索引的数据自动分发到多个索引中。
例如: 先创建一个索引log1,并给定别名logs-all。

java 复制代码
PUT /logs1
{
  "aliases": {
    "logs-all": {}
  }
}
java 复制代码
{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "index" : "logs1"
}

然后使用别名往logs1中写入数据。

java 复制代码
PUT logs-all/_doc/1?refresh
{
  "visittime":"10:00:00",
  "keywords":"[世界杯]",
  "rank":18,
  "clicknum":13,
  "id":10001,
  "userid":"2982199073774412",
  "key":"10001"
}
java 复制代码
{
  "_index" : "logs1",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "result" : "created",
  "forced_refresh" : true,
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}
java 复制代码
PUT logs-all/_doc/2?refresh
{
  "visittime":"11:00:00",
  "keywords":"[杯]",
  "rank":20,
  "clicknum":12,
  "id":1121,
  "userid":"2982199073774412",
  "key":"2"
}
java 复制代码
{
  "_index" : "logs1",
  "_type" : "_doc",
  "_id" : "2",
  "_version" : 1,
  "result" : "created",
  "forced_refresh" : true,
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 1,
  "_primary_term" : 1
}

现在来为别名logs-all指定一个滚动索引,如果条件成立,就把新数据写入logg2.

java 复制代码
POST logs-all/_rollover/log2
{
  "conditions": {
    "max_age": "7d",
    "max_docs": 1,
    "max_size": "5gb"
  }
}
java 复制代码
{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "old_index" : "logs1",
  "new_index" : "log2",
  "rolled_over" : true,
  "dry_run" : false,
  "conditions" : {
    "[max_docs: 1]" : true,
    "[max_size: 5gb]" : false,
    "[max_age: 7d]" : false
  }
}

解释:上面的滚动索引配置的条件是,如果往别名logs-all中写入的索引数据量大于等于1,或者主分片总大小超过5GB,或者创建索引的时间长度超过7天,就把新的数据写入新索引log2。该请求会返回滚动索引的执行结果。

从请求返回的结果可以看出,此时max_docs条件已经成立,一个新的索引log2已经创建出来了,此时别名logs-all已经指向了log2,log1的别名已经被删除。因此,如果继续往别名logs-all中写数据,数据会被写入log2。

以此类推,如果log2的数据太多,可以继续使用滚动索引把新数据写入索引log3。可以指定一个有规律的名称,例如log-000001,那么每次使用滚动索引时,新的索引会自动生成名称,在前一个的尾数上直接++。

2 索引的状态管理

elasticsearch为开发人员提供了一组API用于对索引的状态进行管理,包括:清空缓存,刷新索引,冲洗索引,强制合并,关闭索引,冻结索引。

2.1 清空缓存

elasticsearch之所以能够成为高性能的搜索引擎是因为它拥有强大的缓存机制,可将很多数据直接放在内存中,可以大大提升查询速度。

分为3种缓存类型:

java 复制代码
1.节点的查询缓存
2.分片的请求缓存和字段数据加缓存
3.fieldata是一种缓存于内存种的数据结构,它是一个文档主键指向每个字段数据的映射。类似于关系型数据库的表结构。每个字段的数据缓存在fielddata中用于高性能的排序和聚集统计。

清空字段数据缓存

java 复制代码
POST /logs/_cache/clear?fielddata=true
java 复制代码
{
  "_shards" : {
    "total" : 4,
    "successful" : 2,
    "failed" : 0
  }
}

清空节点的查询缓存

java 复制代码
POST /logs/_cache/clear?query=true
java 复制代码
{
  "_shards" : {
    "total" : 4,
    "successful" : 2,
    "failed" : 0
  }
}

清空分片的请求缓存

handlebars 复制代码
POST /logs/_cache/clear?request=true
java 复制代码
{
  "_shards" : {
    "total" : 4,
    "successful" : 2,
    "failed" : 0
  }
}

如果想清空索引的全部缓存可以直接把参数去掉

java 复制代码
POST /logs/_cache/clear
java 复制代码
{
  "_shards" : {
    "total" : 4,
    "successful" : 2,
    "failed" : 0
  }
}

如果要清空所有的索引缓存【慎用】

java 复制代码
POST /_cache/clear
2.2 刷新索引

当外部数据写入索引时,数据并不会直接提交到磁盘上,因为提交数据的过程成本太大,会按照一定的流程将数据周期性地提交到磁盘上进行持久化。

相关推荐
小马学嵌入式~10 分钟前
嵌入式 SQLite 数据库开发笔记
linux·c语言·数据库·笔记·sql·学习·sqlite
Java小白程序员32 分钟前
MyBatis基础到高级实践:全方位指南(中)
数据库·mybatis
Monly2138 分钟前
人大金仓:merge sql error, dbType null, druid-1.2.20
数据库·sql
不宕机的小马达1 小时前
【Mysql|第一篇】Mysql的安装与卸载、Navicat工具的使用
数据库·mysql
float_六七1 小时前
数据库连接池:性能优化的秘密武器
数据库·oracle·性能优化
码界奇点1 小时前
MongoDB vs MySQLNoSQL与SQL数据库的架构差异与选型指南
数据库·sql·mongodb·系统架构
IT 小阿姨(数据库)1 小时前
PgSQL中pg_stat_user_tables 和 pg_stat_user_objects参数详解
linux·运维·数据库·sql·postgresql·oracle
倔强的石头_1 小时前
Windows系统下KingbaseES数据库保姆级安装教程(附常见问题解决)
数据库
麦兜*2 小时前
MongoDB 常见错误解决方案:从连接失败到主从同步问题
java·数据库·spring boot·redis·mongodb·容器
RestCloud2 小时前
PostgreSQL大表同步优化:如何避免网络和内存瓶颈?
前端·数据库·api