在 Elasticsearch(es)的实际使用中,我们往往需要每天对索引数据进行增量更新和全量更新,如果当前程序使用的索引需要用新建的(可能是全量更新的),那么可以通过索引别名 alias 的方式进行索引无缝平滑切换,无需修改程序代码,平滑操作你可以理解是原子性的操作,应用端无感知。
具体方法
假设我们每天全量数据同步到 es 的问答索引名为 qa_20200501,这种带有日期后缀的形式,调用索引查询的指定索引名是 qa 即可,当每天切换到最新数据的索引时,只需将现有的索引别名映射删除,将新的索引映射到别名下即可,示例如下:
POST /_aliases
{
"actions": [
{ "remove": { "index": "qa_20200501", "alias": "qa" }},
{ "add": { "index": "qa_20200502", "alias": "qa" }}
]
}
索引别名本质上是一个快捷方式或软链接,并且它是一个原子性的操作。
此外,应用中使用别名而不是索引名,这样你就可以在任何时候重建索引。
上述示例中多个操作用了 _aliases
,还有单个操作的 _alias
。
需要注意的是,如果别名与索引是一对一的,使用别名索引文档或者查询文档是可以的,但是如果别名和索引是一对多的,使用别名会发生错误,因为 es 不知道把文档写入哪个索引中去或者从哪个索引中读取文档。