对于提供全文检索的工具来说,索引时一个关键的过程——只有通过索引操作,才能对数据进行分析存储、创建倒排索引,从而让使用者查询到相关的信息。

本篇就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 之 数据索引相关推荐

  1. ElasticSearch查询篇索引映射文档数据准备

    elasticsearch查询篇索引映射文档数据准备 我们后面要讲elasticsearch查询,先来准备下索引,映射以及文档: 我们先用Head插件建立索引film,然后建立映射 POST http ...

  2. elasticsearch的多索引联合查询以及范围日期查询示例

    一.前言 首先,博主这边要用ES来代替传统的mysql操作,那么原来的多表联合查询操作自然也要转换为多索引联合查找.这里使用elasticsearch-php库来操作ES,原生的ES也是大同小异的. ...

  3. 基于Elasticsearch的数据报表方案

    文  | 闵令超 网易智企高级应用开发工程师 前言 数据报表分析对于企业管理者的分析决策有着至关重要的作用,因此数据报表的灵活可用以及数据的准确性显得至关重要.本文会介绍基于 Elasticsearc ...

  4. 专注数据,打造阿里云Elasticsearch“一站式”数据服务体系

    众所周知,Elasticsearch的问世使得各种结构.非结构数据得以实现实时搜索.分析的可能,越来越多的用户使用ES集群(即Elasticseach集群,下文均简称ES集群)实现数据的升值与挖掘.而 ...

  5. elasticsearch date_MySQL数据实时增量同步到Elasticsearch

    Mysql到Elasticsearch的数据同步,一般用ETL来实现,但性能并不理想,目前大部分的ETL是定时查询Mysql数据库有没有新增数据或者修改数据,如果数据量小影响不大,但如果几百万上千万的 ...

  6. ElasticSearch入门教程-索引

    ElasticSearch入门教程-索引 在本节中,我们将向Elasticsearch添加一些索引,映射和数据.此数据将用于本教程中说明的示例中. 创建索引 PUT http://localhost: ...

  7. 【Elasticsearch】Elasticsearch中数据是如何存储的

    1.概述 转载:Elasticsearch中数据是如何存储的 前言 很多使用Elasticsearch的同学会关心数据存储在ES中的存储容量,会有这样的疑问:xxTB的数据入到ES会使用多少存储空间. ...

  8. 【Elasticsearch】 Elasticsearch中数据是如何存储的

    1.概述 转载:https://elasticsearch.cn/article/6178 转载防丢失 前言 很多使用Elasticsearch的同学会关心数据存储在ES中的存储容量,会有这样的疑问: ...

  9. Elasticsearch基础11——索引之别名使用

    Elasticsearch的别名 别名的作用 在之前的文章中,介绍过Elasticsearch索引创建之后,假如尝试修改字段的类型的时候,除了重建索引之外没有别的办法. 假如我们尝试重建一个新的索引并 ...

最新文章

  1. 全球与中国太赫兹安检仪市场竞争状况及未来发展趋向分析报告2022-2028年版
  2. 美工一流的个人网站源码系列(2),不漂亮你可以不下载!
  3. StackExchange.Redis 使用 (一)
  4. 牛客网-数据结构笔试题目(八)-离子能力跃迁问题求解
  5. RIP实验总结之一被动接口和单播更新
  6. 各科老师的语言风格一览,太真实了哈哈哈哈哈哈
  7. 顶尖学府 加州伯克利大学开发高效机器人操纵框架
  8. Mysql 行前自动排序_mysql 取得行号后再排序
  9. php1.9,PHP1.9--数组
  10. Servlet具体解释
  11. 【脑电信号】基于matlab小波工具箱脑电降噪【含Matlab源码 707期】
  12. 页面中文乱码,tomcat服务器,jsp乱码
  13. 合作动态 | 方正璞华与日立签订战略合作协议,加快推进数字化管理变革!
  14. 【机器学习】显卡、GPU、NVIDIA、CUDA、cuDNN
  15. INCREMENTAL NETWORK QUANTIZATION: TOWARDS LOSSLESS CNNS WITH LOW-PRECISION WEIGHTS
  16. 福禄克DTX-1800其配件DTX-CHA002通道适配器CHANNEL更换RJ45插座小记
  17. 后端程序员要会linux吗,后端程序员必备的Linux基础知识
  18. DynamoDB 小结
  19. python程序设计丁亚涛版_Python程序设计
  20. 人工智能?AI?都是什么 四句话就让你彻底明白

热门文章

  1. IE 7 Standard 模式问题总结
  2. 学习IDisposable,对于此中的不解……请高手指点
  3. 重磅!CVPR 2020 论文今起全面开放下载,含主会和workshop
  4. 精准高效估计多人3D姿态,美图北航分布感知式单阶段模型(CVPR 2022)
  5. 如何评价MSRA视觉组最新提出的Deformable ConvNets V2?
  6. 阿里巴巴提出Auto-Context R-CNN算法,刷出Faster RCNN目标检测新高度
  7. tableview插入刷新_iOS开发之UITableView与UISearchController实现搜索及上拉加载,下拉刷新实例代码...
  8. 学Python的初体验——模块简述
  9. Zbrush学习指南—小白也能学会得雕刻软件
  10. 【LeetCode刷题记录】LeetCode经典题目数组求和及哈希表的使用!