一、概念

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.ES和SQL对照理解

二、存储相关

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是一张搜索结果的截图,下面将针对搜索结果的结构解释来查看数据内容。

 
图-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快速入门的更多相关文章

  1. OpenStack云计算快速入门之一:OpenStack及其构成简介

    原文:http://blog.chinaunix.net/uid-22414998-id-3263551.html OpenStack云计算快速入门(1) 该教程基于Ubuntu12.04版,它将帮助 ...

  2. [.net 面向对象程序设计进阶] (2) 正则表达式 (一) 快速入门

    [.net 面向对象程序设计进阶] (2) 正则表达式 (一) 快速入门 1. 什么是正则表达式? 1.1 正则表达式概念 正则表达式,又称正则表示法,英文名:Regular Expression(简 ...

  3. elasticsearch系列二:索引详解(快速入门、索引管理、映射详解、索引别名)

    一.快速入门 1. 查看集群的健康状况 http://localhost:9200/_cat http://localhost:9200/_cat/health?v 说明:v是用来要求在结果中返回表头 ...

  4. Elasticsearch快速入门案例

    写在前面的话:读书破万卷,编码如有神-------------------------------------------------------------------- 参考内容: <Ela ...

  5. 001-ant design安装及快速入门【基于纯antd的基本项目搭建】

    一.安装使用 1.1.安装 推荐使用 npm 或 yarn 的方式进行开发 npm install antd --save yarn add antd 1.2.浏览器引入 在浏览器中使用 script ...

  6. 零基础快速入门SpringBoot2.0教程 (三)

    一.SpringBoot Starter讲解 简介:介绍什么是SpringBoot Starter和主要作用 1.官网地址:https://docs.spring.io/spring-boot/doc ...

  7. ELK系列(1) - Elasticsearch + Logstash + Kibana + Log4j2快速入门与搭建用例

    前言 最近公司分了个ELK相关的任务给我,在一边学习一边工作之余,总结下这些天来的学习历程和踩坑记录. 首先介绍下使用ELK的项目背景:在项目的数据库里有个表用来存储消息队列的消费日志,这些日志用于开 ...

  8. EFK教程 - EFK快速入门指南

    通过部署elasticsearch(三节点)+filebeat+kibana快速入门EFK,并搭建起可用的demo环境测试效果 作者:"发颠的小狼",欢迎转载与投稿 目录 ▪ 用途 ...

  9. [易学易懂系列|rustlang语言|零基础|快速入门|(22)|宏Macro]

    [易学易懂系列|rustlang语言|零基础|快速入门|(22)|宏Macro] 实用知识 宏Macro 我们今天来讲讲Rust中强大的宏Macro. Rust的宏macro是实现元编程的强大工具. ...

随机推荐

  1. final修饰符—不可变

    final 修饰符 修饰类 不可以有子类 修饰变量 变量一旦获得初始值就不可改变,不能被重新赋值 成员变量:初始值必须有程序员显式设置,系统不会对其隐式初始化 类变量:静态初始化块 | 声明该类变量时 ...

  2. Qt常见错误

    fatal error: QApplication: No such file or directory 在.pro文件中 添加 QT += widgets fatal error: QTcpSock ...

  3. jenkins复选框插件Extended Choice Parameter plugin

    转载 https://www.cnblogs.com/zndxall/p/9512059.html https://www.cnblogs.com/jwentest/p/7113399.html

  4. 【vue-router的基础】history了解一下

    概述 window.onpopstate是popstate事件在window对象上的事件处理程序. 每当处于激活状态的历史记录条目发生变化时,popstate事件就会在对应window对象上触发. 如 ...

  5. vue项目配置及项目初识

    目录 Vue项目环境搭建 Vue项目创建 重构项目依赖 1.需要转移的文件 2.重构依赖 pycharm配置并启动vue项目 vue项目目录结构分析 vue组件(.vue文件) 全局脚本文件main. ...

  6. 转 弹性反向传播(RProp)和均方根反向传播(RMSProp)

    from http://blog.csdn.net/tsq292978891/article/details/78619384 都是一种权值更新算法,类似于SGD算法,其中,RMSProp是RProp ...

  7. Python Number(数字) Ⅰ

    Python Number(数字) Python Number 数据类型http://www.xuanhe.net/用于存储数值. 数据类型是不允许改变的,这就意味着如果改变 Number 数据类型的 ...

  8. CF1260F

    题目大意 一棵树,每个节点的权为L[i]~R[i],一棵树的贡献为\(\sum\limits_{h_{i} = h_{j}, 1 \le i < j \le n}{dis(i,j)}\),其中\ ...

  9. 8.django单独执行文件

    import os import django # 导入django os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'noju.settings')d ...

  10. SQL limit(分页)

    1.limit使用 limit参数,第一个参数:从哪儿开始查:第二个参数:查几条 i : 为查询结果的索引值(默认从0开始): n : 为查询结果返回的数量  -- 从3开始 取 3 条 SELECT ...