学习用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编写自己的模块,以后的章节我们将详细讲解 ...
随机推荐
- k8s~术语解释
文章参考:https://www.kubernetes.org.cn 简介 Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简 ...
- 微信小程序-canvas绘制文字实现自动换行
在使用微信小程序canvas绘制文字时,时常会遇到这样的问题:因为canvasContext.fillText参数为 我们只能设置文本的最大宽度,这就产生一定的了问题.如果我们绘制的文本长度不确定或者 ...
- ELK实践(一):基础入门
虽然用了ELK很久了,但一直苦于没有自己尝试搭建过,所以想抽时间尝试尝试.原本打算按照教程 <ELK集中式日志平台之二 - 部署>(作者:樊浩柏科学院) 进行测试的,没想到一路出了很多坑, ...
- ajax实现文档导出及下载
做导出一直遇到个问题就是不能用ajax实现一步导出文档,即导出加下载.今天突然想到可以分开来做就上网搜了下,发现一篇比较不错的文章(http://www.cnblogs.com/zj0208/p/59 ...
- JavaScript和Ajax部分(4)
31. 什么是jQuery选择器 1)jQuery选择器继承了CSS与Path语言的部分语法,允许通过标签名.属性名或内容对DOM元素进行快速.准确的选择,而不必担心浏览器的兼容性,通过jQuery选 ...
- Facebook ATC弱网环境搭建
用户的网络环境千姿百态,弱网的.高延时的.丢包的.常有用户反馈偶发bug,我们测试人员却始终无法复现,根据用户的描述,开发排查可能是网络不稳定导致的,所以急需建个弱网环境来测试. 弱网工具简介: Au ...
- .Net Core 中间件之主机地址过滤(HostFiltering)源码解析
一.介绍 主机地址过滤中间件相当于一个白名单,标记哪些主机地址能访问接口. 二.使用 新建WebAPI项目,修改Startup中的代码段如下所示.下面表示允许主机名为“localhost”的主机访问( ...
- 自定义Appium
改造appium-android-driver 这个driver是UIAutomator1的driver,负责UIAutomator1的服务启动.停止.命令接收和执行. 工程结构 appium-and ...
- 网络爬虫之html2md
前言 上周利用java爬取的网络文章,一直未能利用java实现html转化md,整整一周时间才得以解决. 虽然本人的博客文章数量不多,但是绝不齿于手动转换,毕竟手动转换浪费时间,把那些时间用来做些别的 ...
- [转]Angular引入第三方库
本文转自: https://blog.csdn.net/yuzhiqiang_1993/article/details/71215232 版权声明:本文为博主原创文章,转载请注明地址.如果文中有什么纰 ...