Elasticsearch 之 数据索引
对于提供全文检索的工具来说,索引时一个关键的过程——只有通过索引操作,才能对数据进行分析存储、创建倒排索引,从而让使用者查询到相关的信息。
本篇就ES的数据索引操作相关的内容展开:
更多内容参考:Elasticsearch资料汇总
索引操作
最简单的用法就是指定索引操作的index索引、type类型、ID(需要区分动词的索引和名次的索引),参考下面的例子:
$ curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '{"user" : "kimchy","post_date" : "2009-11-15T14:12:12","message" : "trying out Elasticsearch" }'
这样就在索引twitter中的tweet类型中存储了id为1的数据。
索引操作的结果为:
{"_shards" : {"total" : 10,"failed" : 0,"successful" : 10},"_index" : "twitter","_type" : "tweet","_id" : "1","_version" : 1,"created" : true }
上面的_shards中描述了分片相关的信息,即当前一共有10个分片(5个主分片,5个副分片,并且均可用);以及index、type、id、version相关的信息。
自动创建索引
如果上面执行操作前,ES中没有twitter这个索引,那么默认会直接创建这个索引;并且type字段也会自动创建。也就是说,ES并不需要像传统的数据库事先定义表的结构。
每个索引中的类型都有一个mapping映射,这个映射是动态生成的,因此当增加新的字段时,会自动增加mapping的设置。
通过在配置文件中设置action.auto_create_index为false,可以关闭自动创建index这个功能。
自动创建索引功能,也可以设置黑名单或者白名单,比如:
设置action.auto_create_index为 +aaa*,-bbb*,'+'号意味着允许创建aaa开头的索引,'-'号意味着不允许创建bbb开头的索引。
关于版本号
版本号维护了一个文档的状态,我们只会针对最高版本号的文档进行操作。
文档号不仅可以在文档中进行存储,也可以在外部维护版本号,具体的参考官方文档吧....
操作类型op_type
ES通过参数op_type提供“缺少即加入”的功能,即如果ES中没有该文档,就进行索引;如果有了,则报错返回。
如果已经存在id为1的文档,则会报错,直接使用_create API,效果一样:
自动创建ID:
按照最上面的例子来说,ES会把我们指定的文档id做为ID。如果不指定ID,那么就会随机分配一个:
路由routing
ES是通过路由来进行查询的,一般一个查询会经过下面的过程:
1 节点接收请求,广播给每个分片
2 分片接收请求,进行计算,返回结果
3 合并消息,返回
如果我们设置了路由信息,就相当于告诉了ES,该去哪个分片查询数据,也就取消了广播合并这个过程,从而提高了查询的效率。使用方法:
$ curl -XPOST 'http://localhost:9200/twitter/tweet?routing=kimchy' -d '{"user" : "kimchy","post_date" : "2009-11-15T14:12:12","message" : "trying out Elasticsearch" }'
路由是通过哈希来实现的,如果我们在索引的时候直接指定routing的值,就会按照这个值计算哈希值,分配分片;如果不指定,就会根据ID来分配。由于一般情况下ID都是随机生成的,这样就可以保证默认情况下分片的数据负载是相同的。如果我们需要在特定的分片保存特定的内容,就可以使用路由指定分片。不过这样做,日后随着数据量的增加,也可能会导致某个分片压力过大。
另外,也可以在定义mapping的时候,直接设置routing的相关值。这样这个类型中的数据如果不指定routing的值,默认就会使用mapping中定义的那个路由值。
parent设置父子关系
ES中可能会涉及到一些文档的从属关系,使用parent参数,可以设置这种关系:
$ curl -XPUT localhost:9200/blogs/blog_tag/1122?parent=1111 -d '{"tag" : "something" }'
_timestamp设置时间戳
时间戳字段可以也可以在索引操作时指定:
$ curl -XPUT localhost:9200/twitter/tweet/1?timestamp=2009-11-15T14%3A12%3A12 -d '{"user" : "kimchy","message" : "trying out Elasticsearch" }'
如果没有手动指定时间戳,_source中也不存在时间戳,就会设置为索引指定的时间。不过需要指定mapping中的_timestamp设置为enable
PUT my_index {"mappings": {"my_type": {"_timestamp": { "enabled": true}}} }
ttl文档过期
ES中也可以设置文档自动过期,过期是设置一个正的时间间隔,然后以_timestamp为基准,如果超时,就会自动删除。
如果设置为时间戳:
curl -XPUT 'http://localhost:9200/twitter/tweet/1?ttl=86400000' -d '{"user": "kimchy","message": "Trying out elasticsearch, so far so good?" }'
如果设置为日期数学表达式:
curl -XPUT 'http://localhost:9200/twitter/tweet/1?ttl=1d' -d '{"user": "kimchy","message": "Trying out elasticsearch, so far so good?" }'
也可以在JSON字段中指定:
curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '{"_ttl": "1d","user": "kimchy","message": "Trying out elasticsearch, so far so good?" }'
手动刷新
由于ES并不是一个实时索引搜索的框架,因此数据在索引操作后,需要等1秒钟才能搜索到。这里的搜索是指进行检索操作。如果你使用的是get这种API,就是真正的实时操作了。他们之间的不同是,检索可能还需要进行分析和计算分值相关性排序等操作。
为了在数据索引操作后,马上就能搜索到,也可以手动执行refresh操作。只要在API后面添加refresh=true即可。
这种操作仅推荐在特殊情况下使用,如果在大量所以操作中,每个操作都执行refresh,那是很耗费性能的。
Timeout超时
分片并不是随时可用的,当分片进行备份等操作时,是不能进行索引操作的。因此需要等待分片可用后,再进行操作。这时,就会出现一定的等待时间,如果超过等地时间则返回并抛出错误,这个等待时间可以通过timeout设置:
$ curl -XPUT 'http://localhost:9200/twitter/tweet/1?timeout=5m' -d '{"user" : "kimchy","post_date" : "2009-11-15T14:12:12","message" : "trying out Elasticsearch" }'
以上便是索引操作相关的知识,还有一些高级的知识,比如分片和版本号详细的用法,由于对ES还是理解的不够透彻,就先不做过多的讲述了,免得错误太多。
如有异议,还请多多指正。
转载于:https://www.cnblogs.com/xing901022/p/4999364.html
Elasticsearch 之 数据索引相关推荐
- ElasticSearch查询篇索引映射文档数据准备
elasticsearch查询篇索引映射文档数据准备 我们后面要讲elasticsearch查询,先来准备下索引,映射以及文档: 我们先用Head插件建立索引film,然后建立映射 POST http ...
- elasticsearch的多索引联合查询以及范围日期查询示例
一.前言 首先,博主这边要用ES来代替传统的mysql操作,那么原来的多表联合查询操作自然也要转换为多索引联合查找.这里使用elasticsearch-php库来操作ES,原生的ES也是大同小异的. ...
- 基于Elasticsearch的数据报表方案
文 | 闵令超 网易智企高级应用开发工程师 前言 数据报表分析对于企业管理者的分析决策有着至关重要的作用,因此数据报表的灵活可用以及数据的准确性显得至关重要.本文会介绍基于 Elasticsearc ...
- 专注数据,打造阿里云Elasticsearch“一站式”数据服务体系
众所周知,Elasticsearch的问世使得各种结构.非结构数据得以实现实时搜索.分析的可能,越来越多的用户使用ES集群(即Elasticseach集群,下文均简称ES集群)实现数据的升值与挖掘.而 ...
- elasticsearch date_MySQL数据实时增量同步到Elasticsearch
Mysql到Elasticsearch的数据同步,一般用ETL来实现,但性能并不理想,目前大部分的ETL是定时查询Mysql数据库有没有新增数据或者修改数据,如果数据量小影响不大,但如果几百万上千万的 ...
- ElasticSearch入门教程-索引
ElasticSearch入门教程-索引 在本节中,我们将向Elasticsearch添加一些索引,映射和数据.此数据将用于本教程中说明的示例中. 创建索引 PUT http://localhost: ...
- 【Elasticsearch】Elasticsearch中数据是如何存储的
1.概述 转载:Elasticsearch中数据是如何存储的 前言 很多使用Elasticsearch的同学会关心数据存储在ES中的存储容量,会有这样的疑问:xxTB的数据入到ES会使用多少存储空间. ...
- 【Elasticsearch】 Elasticsearch中数据是如何存储的
1.概述 转载:https://elasticsearch.cn/article/6178 转载防丢失 前言 很多使用Elasticsearch的同学会关心数据存储在ES中的存储容量,会有这样的疑问: ...
- Elasticsearch基础11——索引之别名使用
Elasticsearch的别名 别名的作用 在之前的文章中,介绍过Elasticsearch索引创建之后,假如尝试修改字段的类型的时候,除了重建索引之外没有别的办法. 假如我们尝试重建一个新的索引并 ...
最新文章
- 全球与中国太赫兹安检仪市场竞争状况及未来发展趋向分析报告2022-2028年版
- 美工一流的个人网站源码系列(2),不漂亮你可以不下载!
- StackExchange.Redis 使用 (一)
- 牛客网-数据结构笔试题目(八)-离子能力跃迁问题求解
- RIP实验总结之一被动接口和单播更新
- 各科老师的语言风格一览,太真实了哈哈哈哈哈哈
- 顶尖学府 加州伯克利大学开发高效机器人操纵框架
- Mysql 行前自动排序_mysql 取得行号后再排序
- php1.9,PHP1.9--数组
- Servlet具体解释
- 【脑电信号】基于matlab小波工具箱脑电降噪【含Matlab源码 707期】
- 页面中文乱码,tomcat服务器,jsp乱码
- 合作动态 | 方正璞华与日立签订战略合作协议,加快推进数字化管理变革!
- 【机器学习】显卡、GPU、NVIDIA、CUDA、cuDNN
- INCREMENTAL NETWORK QUANTIZATION: TOWARDS LOSSLESS CNNS WITH LOW-PRECISION WEIGHTS
- 福禄克DTX-1800其配件DTX-CHA002通道适配器CHANNEL更换RJ45插座小记
- 后端程序员要会linux吗,后端程序员必备的Linux基础知识
- DynamoDB 小结
- python程序设计丁亚涛版_Python程序设计
- 人工智能?AI?都是什么 四句话就让你彻底明白
热门文章
- IE 7 Standard 模式问题总结
- 学习IDisposable,对于此中的不解……请高手指点
- 重磅!CVPR 2020 论文今起全面开放下载,含主会和workshop
- 精准高效估计多人3D姿态,美图北航分布感知式单阶段模型(CVPR 2022)
- 如何评价MSRA视觉组最新提出的Deformable ConvNets V2?
- 阿里巴巴提出Auto-Context R-CNN算法,刷出Faster RCNN目标检测新高度
- tableview插入刷新_iOS开发之UITableView与UISearchController实现搜索及上拉加载,下拉刷新实例代码...
- 学Python的初体验——模块简述
- Zbrush学习指南—小白也能学会得雕刻软件
- 【LeetCode刷题记录】LeetCode经典题目数组求和及哈希表的使用!