上一篇说到如果一个索引的mapping设置过了,想要修改type或analyzer,通常的做法是新建一个索引,重新设置mapping,再把数据同步过来。

那么如何实现零停机时间更新索引配置或迁移索引?这就需要用到索引的别名设置。

思路:

1、假设我们的索引是demo_v1,我们定义了一个别名demo,以后所有的操作都用别名demo操作。

2、现在索引demo_v1的mapping设置或者其他一些设置不满足我们的需求了,我们需要修改。新建一个索引demo_v2,同时设置好最新配置。

3、同步索引demo_v1的数据到索引demo_v2。直到同步完。

4、移除索引demo_v1的别名demo,同时设置索引demo_v2的别名为demo。

5、删除索引demo_v1。

6、迁移完成。以后如果还有设置变更,可以按照这个思路继续设置索引demo_v3、demo_v4……

接下来用一个例子说明实现过程,实际项目中我也是按这个思路做的。如果有一些命令操作看不懂,可参看上一篇文章。

1、创建索引demo_v1

> curl -XPUT 'localhost:9200/demo_v1'
{"acknowledged":true,"shards_acknowledged":true}%

2、给索引demo_v1添加几条数据

#给索引demo_v1添加了type=fruit的3条数据,每条数据用name和tag两个字段
> curl -XPOST 'localhost:9200/_bulk?pretty' -d'
{ "index" : { "_index" : "demo_v1", "_type" : "fruit", "_id" : "" }}
{ "name" : "苹果","tag":"苹果,水果,红富士"}
{ "create" : { "_index" : "demo_v1", "_type" : "fruit", "_id" : "" }}
{ "name" : "香蕉","tag":"香蕉,水果,海南,弯弯,小黄人"}
{ "index" : { "_index" : "demo_v1", "_type" : "fruit", "_id" : "" }}
{ "name" : "西瓜","tag":"西瓜,水果,圆形,绿,闰土"}
'
#返回
{
"took" : ,
"errors" : false,
"items" : [
{
"index" : {
"_index" : "demo_v1",
"_type" : "fruit",
"_id" : "",
"_version" : ,
"result" : "created",
"_shards" : {
"total" : ,
"successful" : ,
"failed" :
},
"created" : true,
"status" :
}
},
{
"create" : {
"_index" : "demo_v1",
"_type" : "fruit",
"_id" : "",
"_version" : ,
"result" : "created",
"_shards" : {
"total" : ,
"successful" : ,
"failed" :
},
"created" : true,
"status" :
}
},
{
"index" : {
"_index" : "demo_v1",
"_type" : "fruit",
"_id" : "",
"_version" : ,
"result" : "created",
"_shards" : {
"total" : ,
"successful" : ,
"failed" :
},
"created" : true,
"status" :
}
}
]
}

3、给索引demo_v1设置别名demo

#设置别名
> curl -XPUT 'localhost:9200/demo_v1/_alias/demo'
{"acknowledged":true}%

4、使用别名查看信息

#使用别名查看一下数据,是可以查询到的
> curl -XGET 'localhost:9200/demo/fruit/_search?pretty' #查看mapping
> curl -XGET 'localhost:9200/demo/fruit/_mapping?pretty'
#返回
{
"demo_v1" : {
"mappings" : {
"fruit" : {
"properties" : {
"name" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" :
}
}
},
"tag" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" :
}
}
}
}
}
}
}
} #检索数据
> curl -XGET 'http://localhost:9200/demo/fruit/_search?pretty' -d '{
"query" : {
"term" : { "tag" : "水" }
}
}'
#返回
{
"took" : ,
"timed_out" : false,
"_shards" : {
"total" : ,
"successful" : ,
"failed" :
},
"hits" : {
"total" : ,
"max_score" : 0.28582606,
"hits" : [
{
"_index" : "demo_v1",
"_type" : "fruit",
"_id" : "",
"_score" : 0.28582606,
"_source" : {
"name" : "苹果",
"tag" : "苹果,水果,红富士"
}
},
{
"_index" : "demo_v1",
"_type" : "fruit",
"_id" : "",
"_score" : 0.27233246,
"_source" : {
"name" : "西瓜",
"tag" : "西瓜,水果,圆形,绿,闰土"
}
},
{
"_index" : "demo_v1",
"_type" : "fruit",
"_id" : "",
"_score" : 0.24257512,
"_source" : {
"name" : "香蕉",
"tag" : "香蕉,水果,海南,弯弯,小黄人"
}
}
]
}
}

数据因为先前创建索引时没有设置mapping,所以这些设置都是默认设置,分词器也默认标准分词器。

上面检索标签tag中带有“水”的数据,都查询出来了,说明默认分词器把“水果”这个词拆分了。

如果我们需要tag字段按照逗号分词,“水果”作为一个完整的词不拆分该怎么弄呢?

5、新建一个索引demo_v2,同时自定义逗号分词器,并把逗号分词器应用到tag字段上

#新建索引demo_v2
> curl -XPUT 'http://localhost:9200/demo_v2/' -d'{
"settings": {
"index": {
"analysis": {
"analyzer": {
"douhao_analyzer": {
"pattern": ",",
"type": "pattern"
}
}
},
"number_of_shards": ,
"number_of_replicas":
}
},
"mappings": {
"fruit": {
"properties": {
"name": {
"type": "text",
"index": "not_analyzed"
},
"tag": {
"type": "string",
"analyzer": "douhao_analyzer",
"search_analyzer": "douhao_analyzer"
}
}
}
}
}'
#返回
{"acknowledged":true,"shards_acknowledged":true}%

关于mapping设置及分词器设置可参见官方文档:

https://www.elastic.co/guide/en/elasticsearch/reference/5.3/mapping.html#mapping-type

https://www.elastic.co/guide/en/elasticsearch/reference/5.3/analysis-analyzers.html

6、同步索引demo_v1中的数据到demo_v2

我使用工具elasticdump同步数据,ElasticDump是一个ElasticSearch的数据导入导出开源工具包。

官方地址:https://github.com/taskrabbit/elasticsearch-dump

同步命令如下:

> elasticdump --input='http://localhost:9200/demo_v1'  --output='http://localhost:9200/demo_v2' --type=data
Wed, Jun :: GMT | starting dump
Wed, Jun :: GMT | got objects from source elasticsearch (offset: )
Wed, Jun :: GMT | sent objects to destination elasticsearch, wrote
Wed, Jun :: GMT | got objects from source elasticsearch (offset: )
Wed, Jun :: GMT | Total Writes:
Wed, Jun :: GMT | dump complete

7、验证一下demo_v2中的数据

#检索tag中包含“水”的数据,检索不到就是正常的
curl -XGET 'http://localhost:9200/demo_v2/fruit/_search?pretty' -d '{
"query" : {
"term" : { "tag" : "水" }
}
}' #检索tag中包含“水果”的数据,可以全部检索到
curl -XGET 'http://localhost:9200/demo_v2/fruit/_search?pretty' -d '{
"query" : {
"term" : { "tag" : "水果" }
}
}'

8、移除索引demo_v1的别名demo,同时设置索引demo_v2的别名为demo

curl -XPOST 'localhost:9200/_aliases?pretty' -d'{
"actions" : [
{ "remove" : { "index" : "demo_v1", "alias" : "demo" } },
{ "add" : { "index" : "demo_v2", "alias" : "demo" } }
]}'

9、删除索引demo_v1

curl -XDELETE 'localhost:9200/demo_v1'

至此整个迁移完成

ok!

学习用Node.js和Elasticsearch构建搜索引擎(7):零停机时间更新索引配置或迁移索引的更多相关文章

  1. 学习用Node.js和Elasticsearch构建搜索引擎(6):实际项目中常用命令使用记录

    1.检测集群是否健康. curl -XGET 'localhost:9200/_cat/health?v' #后面加一个v表示让输出内容表格显示表头 绿色表示一切正常,黄色表示所有的数据可用但是部分副 ...

  2. 学习用Node.js和Elasticsearch构建搜索引擎(1):了解并运行Elasticsearch

    1.学习Elasticsearch概述. 了解Elasticsearch是什么?能做什么?可以查一下elasticsearch.lucene等的相关介绍,另外也可以查查资料比较一下其它的搜索引擎sph ...

  3. 学习用Node.js和Elasticsearch构建搜索引擎(4): 构建Elasticsearch搜索引擎

    一.目标 使用node搭建一个知识库检索系统,要求词条平均检索速度必须在1s以内. 二.思路. 本人思路如下图. 橙色部分为我们要开发的内容, ES服务搭建(暂时用单节点测试,集群搭建以后再说), 三 ...

  4. 学习用Node.js和Elasticsearch构建搜索引擎(2):一些检索命令

    1.Elasticsearch搜索数据有两种方式. 一种方式是通过REST请求URI,发送搜索参数: 另一种是通过REST请求体,发送搜索参数.而请求体允许你包含更容易表达和可阅读的JSON格式.这个 ...

  5. 学习用Node.js和Elasticsearch构建搜索引擎(5):mac本机部署canal

    1.背景介绍 最近做的一个项目需要快速检索数据,经过商讨后采用了ElasticSearch作为快速检索数据引擎,但是数据如何同步到ES中是个问题,我们最开始计划了定时任务.mysql trigger等 ...

  6. 学习用Node.js和Elasticsearch构建搜索引擎(3):使用curl命令操作elasticsearch

    使用Elasticsearch不免要提到curl工具,curl是利用URL语法在命令行方式下工作的开源文件传输工具.官网地址:https://curl.haxx.se/ 因为elasticsearch ...

  7. Elasticsearch零停机时间更新索引配置或迁移索引

    本文介绍Elasticsearch零宕机时间更新索引配置映射内容的方法,包括字段类型.分词器.分片数等.方法原理就是,利用别名机制,给索引配置别名,所有应用程序都通过别名访问索引.重建索引,通过索引原 ...

  8. 如何用 Node.js 和 Elasticsearch 构建搜索引擎

    Elasticsearch 是一款开源的搜索引擎,由于其高性能和分布式系统架构而备受关注.本文将讨论其关键特性,并手把手教你如何用它创建 Node.js 搜索引擎. Elasticsearch 概述 ...

  9. 学习用node.js建立一个简单的web服务器

    一.建立简单的Web服务器涉及到Node.js的一些基本知识点: 1.请求模块 在Node.js中,系统提供了许多有用的模块(当然你也可以用JavaScript编写自己的模块,以后的章节我们将详细讲解 ...

随机推荐

  1. 引入CSS的三种方式

    虽然入职已经大半年,并自诩前端工程师,但是我真的不会……(有一种我有罪我该死的感觉 从CSS 样式代码插入的形式来看基本可以分为以下3种:内联式.嵌入式和外部式三种. 1.内联式 内联式css样式表就 ...

  2. DocumentFragment对象

    一般动态创建html元素都是创建好了直接appendChild()上去,但是如果要添加大量的元素还用这个方法的话就会导致大量的重绘以及回流,所以需要一个'缓存区'来保存创建的节点,然后再一次性添加到父 ...

  3. SpringBoot(6) SpringBoot配置全局异常

    1.全局异常 @ControllerAdvice 如果是返回json数据 则用 RestControllerAdvice,就可以不加 @ResponseBody //捕获全局异常,处理所有不可知的异常 ...

  4. 【NET CORE微服务一条龙应用】第三章 认证授权与动态权限配置

    介绍 系列目录:[NET CORE微服务一条龙应用]开始篇与目录 在微服务的应用中,统一的认证授权是必不可少的组件,本文将介绍微服务中网关和子服务如何使用统一的权限认证 主要介绍内容为: 1.子服务如 ...

  5. man nfsd(rpc.nfsd中文手册)

    本人译作集合:http://www.cnblogs.com/f-ck-need-u/p/7048359.html rpc.nfsd() System Manager's Manual rpc.nfsd ...

  6. nginx详解反向代理、负载均衡、LNMP架构上线动态网站(week4_day1_part1)-技术流ken

    nginx介绍 Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为“engine X”,是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理 ...

  7. python模块之pickle、shelve、json

    一 什么是序列化 序列化指的是将内存中的数据结构转化为一种中间格式,并存储到硬盘上. (反序列化:将硬盘上存储的中间格式数据再还原为内存中的数据结构) 二 为什么要序列化 持久保持状态 需知一个软件/ ...

  8. spark之JDBC开发(实战)

    一.概述 Spark Core.Spark-SQL与Spark-Streaming都是相同的,编写好之后打成jar包使用spark-submit命令提交到集群运行应用$SPARK_HOME/bin#. ...

  9. spark之scala程序开发(本地运行模式):单词出现次数统计

    准备工作: 将运行Scala-Eclipse的机器节点(CloudDeskTop)内存调整至4G,因为需要在该节点上跑本地(local)Spark程序,本地Spark程序会启动Worker进程耗用大量 ...

  10. [转]laravel DB类SQL语句操作(CURD)

    本文转自:https://blog.csdn.net/woshihaiyong168/article/details/52992812 版权声明:本文为勇哥原创文章,转载请注明出处哦!!! https ...