查看所有的索引
GET _cat/indices
查看所有的别名
GET 127.0.0.1:9200/_alias
查看的模板
GET 127.0.0.1:9200/_template/模板名
使用通配符
GET /_template/temp*
从前面的学习中,我们知道es的字段建立后就不能被修改,假设原本是一个string类型的数据,被识别成date类型,之后再传一个string类型,由于无法转换格式就报错。。这个时候我们的做法就只能加一个字段去处理,,久而久之字段太多了。。就不行了
所以我们只能重建索引。。。reindex
注意点
1、重建索引不会尝试设置目标索引,它不会复制源索引的设置,你应该在运行_reindex操作之前设置目标索引,包括设置映射、碎片数、副本等。
2、一般不会冲突,除非将多个index 重建到同一个index,这样id才有可能冲突,,默认是覆盖。可以自己设置
3、重建索引,是指重建索引那个时候的一个快照,比如重建索引过程需要1分钟。。在重建索引的过程中,插入旧索引的数据是不会同步过去的。所以是否可以在重建索引的时候将旧的索引设置成只读状态?
POST _reindex
{
"source": {
"index": "my_index_name"
},
"dest": {
"index": "my_index_name_new"
}
}
_source 重建特定的字段
有时候我们有写字段不用了同步到新的索引
只有满足_source的字段才会被同步到新的索引
POST _reindex
{
"source": {
"index": "my_index_name",
"_source": ["field_name_1", "field_name_2"]
},
"dest": {
"index": "my_index_name_new"
}
}
以下会在copy后将新索引中的flag字段名称修改为tag:
POST _reindex
{
"source": {
"index": "test"
},
"dest": {
"index": "test2"
},
"script": {
"source": "ctx._source.tag = ctx._source.remove(\"flag\")"
}
}
对满足query条件的数据进行同步
POST _reindex
{
"source": {
"index": "my_index_name",
"type": "my_type_name",
"query": { // query的条件
"term": {
"user": "user_value"
}
}
},
"dest": {
"index": "my_index_name_new"
}
}
reindex太慢优化
reindex底层是使用scroll滚动去同步的,,这个是快照
1、修改批量条数
默认情况下,_reindex使用1000条进行批量操作,但是我们在之前学过一个好的bulk是5M-15M,而不是看文档数量
1)每个1kb的1000个文档是1mb。
2)每个100kb的1000个文档是100 MB。
POST _reindex
{
"source": {
"index": "source",
"size": 5000
},
"dest": {
"index": "dest",
"routing": "=cat"
}
}
2、借助scroll的sliced
POST _reindex?slices=5&refresh
{
"source": {
"index": "twitter"
},
"dest": {
"index": "new_twitter"
}
}
slices大小设置注意事项:
1)slices大小的设置可以手动指定,或者设置slices设置为auto,auto的含义是:针对单索引,slices大小=分片数;针对多索引,slices=分片的最小值。
2)当slices的数量等于索引中的分片数量时,查询性能最高效。slices大小大于分片数,非但不会提升效率,反而会增加开销。
3)如果这个slices数字很大(例如500),建议选择一个较低的数字,因为过大的slices 会影响性能。
3、将ES副本数设置为0
如果要进行大量批量导入,请考虑通过设置index.number_of_replicas来禁用副本:0,等同步完成在启用副本。
复制文档时,将整个文档发送到副本节点,并逐字重复索引过程。 这意味着每个副本都将执行分析,索引和潜在合并过程。
相反,如果您使用零副本进行索引,然后在提取完成时启用副本,则恢复过程本质上是逐字节的网络传输。 这比复制索引过程更有效。
PUT /my_logs/_settings
{
"number_of_replicas": 1
}
4、增加refresh间隔
如果你的搜索结果不需要接近实时的准确性,考虑先不要急于索引刷新refresh。可以将每个索引的refresh_interval到30s。
如果正在进行大量数据导入,可以通过在导入期间将此值设置为-1来禁用刷新。完成后不要忘记重新启用它!
设置方法:
PUT /my_logs/_settings
{ "refresh_interval": -1 }
像上面我们将一个旧的索引 order_index_v1 重建到 order_index_v2的时候
我们java代码查询es的时候使用order_index_v1,这样的话,当我们要切换使用order_index_v2,就需要将所有的order_index_v1改成order_index_v2,麻烦,而且java服务可能需要停机重启才能生效,这样肯定是不行的,所以我们就可以使用别名
我们将order_index_v1 取一个别名叫order_index,,之后对order_index_v1的操作都使用order_index,当我们切换索引的时候将,别名指向order_index_v2就行,,
别名在rollover的时候非常好用,,而且索引对性能没有任何影响
新建别名
order_index别名指向已有的索引order_index_v1
POST /_aliases?pretty
{
"actions": [
{
"add": {
"index": "order_index_v1",
"alias": "order_index"
}
}
]
}
索引切换
将order_index指向order_index_v2
POST /_aliases?pretty
{
"actions": [
{
"remove": {
"index": "order_index_v1",
"alias": "order_index"
}
},
{
"add": {
"index": "order_index_v2",
"alias": "order_index"
}
}
]
}
{
"order": 0, // 模板优先级
"template": "sample_info*", // 模板匹配的名称方式
"settings": {...}, // 索引设置
"mappings": {...}, // 索引中各字段的映射定义
"aliases": {...} // 索引的别名
}
order:优先级数字越低,越早使用,如果同时匹配到两个模板,数字低的先使用,数字高的会覆盖低的。
template:将这个模板应用于所有以 logstash- 为起始的索引。
settings:定义了索引的属性,包括分片数量、副本数量、写入flush时间间隔。
mappings:字段映射
aliases:别名
"settings": {
"index": {
"refresh_interval": "10s",//每10秒刷新
"number_of_shards" : "5",//主分片数量
"number_of_replicas" : "2",//副本数量
"translog": {
"flush_threshold_size": "1gb",//内容容量到达1gb异步刷新
"sync_interval": "30s",//间隔30s异步刷新(设置后无法更改)
"durability": "async"//异步刷新
}
}
}
创建模板
(模板名和索引名一样都不能有大写)
PUT http://127.0.0.1:9200/_template/template_name
{
"template": "dsideal*",
"order": 0,
"settings": {
"number_of_shards": 5
},
"aliases": {
"dsideal-query": {} #起个别名
},
"mappings": {
"doc": {
"properties": {
"person_name": {
"type": "keyword"
},
"gender_id": {
"type": "long"
},
"bureau_id": {
"type": "long"
}
}
}
}
}
blog的例子
先创建一个模板
put 127.0.0.1:9200/_template/blog_template
{
"template": "blog_*",
"order": 0,
"settings": {
"number_of_shards": 5,
"number_of_replicas": 1
},
"mappings": {
"doc": {
"properties": {
"title": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"summary": {
"type": "text"
},
"publish_time": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd HH:mm||yyyy-MM-dd||epoch_millis"
},
"states": {
"type": "short"
},
"creator": {
"type": "keyword"
},
"click_num": {
"type": "integer"
},
"thumb_url": {
"type": "text"
},
"category_id": {
"type": "long"
},
"join_field": {
"type": "join",
"relations": {
"t_article": "t_article_contents"
}
},
"contents": {
"type": "text"
}
}
}
}
}
创建一个索引 blog_v3 会自动使用模板
put 127.0.0.1:9200/blog_v3/
重建索引
注意上面模板的type doc 源数据是 t_article 所以reindex 要指定同步到doc
{
"source": {
"index": "blog"
},
"dest": {
"index": "blog_v3",
"type":"doc"
}
}
注意
假设 我有5条数据 第二条reindex失败了 但是(其他的数据会成功),不会因为一条数据失败而全部失败,,但是继续重建的时候会被默认覆盖,所以不用删除
遇到一个问题
我的模板设置日期格式
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
但是我源数据的格式 yyyy-MM-dd HH:mm 同步的时候会因为格式不正确报错
后面我将模板改成
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd HH:mm||yyyy-MM-dd||epoch_millis"
重新同步 发现还是不行,,,这个是因为你只是改了模板,,但是对已经创建的index不生效了。。
如果所有数据只存在一个索引下,随着数据积累,索引体积越来越大。为了方便管理ES索引,尽量将数据分散到多个索引里。在ES5.0以后新增了一个rollover API,可以动态的滚动索引。
满足条件的时候会自动触发,滚动创建新的索引。。
{
"conditions": {
"max_age": "30d",
"max_docs": 1000,
"max_size": "50gb",
}
}
当满足30天
或者 这个index文档数量大于1000
或者数据总量大于50gb
满足一个会自动滚动创建新的index
有两种指定新index名字的方式
1、第一种不指定索引名字
索引名字需要以-数字结尾 例如: index_name-1。每次调用rollover API新的索引名字会自动+1
假设我们现在有一个别名blog_alias指向blog-8
POST 127.0.0.1:9200/blog_alias(别名)/_rollover
{
"conditions": {
"max_age": "7d",
"max_docs": 1400,
"max_size": "5gb"
}
}
滚动index的index为blog-000009**(6位)**
2、第二种自己指定索引名字
POST 127.0.0.1:9200/blog_alias(别名)/_rollover/%3Cblog_alias-%7Bnow%2Fd%7D-1%3E
{
"conditions": {
"max_age": "7d",
"max_docs": 1400,
"max_size": "5gb"
}
}
格式就是
https://www.urlencoder.io/。实际上它就是字符串“”的url编码形式
ps
创建别名的时候 要是使用**“is_write_index”: true**这样我们每次通过别名进行写操作才能指向最新的index
rollover不会自动触发,我们需要写个定时器去调用,,比如0点0分0秒去触发
max_age如果是中午12点创建的index 是从中午还是算的时间24小时为一天。。如"max_age": “1d”,到隔开中午12点算一天
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 5,
"max_score": 1,
"hits": [
{
"_index": "blog",
"_type": "t_article",
"_id": "31111111111111111",
"_score": 1,
"_routing": "29",
"_source": {
"contents": "娃哈哈哈哈哈哈哈哈",
"join_field": {
"name": "t_article_contents",
"parent": 1
}
}
},
{
"_index": "blog",
"_type": "t_article",
"_id": "2",
"_score": 1,
"_source": {
"title": "你大爷",
"summary": "你大爷 哇哈哈 66666",
"publish_time": "2018-08-29 15:56",
"states": 1,
"creator": "丁D",
"click_num": 222,
"thumb_url": "/upload/shan.jpg",
"category_id": 1,
"join_field": {
"name": "t_article"
}
}
},
{
"_index": "blog",
"_type": "t_article",
"_id": "3",
"_score": 1,
"_routing": "1",
"_source": {
"contents": "娃哈哈哈哈哈哈哈哈",
"join_field": {
"name": "t_article_contents",
"parent": 1
}
}
},
{
"_index": "blog",
"_type": "t_article",
"_id": "4",
"_score": 1,
"_routing": "1",
"_source": {
"contents": "沿着路灯一个人走回家 和老朋友打电话 你那里天气好吗",
"join_field": {
"name": "t_article_contents",
"parent": 1
}
}
},
{
"_index": "blog",
"_type": "t_article",
"_id": "1",
"_score": 1,
"_source": {
"title": "山有木兮",
"summary": "《山有木兮》是橙光游戏《人鱼传说之长生烛》的主题曲,执素兮谱曲,顾聆落填词演唱者伦桑,于2016年8月12日正式发行",
"publish_time": "2018-08-29 15:56:00",
"category_id": 1,
"states": 1,
"creator": "丁D",
"click_num": 111,
"thumb_url": "/upload/shan.jpg",
"join_field": {
"name": "t_article"
}
}
}
]
}
}