学习用Node.js和Elasticsearch构建搜索引擎(7):零停机时间更新索引配置或迁移索引
上一篇说到如果一个索引的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):零停机时间更新索引配置或迁移索引的更多相关文章
- 学习用Node.js和Elasticsearch构建搜索引擎(6):实际项目中常用命令使用记录
1.检测集群是否健康. curl -XGET 'localhost:9200/_cat/health?v' #后面加一个v表示让输出内容表格显示表头 绿色表示一切正常,黄色表示所有的数据可用但是部分副 ...
- 学习用Node.js和Elasticsearch构建搜索引擎(1):了解并运行Elasticsearch
1.学习Elasticsearch概述. 了解Elasticsearch是什么?能做什么?可以查一下elasticsearch.lucene等的相关介绍,另外也可以查查资料比较一下其它的搜索引擎sph ...
- 学习用Node.js和Elasticsearch构建搜索引擎(4): 构建Elasticsearch搜索引擎
一.目标 使用node搭建一个知识库检索系统,要求词条平均检索速度必须在1s以内. 二.思路. 本人思路如下图. 橙色部分为我们要开发的内容, ES服务搭建(暂时用单节点测试,集群搭建以后再说), 三 ...
- 学习用Node.js和Elasticsearch构建搜索引擎(2):一些检索命令
1.Elasticsearch搜索数据有两种方式. 一种方式是通过REST请求URI,发送搜索参数: 另一种是通过REST请求体,发送搜索参数.而请求体允许你包含更容易表达和可阅读的JSON格式.这个 ...
- 学习用Node.js和Elasticsearch构建搜索引擎(5):mac本机部署canal
1.背景介绍 最近做的一个项目需要快速检索数据,经过商讨后采用了ElasticSearch作为快速检索数据引擎,但是数据如何同步到ES中是个问题,我们最开始计划了定时任务.mysql trigger等 ...
- 学习用Node.js和Elasticsearch构建搜索引擎(3):使用curl命令操作elasticsearch
使用Elasticsearch不免要提到curl工具,curl是利用URL语法在命令行方式下工作的开源文件传输工具.官网地址:https://curl.haxx.se/ 因为elasticsearch ...
- Elasticsearch零停机时间更新索引配置或迁移索引
本文介绍Elasticsearch零宕机时间更新索引配置映射内容的方法,包括字段类型.分词器.分片数等.方法原理就是,利用别名机制,给索引配置别名,所有应用程序都通过别名访问索引.重建索引,通过索引原 ...
- 如何用 Node.js 和 Elasticsearch 构建搜索引擎
Elasticsearch 是一款开源的搜索引擎,由于其高性能和分布式系统架构而备受关注.本文将讨论其关键特性,并手把手教你如何用它创建 Node.js 搜索引擎. Elasticsearch 概述 ...
- 学习用node.js建立一个简单的web服务器
一.建立简单的Web服务器涉及到Node.js的一些基本知识点: 1.请求模块 在Node.js中,系统提供了许多有用的模块(当然你也可以用JavaScript编写自己的模块,以后的章节我们将详细讲解 ...
随机推荐
- 如何在 Linux 中查看可用的网络接口
在我们安装完一个 Linux 系统后最为常见的任务便是网络配置了.当然,你可以在安装系统时进行网络接口的配置.但是,对于某些人来说,他们更偏爱在安装完系统后再进行网络的配置或者更改现存的设置.众所周知 ...
- 200 行代码使用 C# 实现区块链
文章原文来自:Code your own blockchain in less than 200 lines of Go!,原始文章是通过 Go 语言来实现自己的区块链的,这里我们参照该文章来使用 C ...
- deque源码3(deque的构造与内存、ctor、push_back、push_front)
deque源码1(deque概述.deque中的控制器) deque源码2(deque迭代器.deque的数据结构) deque源码3(deque的构造与内存.ctor.push_back.push_ ...
- w7 python35 输出中文乱码解决
1.乱码纷争在python自带的控制台正常 但是cmd就跪了,用的vs code也是同样问题,不想以前学习python27那么单纯,前面加个#UTF就可以了 网上寻求解决办法 import io,sy ...
- eclipse team 没有svn
从资源库把项目导出来之后 右键点击项目 选择第二个 出现 选择SVN 出现你资源库的地址 finish 完成. 这时项目就会出现地址了 就有提交了
- 学习 spring-boot (一)
学习文章来自:http://www.ityouknow.com/spring-boot.html Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初 ...
- Linux官方源、镜像源汇总
本文收录在日常运维杂烩系列 一.站点版 1.企业站 搜狐:http://mirrors.sohu.com/ 网易:http://mirrors.163.com/ 阿里云:http://mirrors. ...
- python使用多线程
threading 模块支持守护线程, 其工作方式是:守护线程一般是一个等待客户端请求服务的服务器. 如果把一个线程设置为守护线程,进程退出时不需要等待这个线程执行完成. 如果主线程准备退出时,不需要 ...
- 【mac】ansible安装及基础使用
安装 环境释放 mac 10.12.5 #more /System/Library/CoreServices/SystemVersion.plist 安装命令 #ruby -e "$(cur ...
- 建了个QQ群,不定期分享一些资料,欢迎加入
技术源于生活,大家一起进阶 Java学习交流QQ群:603654340 大数据学习交流QQ群:217770236 感谢您的来访,不妨关注一下我吧……