Elasticsearch的mapping一旦创建,只能增加字段,而不能修改已经mapping的字段。但现实往往并非如此啊,有时增加一个字段,就好像打了一个补丁,一个可以,但是越补越多,最后自己都觉得惨不忍睹了。怎么办??
这里有一个方法修改mapping,那就是重新建立一个index,然后创建一个新的mapping。你可能会问,这要是在生产环境,可行吗?答案是,如果你一开始就采取了合适的设计,这个完全是可以做到平滑过渡的。
采取什么合理设计呢?就是我们的程序访问索引库时,始终使用同义词来访问,而不要使用真正的indexName。在reindex完数据之后,修改之前的同义词即可。明白了吗?
参考上面的思路,我们来一步一步做。
step1、创建一个索引,这个索引的名称最好带上版本号,比如my_index_v1,my_index_v2等。
step2、创建一个指向本索引的同义词。
curl -XPOST localhost:9200/_aliases -d ' { "actions": [ { "add": { "alias": "my_index", "index": "my_index_v1" }} ] } '
此时,你可以通过同义词my_index访问。包括创建索引,删除索引等。
step3,需求来了,需要更改mapping了,此时,你需要创建一个新的索引,比如名称叫my_index_v2(版本升级).,在这个索引里面创建你新的mapping结构。然后,将新的数据刷入新的index里面。在刷数据的过程中,你可能想到直接从老的index中取出数据,然后更改一下格式即可。如何遍历所有的老的index数据,请参考这里。
step4,修改同义词。将指向v1的同义词,修改为指向v2。http接口如下:
curl -XPOST localhost:9200/_aliases -d ' { "actions": [ { "remove": { "alias": "my_index", "index": "my_index_v1" }}, { "add": { "alias": "my_index", "index": "my_index_v2" }} ] } '
step5,删除老的索引。
curl -XDELETE localhost:9200/my_index_v1
除此之外,还有几个其他的方法也可以更改mapping。
1、修改程序,添加字段。
就是说,你可以在mapping中增加一个新的字段,然后你对新的字段进行访问统计搜索。这个就要修改两个地方,一个是修改mapping增加字段,还有就是修改你的程序,把字段改成新的字段。
2、更改字段类型为multi_field。
multi_field允许为一个字段设置多个数据类型。应用multi_field的一个最典型的场景是:一个类型定义为analyed,这个字段可以被搜索到,一个类型定义为不分词,这个字段用于排序。
任何字段都可以被更新为multi_field(类型为object和nested的类型除外)。假设现在有一个字段,名字叫created,类型现在为string。
{ "created": { "type": "string"} }
我们可以将它增加一种类型,使他既能被当做字符串又能当做日期型。
curl -XPUT localhost:9200/my_index/my_type/_mapping -d ' { "my_type": { "properties": { "created": { "type": "multi_field", "fields": { "created": { "type": "string" }, "date": { "type": "date" } } } } } } '
采用标准的重建索引方式的时候,我们推荐大家为每一个type都建立一个索引同义词,即便在同一个索引库中的多个type,也推荐使用建立一个同义词来访问。即一个index里面包含一个type,因为在elasticsearch中,跨index查询数据是很方便的。这样,我们就可以在reindex一个type后,立即将type生效,而不是将index下面所有的type都重建完后,同义词才能生效。
相关推荐
Elasticsearch reindex 修改索引定义、设置、备份索引数据、跨集群数据迁移,reindex使用介绍
Spring Boot elasticsearch7.6.2基础操作:创建索引、新增数据、查询数据
ElasticSearch映射生成器该工具允许在创建索引时为索引生成映射或设置。 使用注释描述定义的映射字段安装二进制文件部署在Maven Central上,您可以将工件导入到您的项目中: < dependency> < groupId>...
lasticsearch整合分词、创建索引、搜索例子,elasticsearch版本为1.0,索引数据从数据表中动态读取生成,有关键字高亮效果,查询分页 1 在dababase目录中导致相关的数据库文件,修改DBCOperation java文件数据库连接...
以脚本方式创建es 索引和结构映射. 莎士比亚在不经意间这样说过,本来无望的事,大胆尝试,往往能成功。我希望诸位也能好好地体会这句话。 一般来讲,我们都必须务必慎重的考虑考虑。 就我个人来说,我秃头了对我的...
elasticsearch5.5.1的javaapi,含创建索引、mapping、查询、增加删除文档
资源方法有单个的增删改查,模糊查询分页 ,固定字段的模糊查询,所有属性字段的模糊查询
ElasticSearch数据导出 elasticsearch单文档数据导出 支持自定义查询 导出数据Json文件
(狂神)ElasticSearch快速入门笔记,ElasticSearch基本操作以及爬虫(Java-ES仿京东实战),包含了小狂神讲的东西,特别适合新手学习,笔记保存下来可以多看看。好记性不如烂笔头哦~,ElasticSearch,简称es,es是一个...
arcgis elasticSearch es 矢量数据导入插件 数据建模 mapping indexsetting 字段映射 索引建模支持geoshape、shape,text索引支持keyword/ngram/edgeNgram/ikSmart,快速导入,兼容multipolygon,带洞,多面,使用时...
Elasticsearch-深入理解索引原理
内容包括9部分 一、 Elasticsearch 简介 简单描述Elasticsearch ...五、Elasticsearch索引和分片 六、索引过程 七、Elasticsearch存储原理 八、Elasticsearch使用过程中的坑 九、Elasticsearch写一致性保障
## ElasticSearch ### 概念 - 倒排索引 - 文档:每一条数据就是一个文档 - 词条:由文档分词得到,为词条创建索引 - 查询过程:将用户的搜索内容进行分词,根据词到索引中进行查找 - 与正向索引比较:正向...
对elasticsearch的索引做了一个简单的介绍,可以作为项目培训的课件使用
分享一套完整版视频课程——分布式搜索引擎Elasticsearch开发实战基础篇 (ElasticSearch、ELK、搜索引擎、Lucene),本教程旨在带领大家进入搜索引擎领域...Elasticsearch索引和Mapping Elasticsearch搜索深入 Elastic
elasticsearch 同义词创建索引实例
Elasticsearch+thinkphp5.1后台管理索引和文档+权限管理,可查看https://blog.csdn.net/weixin_39934453/article/details/120097526
elasticsearch服务器安装包 jar包..3
Elasticsearch 可以用于:分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索;实时分析的分布式搜索引擎;可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。 Elasticsearch的文件存储 ...