一、概念

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. 2.SpringBoot整合Mybatis(一对一)

    前言: 上一篇整合springboot和mybatis的项目的建立,以及单表的简单的增删改查.这里是上一篇blog的地址:https://www.cnblogs.com/wx60079/p/11461 ...

  2. kettle批量导入json数据

    kettle新手上路,烦死了,工具好用,批量导入数据也快,就是有很多小细节需要注意. 使用kettle进行数据导入时,因为最近在做json数据的入库,以JSON Input为例进行说明: 首先是大概流 ...

  3. java高并发核心要点|系列4|CPU内存指令重排序(Memory Reordering)

    今天,我们来学习另一个重要的概念. CPU内存指令重排序(Memory Reordering) 什么叫重排序? 重排序的背景 我们知道现代CPU的主频越来越高,与cache的交互次数也越来越多.当CP ...

  4. Ubuntu 16.04 编译ORB_SLAM2_modified

    编译g2o_with_orbslam2 1.修改g2o/types/slam2d/edge_se2_pointxy_bearing.cpp t.setRotation(t.rotation().ang ...

  5. rsync+inotify实时数据同步多目录实战

    rsync+inotify实时数据同步多目录实战       inotify配置是建立在rsync服务基础上的配置过程 操作系统 主机名 网卡eth0 默认网关 用途 root@58server1 1 ...

  6. CodeForces-437C(贪心)

    链接: https://vjudge.net/problem/CodeForces-437C 题意: On Children's Day, the child got a toy from Delay ...

  7. 【leetcode】1179. Reformat Department Table

    题目如下: SQL Schema Table: Department +---------------+---------+ | Column Name | Type | +------------- ...

  8. 参数类型*&是什么意思?

    前两天摸鱼聊天的时候遇到一个问题,一个链表的函数中,有一个参数显得很奇怪 (大概是一个样子的)ListNode<T>*& l 这个参数l除了用了一个*之外还用了一个&,直觉 ...

  9. Python 爬虫十六式 - 第五式:BeautifulSoup-美味的汤

    BeautifulSoup 美味的汤 学习一时爽,一直学习一直爽!    Hello,大家好,我是Connor,一个从无到有的技术小白.上一次我们说到了 Xpath 的使用方法.Xpath 我觉得还是 ...

  10. luogu P2661 信息传递 x

    P2661 信息传递 题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知 ...