ES快速入门
一、概念
1.ES基础概念
ES是ElasticSearch的缩写。ES是基于Apache Lucene的开源搜索引擎,是一款实时分布式搜索和分析引擎,提供RestfulAPI可以进行可视化的交互。具有如下特点:
1) 提供分布式的实时文件存储,每个字段都被索引并可被搜索;
2)实时分析的分布式搜索引擎;
3)可以扩展到上百万台服务器,能处理PB级结构化或非结构化的数据
2.NRT
NRT是近实时Near Realtime的缩写。ES是一款近实时的搜索平台,即意味着有轻微的延迟,在从开始索引文档到有结果的时间稍微延迟通常为1秒。
3.ES和SQL
ES也是一种数据库,学习ES可以对比SQL来理解和学习。下面先列出二者的关系如表-1,方便读者有个大概了解。第二节会详细介绍关于ES的常用术语。

二、存储相关
1.物理存储
1)Cluster
集群是一个或者一个以上的节点(服务器)的集合。并在所有节点上提供联合的索引和搜索功能。集群由唯一的名称标识,默认情况下是“elasticsearch”。该名称很重要,因为如果节点设置为通过其名称加入集群,则节点只能是集群的一部分。
2)Node
节点是作为集群一部分的单一服务器,存储您的数据,并参与集群的索引和搜索功能。就像一个集群一样,一个节点由一个名称来标识,默认情况下是一个随机的通用唯一标识符(UUID),它在启动时分配给该节点。所有的节点通过设置集群名cluster.name来确定属于某个集群。
3)Shard
由于索引存在存储可能超过单个节点的硬件限制的大量数据。例如,占用1TB磁盘空间的10亿个文档的单个索引可能不适合单个节点的磁盘,或者可能太慢,无法单独从单个节点提供搜索请求。因此分片就是为了解决这个问题。每个索引被分成若干个分片。分片被存储在不同的节点中。分片很重要,使用分片的作用:
a) 允许水平分割/缩放内容,提高扩展能力;
b) 允许在分片(可能在多个节点上)分布和并行操作,从而提高性能/吞吐量;
4)Replica
副本是分片的复制。副本的作用:
a) 如果分片/节点出现故障,则可提供高可用性
b) 允许扩展搜索量/吞吐量,因为可以对所有副本并行执行搜索
默认情默认情况下,ElasticSearch中的每个索引都分配了5个主分片和1个副本况下,ElasticSearch中的每个索引都分配了5个主分片和1个副本。创建索引后,您可以随时动态更改副本数,但不能更改主分片数。
2.逻辑存储
1)Index
索引是具有某种相似特征的文档的集合。例如,您可以拥有客户数据的索引,产品目录的另一个索引,以及订单数据的另一个索引。索引由名称(必须全部为小写)标识,该名称用于在针对其中的文档执行索引,搜索,更新和删除操作时引用索引。
2)Type
类型是您的索引的逻辑类别/分区,允许您将不同类型的文档存储在同一索引中,例如用户的一种类型,博客文章的另一种类型。在索引中不再可能创建多个类型,并且在以后的版本中将删除整个类型的概念。
3)Document
文档是可以索引的基本信息单元。例如,您可以为单个客户提供文档,单个产品的文档,单个订单的另一个文档。该文档以JSON(JavaScript Object Notation)表示,它是一种无处不在的互联网数据交换格式。
4)Field
多个字段组成一个文档。一个索引的所有文档类型中对于具有相同名称的字段必须是同一种数据类型,与SQL SERVER不同,同一数据库中不同表中相同名称的列数据类型可以不一样。
5)Mapping
映射就是字段即字段和字段类型的对应关系。映射机制用于进行字段类型确认,将每个字段匹配为一种确定的数据类型。例如:字段name,类型是String;字段age,类型是Integer。除此之外字段的类型也可以是日期、布尔值、数组、浮点数、对象等等。
三、基础操作
1.创建
增加一行数据,使用关键字Create。内容按照json数据,可以手动写,也可以根据已知的json格式创建。
语法模板一:
curl -XPOST localhost:9200/索引名/类型名/'-d'
{"title":"xxxx","text":"xxxx","date":"2014/01/01"}
备注:-d参数用于将数据放在http请求的body中发送
语法模板二:
curl -XPOST localhost:9200/create_index_action/索引名/类型名/ --data-binary @a.json
备注:依据据a.json创建
2.删除
删除一行数据,使用关键字Delete。
语法模板:
curl -XDELETE localhost:9200/索引名/类型名/ID
备注:ID号一般是自动生成的唯一标志符,也可以更具需要自定义。
3.修改
修改一行数据,使用关键字Update。
语法模板:
1)修改某一字段的值
curl -XPOST localhost:9200/索引名/类型名/ID号/_update?pretty
{
"doc":{"name":"wxxq"}
}
2)增加一个字段
curl -XPOST localhost:9200/索引名/类型名/ID号/_update?pretty
{
"doc":{"name":"wxxq","age":18}
}
3)使用脚本修改
curl -XPOST localhost:9200/索引名/类型名/ID号/_update?pretty
{
"script":"ctx._source.age+=5"
}
备注:ctx._source指的是即将更新的当前源文档
4.简单查询
查询数据,使用关键字Search。
语法模板:
1)空查询:
curl -XGET localhost:9200/_search?pretty
备注:返回索引中所有的文档
2)根据id号来查询:
curl -XGET localhost:9200/索引名/类型名/_search?q="_id":"AV4CnR6NuLtuw-m9JsB_"
3)模糊查询:
curl -XGET localhost:9200/_all/_search?q="add"
备注:查询有add的文档
5.批处理
批量处理数据,使用关键字bulk。
语法模板:
1)同时修改多个索引
curl -XPOST localhost:9200/索引名/类型名/_bulk?pretty
{"index":{"_id":"1"}}
{"name": "John Doe" }
{"index":{"_id":"2"}}
{"name": "Jane Doe" }
2)对多个索引进行不同的处理操作
curl -XPOST localhost:9200/索引名/类型名/_bulk?pretty
{"update":{"_id":"1"}}
{"doc": { "name": "John Doe becomes JaneDoe" } }
{"delete":{"_id":"2"}}
6.搜索结果释义
图-1是一张搜索结果的截图,下面将针对搜索结果的结构解释来查看数据内容。

搜索结果备注:
took:执行ES的搜索需要的时间
timed_out:是否超时
_shards:搜索了多少个分片,成功数量,失败数量
hits:搜索结果,通过键值对展示
hits.total:符合搜索条件的文件总数
hits.hits:实际搜索结果数组
_index:该条数据所在索引
_type:该条数据所在类型
_id:该数据的唯一标识符
_source:该条数据的内容,里面由多个fields组成
四、复杂查询
1.多条件查询
curl -XGET localhost:9200/school/student/_search{
"query":{
"bool":{
"must":[{"match":{"gender":"male"}},
{"match":{"age":18}}],
"should":["match":{"hobby":"music"}],
"must_not":["match":{"address":"BeiJing"}]
}},
"from":5,
"size":10,
"sort":{"age":{"order":"desc"}}
}
2.过滤器
curl -XGET localhost:9200/school/student/_search{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"range": {
"money": {
"gte": 20000,
"lte": 30000
}
}
}
}
},
"from":5,
"size":10,
"sort":{"age":{"order":"desc"}}
}
备注1:
gt 大于
gte 大于等于
lt 小于
lte 小于等于
备注2:
除了使用range过滤,还可以使用term,terms,exists,missing等
1) term用于精确匹配某些值,如数字,日期,布尔值
{"term":{"age":20}}
{"term":{"date":"2017-08-21"}}
2) terms与term类似,但允许指定多个匹配条件,当某个字段存在多个值时
{"terms":{
"tag":["search","full_text","nosql"]
}
}
3)exists包含某字段
{
"exists":{
"fields":"tittle"
}
}
4)missing没有某字段
{
"missing":{
"fields":"tittle"
}
}
3.聚合
聚合(aggregations)类似于SQL的Group By。
curl -XGET localhost:9200/school/student/_search{
"size":0,
"aggs":{
"group_by_age":{
"range":{
"field":"age",
"ranges":[{"from":20,
"to":30},
{"from":30,
"to":40},
{"from":40,
"to":50}]
}
}
}
}
聚合还支持嵌套查询
curl -XGET localhost:9200/school/student/_search{
"size":0,
"aggs":{
"group_by_age":{
"range":{
"field":"age",
"ranges":[{"from":20,
"to":30},
{"from":30,
"to":40},
{"from":40,
"to":50}]
}
}
},
"aggs":{
"group_by_gender":{
"terms":{
"field":"gender"
},
"aggs":{
"avg":{
"field":"balance"
}
}
}
}
}
作者:__Jasmine__
链接:https://www.jianshu.com/p/ddee872c69c1
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
ES快速入门的更多相关文章
- OpenStack云计算快速入门之一:OpenStack及其构成简介
原文:http://blog.chinaunix.net/uid-22414998-id-3263551.html OpenStack云计算快速入门(1) 该教程基于Ubuntu12.04版,它将帮助 ...
- [.net 面向对象程序设计进阶] (2) 正则表达式 (一) 快速入门
[.net 面向对象程序设计进阶] (2) 正则表达式 (一) 快速入门 1. 什么是正则表达式? 1.1 正则表达式概念 正则表达式,又称正则表示法,英文名:Regular Expression(简 ...
- elasticsearch系列二:索引详解(快速入门、索引管理、映射详解、索引别名)
一.快速入门 1. 查看集群的健康状况 http://localhost:9200/_cat http://localhost:9200/_cat/health?v 说明:v是用来要求在结果中返回表头 ...
- Elasticsearch快速入门案例
写在前面的话:读书破万卷,编码如有神-------------------------------------------------------------------- 参考内容: <Ela ...
- 001-ant design安装及快速入门【基于纯antd的基本项目搭建】
一.安装使用 1.1.安装 推荐使用 npm 或 yarn 的方式进行开发 npm install antd --save yarn add antd 1.2.浏览器引入 在浏览器中使用 script ...
- 零基础快速入门SpringBoot2.0教程 (三)
一.SpringBoot Starter讲解 简介:介绍什么是SpringBoot Starter和主要作用 1.官网地址:https://docs.spring.io/spring-boot/doc ...
- ELK系列(1) - Elasticsearch + Logstash + Kibana + Log4j2快速入门与搭建用例
前言 最近公司分了个ELK相关的任务给我,在一边学习一边工作之余,总结下这些天来的学习历程和踩坑记录. 首先介绍下使用ELK的项目背景:在项目的数据库里有个表用来存储消息队列的消费日志,这些日志用于开 ...
- EFK教程 - EFK快速入门指南
通过部署elasticsearch(三节点)+filebeat+kibana快速入门EFK,并搭建起可用的demo环境测试效果 作者:"发颠的小狼",欢迎转载与投稿 目录 ▪ 用途 ...
- [易学易懂系列|rustlang语言|零基础|快速入门|(22)|宏Macro]
[易学易懂系列|rustlang语言|零基础|快速入门|(22)|宏Macro] 实用知识 宏Macro 我们今天来讲讲Rust中强大的宏Macro. Rust的宏macro是实现元编程的强大工具. ...
随机推荐
- 解决deepin没有ll等命令的办法
编辑~/.bashrc, 添加alias 如下 vim ~/.bashrc 设置别名. 添加如下行 alias ll='ls -alF' alias la='ls -A' alias vi='vim' ...
- element-ui升级笔记;echarts图表100px问题
1.element-ui的2.7以后的版本支持树形table结构的数据,考虑优化一下表格,就升级了,但是升级到最新的版本2.12发现table都出不来了,于是降级到2.7.目前功能正常,2.12的bu ...
- Vasya And The Matrix CodeForces - 1016D (思维+构造)
Now Vasya is taking an exam in mathematics. In order to get a good mark, Vasya needs to guess the ma ...
- 基于python的知乎开源爬虫 zhihu
今天在无意之中发现了一个知乎的开源爬虫,是基于Python的,名字叫zhihu_oauth,看了一下在github上面star数还挺多的,貌似文档也挺详细的,于是就稍微研究了一下.发现果然很好用啊.就 ...
- css不常见属性之pointer-events
MDN 上介绍为 CSS 属性指定在什么情况下 (如果有) 某个特定的图形元素可以成为鼠标事件的 target.pointer-events 属性值有: /* Keyword values */ po ...
- PS使用滤镜制作光晕效果
滤镜制作光晕效果 新建图层,将背景色填充为黑色 滤镜->渲染->镜头光晕 调整好光晕大小 通过滤色(图层两字下面一点点的位置,有个下拉菜单,点开就在里面),去黑留白 如果觉得光线不够,可以 ...
- ks代码助解
代码实现: data_test_2 = {'gd':[1,1,1,1,1,1,0,0,0,0,0,0,0],'score':[1,2,0,2,2,7,4,5,4,0,4,18,np.nan]} dat ...
- redis开发使用规范
redis开发使用规范 1.冷热数据分离,不要将所有数据全部都放在Redis中 根据业务只将高频热数据存储到Redis中[QPS大于5000],对于低频冷数据可以使用mysql等基于磁盘的存储方式. ...
- J2EE知识总结——面试、笔试
9.2 jdk 1.8的新特性(核心是Lambda 表达式) 参考链接:http://www.bubuko.com/infodetail-690646.html (1)接口的默认方法 (给接口添加一个 ...
- 封装了opencv的旋转图像函数
void ljb_cv_rotate_buf_size(IplImage *imgSrc, double degree, int *w_dst, int *h_dst) { double angle, ...