[Elasticsearch] 索引管理 (五) - 默认映射,重索引,索引别名

默认映射(Default Mapping)

一般情况下,索引中的所有类型都会有相似的字段和设置。因此将这些常用设置在_default映射中指定会更加方便,这样就不需要在每次创建新类型的时候都重复设置。_default映射的角色是新类型的模板。所有在_default映射之后创建的类型都会包含所有的默认设置,除非显式地在类型映射中进行覆盖。

比如,我们使用_default映射对所有类型禁用_all字段,唯独对blog类型启用它。可以这样实现:

PUT /my_index
{
    "mappings": {
        "_default_": {
            "_all": { "enabled":  false }
        },
        "blog": {
            "_all": { "enabled":  true  }
        }
    }
}

_default_映射同时也是一个声明作用于整个索引的动态模板(Dynamic
Templates)
的好地方。

数据重索引

虽然你可以向索引中添加新的类型,或者像类型中添加新的字段,但是你不能添加新的解析器或者对现有字段进行修改。如果你这么做了,就会让已经索引的数据变的不正确,导致搜索不能正常的进行。

为已经存在的数据适用这些更改的最简单的方法就是重索引(Reindex):新建一个拥有最新配置的索引,然后将所有旧索引中的数据拷贝到新的索引中。

_source字段的一个优势是在ES中你已经拥有了整个文档。你不需要通过数据库来重建你的索引,这种方法通常会更慢。

为了从旧索引中高效地对所有文档进行重索引,可以使用scan和scroll来批量地从旧索引中获取文档,然后使用bulk
API
将它们添加到新索引中。

批量重索引

你可以同时执行多个重索引任务,但是你显然不想要它们的结果有任何重叠。可以根据date或者timestamp字段对重索引的任务进行划分,成为规模较小的任务:

GET /old_index/_search?search_type=scan&scroll=1m
{
    "query": {
        "range": {
            "date": {
                "gte":  "2014-01-01",
                "lt":   "2014-02-01"
            }
        }
    },
    "size":  1000
}

如果你正在持续地更改旧索引中的数据,想必你也希望这些更改也会被反映到新索引中。这可以通过再次运行重索引任务来完成,但是还是可以通过对日期字段进行过滤来得到在上次重索引开始后才被添加的文档。

索引别名和零停机时间(Index Alias and Zero Downtime)

重索引的问题在于你需要更新你的应用让它使用新的索引名。而索引别名可以解决这个问题。

一个索引别名就好比一个快捷方式(Shortcut)或一个符号链接(Symbolic Link),索引别名可以指向一个或者多个索引,可以在任何需要索引名的API中使用。使用别名可以给我们非常多的灵活性。它能够让我们:

  • 在一个运行的集群中透明地从一个索引切换到另一个索引
  • 让多个索引形成一个组,比如last_three_months
  • 为一个索引中的一部分文档创建一个视图(View)

我们会在本书的后面讨论更多关于别名的其它用途。现在我们要解释的是如何在零停机时间的前提下,使用别名来完成从旧索引切换到新索引。

有两个用来管理别名的端点(Endpoint):_alias用来完成单一操作,_aliases用来原子地完成多个操作。

在这个场景中,我们假设你的应用正在使用一个名为my_index的索引。实际上,my_index是一个别名,它指向了当前正在使用的真实索引。我们会在真实索引的名字中包含一个版本号码:my_index_v1my_index_v2等。

首先,创建索引my_index_v1,然后让别名my_index指向它:

PUT /my_index_v1
PUT /my_index_v1/_alias/my_index 

可以通过下面的请求得到别名指向的索引:

GET /*/_alias/my_index

或者查询指向真实索引的有哪些别名:

GET /my_index_v1/_alias/*

它们都会返回:

{
    "my_index_v1" : {
        "aliases" : {
            "my_index" : { }
        }
    }
}

然后,我们决定要为索引中的一个字段更改其映射。当然,我们是不能修改当前的映射的,因此我们只好对数据进行重索引。此时我们创建了拥有新的映射的索引my_index_v2

PUT /my_index_v2
{
    "mappings": {
        "my_type": {
            "properties": {
                "tags": {
                    "type":   "string",
                    "index":  "not_analyzed"
                }
            }
        }
    }
}

紧接着,我们会根据数据重索引中的流程将my_index_v1中的数据重索引到my_index_v2。一旦我们确定了文档已经被正确地索引,我们就能够将别名切换到新的索引上了。

一个别名能够指向多个索引,因此当我们将别名指向新的索引时,我们还需要删除别名原来到旧索引的指向。这个改变需要是原子的,即意味着我们需要使用_aliases端点:

POST /_aliases
{
    "actions": [
        { "remove": { "index": "my_index_v1", "alias": "my_index" }},
        { "add":    { "index": "my_index_v2", "alias": "my_index" }}
    ]
}

现在你的应用就在零停机时间的前提下,实现了旧索引到新索引的透明切换。

TIP

即使你认为当前的索引设计是完美的,将来你也会发现有一些部分需要被改变,而那个时候你的索引已经在生产环境中被使用了。

在应用中使用索引别名而不是索引的真实名称,这样你就能够在任何需要的时候执行重索引操作。应该充分地使用别名。

时间: 2024-12-29 23:30:12

[Elasticsearch] 索引管理 (五) - 默认映射,重索引,索引别名的相关文章

[Elasticsearch] 索引管理 (四) - 动态映射

动态映射(Dynamic Mapping) 当ES在文档中碰到一个以前没见过的字段时,它会利用动态映射来决定该字段的类型,并自动地对该字段添加映射. 有时这正是需要的行为,但有时不是.你或许不知道在以后你的文档中会添加哪些字段,但是你想要它们能够被自动地索引.或许你只是想要忽略它们.或者 - 尤其当你将ES当做主要的数据存储使用时 - 大概你会希望这些未知的字段会抛出异常来提醒你注意这一问题. 幸运的是,你可以通过dynamic设置来控制这一行为,它能够接受以下的选项: true:默认值.动态添

MySQL 索引管理与执行计划

原文:MySQL 索引管理与执行计划 1.1 索引的介绍 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息.如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息. 索引的一个主要目的就是加快检索表中数据的方法,亦即能协助信息搜索者尽快的找到符合限制条件的记录ID的辅助数据结构. 1.1.1 唯一索引 唯一索引是不允许其中任何两行具有相同索引值的索引.当现有数据中存在重复的键值时,大多数数据库不允许将新创建的唯一索引与表一

elasticsearch系列二:索引详解(快速入门、索引管理、映射详解、索引别名)

一.快速入门 1. 查看集群的健康状况 http://localhost:9200/_cat http://localhost:9200/_cat/health?v 说明:v是用来要求在结果中返回表头 状态值说明 Green - everything is good (cluster is fully functional),即最佳状态Yellow - all data is available but some replicas are not yet allocated (cluster i

Elasticsearch之_default_—— 为索引添加默认映射

前篇说过,ES可以自动为文档设定索引.但是问题也来了——如果默认设置的索引不是我们想要的,该怎么办呢? 要知道ES这种搜索引擎都是以Index为实际的分区,Index里面包含了不同的类型,不同的类型是逻辑上的分区:每种类型可能包含有相同的字段,如果字段的类型相同还好,如果不同....那就会导致字段的冲突了. 本篇就讲述如何使用REST API以及Logstash设置默认的索引. 更多内容参考:Elasticsearch知识汇总 使用Rest API设置默认的索引 首先先看一下不设置默认索引时,我

一文带您了解 Elasticsearch 中,如何进行索引管理(图文教程)

欢迎关注笔者的公众号: 小哈学Java, 每日推送 Java 领域干货文章,关注即免费无套路附送 100G 海量学习.面试资源哟!! 个人网站: https://www.exception.site/essay/about-elasticsearch-index-manage 在 Elasticsearch 中,索引是一个非常重要的概念,它是具有相同结构的文档集合.类比关系型数据库,比如 Mysql, 你可以把它对标看成和库同级别的概念. 今天小哈将带着大家了解, 在 Elasticsearch

[ElasticSearch]Java API 之 索引管理

ElasticSearch为了便于处理索引管理(Indices administration)请求,提供了 org.elasticsearch.client.IndicesAdminClient接口.通过如下代码从 Client 对象中获得这个接口的实现: IndicesAdminClient indicesAdminClient = client.admin().indices(); IndicesAdminClient定义了好几种prepareXXX()方法作为创建请求的入口点. 1. 索引

[Elasticsearch] 索引管理 (一)

索引管理 本文翻译自Elasticsearch官方指南的索引管理(Index Management)一章 我们已经了解了ES是如何在不需要任何复杂的计划和安装就能让我们很容易地开始开发一个新的应用的.但是,用不了多久你就会想要仔细调整索引和搜索过程来更好的适配你的用例. 几乎所有的定制都和索引(Index)以及其中的类型(Type)相关.本章我们就来讨论用于管理索引和类型映射的API,以及最重要的设置. 创建索引 到现在为止,我们已经通过索引一份文档来完成了新索引的创建.这个索引是使用默认的设置

Elasticsearch系列---索引管理

概要 Elasticsearch让索引创建变得非常简单,只要索引一条新的数据,索引会自动创建出来,但随着数据量的增加,我们开始有了索引优化和搜索优化的需求之后,就会发现自动创建的索引在某些方面不能非常完美的适应我们的需求,我们开始考虑手动创建适合我们业务需求的索引. 索引的CRUD 为了更好地贴切我们的业务数据需求,我们开始更精细的管理我们的索引. 创建索引 创建索引的语法示例如下: PUT /music { "settings": { "number_of_shards&q

Elasticsearch 索引管理和内核探秘

1. 创建索引,修改索引,删除索引 //创建索引 PUT /my_index { "settings": { "number_of_shards": 1, "number_of_replicas": 0 }, "mappings": { "my_type": { "properties": { "my_field": { "type": "