一、ES相关的基本概念

1、近实时(Near RealTime)

ElasticSearch是一个准实时的搜索平台。这意味着,从插入一个文档到这个文档能够被搜索到只有很小的延迟(通常是1秒)。

2、集群(cluster)

(1)集群就是由一个或多个拥有相同cluster.name配置的节点组成的,所有的节点共同承担数据和负载的压力。当有节点加入集群或从集群移除节点时,集群会重新平均分布所有的数据。

(2)集群中有多个节点(node)其中有一个为主节点,这个主节点是可以通过选举产生的;注意这个主节点是对集群内部来说的。es的一个概念就是去中心化,字面上理解就是无中心节点;这是对于集群外部来说的,因为从外部来看es集群在逻辑上是个整体。也就是说你与任何一个节点的通信与整个es集群通信是等价的。

(3)即作为用户我们可以将请求发送到集群中的任何节点,包括主节点。每个节点都知道任意文档所处的位置,并且能够将我们的请求直接转发到文档的存储节点。无论我们将请求发送到哪个节点,它都能收集到数据并返回给客户端。ES对这一切的管理都是透明的。

(4)ES利用分片将数据分发到集群各处。分片是数据的容器,文档保存在分片内,分片又被分配到集群内的各个节点里。当集群规模扩大或者缩小时,ES会自动的在各个节点中迁移分片,使得数据仍然均匀分布在集群中。

(5)一个分片可以是主分片或者副本分片。索引内任意文档都属于一个主分片,所以主分片的数据决定了索引能够保存的最大数据量。

3、索引(Index)

索引这个词在ElasticSearch中有三种意思(  ES中的“索引”非传统索引的含义,是ES中的一个概念词汇):

(1)索引(名词)。类比到关系型数据库,索引就是数据库(Database)。例如"create database mydb"。ES中的索引是映射类型的容器,独立的文档的集合,我们可以向索引写入文档或者从索引中读取文档。ElasticSearch将它的数据存储在一个或多个索引中;在数据量较大的实际应用中一个月或者一天就创建一个索引不在少数。

(2)索引(动词)。保存一个文档到索引(名词)的过程。类似于Sql语句中的insert关键词,如果该文档已经存在那就相当于数据库的update。

(3)倒排索引。关系型数据通过增加一个B+树索引到指定的列上,以便提升数据检索速度。索引ElasticSearch使用了一个叫做“倒排索引”的结构来达到相同的目的。

4、类型(Type)

类比到关系型数据库,类型(Type)就是表(Table)。之前的版本中索引和文档中间还有类型的概念,即每个索引下可以建立多个类型,文档存储的时候需要指定index的type(类似于每个database和每条数据之间还要有个Table)。从6.0.0以后单个索引中只能有一个类型了,7.0.0以后不建议使用,8.0.0以后将完全不支持。注:这样做的目的主要是为了提高查询效率。

5、文档(Document)

Index里面单条记录称为Document(文档),等同于关系型数据库表中的行。Document是ElasticSearch中的主要实体,对ES的搜索最终都归结为对文档的搜索。文档由字段构成;文档是无模式的、即并非所有的文档都需要拥有相同的字段,他们不限于一种模式(schema)。下面看看一条文档数据有哪些字段。

(1)_index:文档索引名称。

(2)_type:文档所属类型名。

(3)_id:文档id,即docid。在写入的时候我们可以指定改Doc的ID值,如果不指定,则系统会自动生成一个唯一的UUID。

(4)_version:文档的版本信息。ES使用version来保证对文档的变更能一正确的顺序执行,避免乱序造成数数据丢失。

(5)_seq_no:严格递增的顺序号。每个文档一个,Shard级别的严格递增,博阿正后写入的Doc的_seq_no大于先写入的Doc的_seq_no。

(6)_primary_term:和_seq_no一样是一个整数,每当Primary Shard发生重新分配时,比如重启,Primary选举等,_primary_term会递增1.

(7)found:查询ID正确就为true;如果ID不正确就查不到数据,found字段就是false。

(8)_source:文档原始的JSON数据

6、settings

简单来说:settings就是修改分片数和副本数;mappings就是修改字段和类型

settings修改索引库默认配置,总结来说:

不存在索引时,可以指定副本和分片;如果已经存在,则只能修改副本。

7、映射(mappings)

mapping类似于数据库中的表结构定义。就是对索引库中索引的字段名称机器数据类型进行定义,类似于mysql中的表结构信息。不过ES的mapping比数据库灵活很多,他可以动态识别字段。一般情况下是不指定mapping也是可以的,因为ES会自动根据数据格式识别它的类型。如果你需要对某些字段添加特殊属性(例如:定义使用其他分词器、是否分词、是否存储等)就必须手动添加mapping。

在ES中添加数据不指定数据类型时,ES会有自动映射机制;对字符串映射为string,数字映射为long。

索引中的每个文档都有一个类型Type(Sql中的table),每个类(Type)型拥有自己的映射(mapping)或者叫模式定义(schema definition)。  映射除了前面说的定义了字段类型、字段的数据类型以外还定义字段被ES处理的方式。例如 所有Doc在写进索引之前都会先进行分析,如何将输入的文本分割为词条、哪些词条又会被过滤等都是映射(mapping)的一部分。

查看mapping:

#没有type_name可以
GET /index_name/_mapping
#有type_name也可以
GET /index_name/type_name/_mapping

注:ElasticSearch与关系型数据库的类比

关系型数据库(比如Mysql) 非关系型数据库(Elasticsearch)
数据库Database 索引Index
表Table 类型Type
数据行Row 文档Document
数据列Column 字段Field
约束 Schema 映射Mapping

8、分片(shards)

一台服务器上无法存储大量数据,ES把一个index里面的数据分成多个shard分布式的存储在多个服务器上(对大的索引分片,拆成多个,分不到不同的节点上)。ES就是通过shard来解决节点的容量上限问题的,通过主分片可以将数据分布到集群内的所有节点上。主分片数是在索引创建时指定的,一般不允许修改,除非Reindex。一个索引中的数据保存在多个分片中(默认为一个)相当于水平分表。一个分片表示一个Lucene的实例,它本身就是一个完整的搜索引擎。我们的文档被存储和索引到分片内,这些对应用程序是透明的,即应用程序直接与索引交互而不是分片。几个概念之间的关系如下:

一个节点对应一个ES实例;
一个节点可以有多个index(索引);
一个index可以有多个shard(分片);
一个分片是一个lucene index(此处的index是lucene自己的概念,与ES的index不是一回事);

9、副本(Replica Shard)

在ES集群中同一份数据可能会有多个备份。能正常提供查询和插入的分片我们称为primary shard,其余的叫做replica shard。当查询数据的时候,ES会同时发出命令让我们有数据的机器去查询结果,谁查询的结果快就要谁的数据。

副本有两个重要的作用:

(1)服务高可用:如果数据只有一份,这个node挂了那存在上面的数据就丢了;如果有了replicas,只要不是存储这条数据的node全挂,数据就不会丢。因此分片副本不会与主分片分配到同一个节点。

(2)扩展性能:通过在所有的replicas上并行搜索提高搜索性能。由于replicas上的数据是近实时(near realtime),因此所有 replica都能提供搜索功能,通过设置合理的replicas数量可以极高的提高搜索吞吐量。

分片:一份数据被分开保存在N台机器上,N个机器上的数据组合起来是一份数据。

副本集:同一份数据被保存在N台机器上,每台机器上都有一份数据。

两者是可以嵌套存在的,在高可用场景每个分片又是作为副本集来部署是很常见的。例如腾讯云的cmongo等就是如此。

10、数据恢复(recovery)

(1)代表数据恢复或叫数据重新分布,es在有节点加入或退出时会根据机器的负载对索引分片进行重新分配,挂掉的节点重新启动时也会进行数据恢复。

(2)查看集群状态

GET /_cat/health

11、数据源(river)

代表ES的一个数据源,也是其他存储方式(其他数据库)同步数据到es的一个方法。它是以插件方式存在的一个ES服务,通过读取river中数据并把它索引(insert)到ES中。现在官方的river支持的源数据库有couchDB、RabbitMQ、Twitter等。

12、网关(gateway)

在ES中gateway的主要职责是用来对数据进行长持久化;除此之外,整个集群重启之后也可以通过gateway重新恢复数据。由于ES是专门为分布式环境而设计的,所以怎么去对所有节点的索引信息进行持久化是个问题。其实除了索引信息以外,还有ClusterState(集群信息)、mapping、索引碎片信息,以及transactionlog等信息也需要进行持久化;0.11之后的版本新加了LocalGateway(并且是默认的配置),加上之前的fs(使用共享文件系统)、hdfs(hadoop 分布式文件系统)、cloud(ec2之类的云存储)ES已经支持至少四种持久化方式。0.11之前默认的是None,也就是不进行持久化,这样的话如果服务器都挂了,就会造成数据丢失。LocalGateway就是节点各自保存自身状态,这样节点就可以从本地存储来恢复节点状态和索引信息了。

ES默认是先把索引存放到内存中,当内存满了后再持久化到硬盘。当集群重新启动时就会从gateway中读取索引数据。ES支持多种用类型的gateway,上面已经列出了。

13、自动发现(discovery)

代表ES的节点自动发现机制。ES是一个基于p2p的系统,它先通过广播寻找存在的节点,在通过多播协议来进行节点之间的通信,同时也支持点对点的交互。

14、通信(Transport)

代表ES内部节点或集群与客户端的交互方式,默认内部使用tcp协议进行交互,同时也支持http协议(json格式)、thrift、servlet、memcached、zeroMQ等的传输协议(通过插件方式集成)。

15、索引别名(aliases)

一个索引别名可以映射到多个真实索引。

Elasticsearch Index Aliases详解_中间件兴趣圈-CSDN博客_is_write_index

16、索引模板(_template)

实际工作中对于源源不断产生的大量数据周期性的创建新索引是非常正常的操作。如果每次都手动指定索引库的配置信息(settings和mappings)的话会非常麻烦。这个时候就有创建索引模板的必要了!

索引可使用预定义的模板进行创建,这个模板称为Index templates。模板设置包括settings、mappings这些东西,通过模式匹配的方式可以实现所有索引重用一个模板。

模板样例:

{"order": 0,                               // 模板优先级"template": "sample_info*",               // 模板匹配的名称方式"settings": {...},                        // 索引设置"mappings": {...},                        // 索引中各字段的映射定义"aliases": {...}                          // 索引的别名
}#实际创建模板的时候将其上面一坨put进行就好了如
PUT /_template/es_qidian_flow_oa_template
{#上面那一坨
}

17、路由(_routing)机制

1、一条数据是如何落到对应的shard(分片)上的?

当索引一个文档的时候,文档会被存储到一个主分片中。ES如何知道一个文档应该存放到哪个分片呢?

显然是要有个分配方式的,这个分配方法类似下面公式:

shard_num = hash(_routing) % num_primary_shards

其中_routing是一个可变值,默认是docid,当然也可以设置为一个自定义的值。它会将文档的ID值作为依据将其哈希到相应的主分片上,这种算法基本上会保持所有的数据在所有分片上的相对平均的分布,不会产生热点数据。

2、路由机制

假如你有一个100个分片的索引(database),当一个请求打到集群处理大致如下:

(1)这个搜索的请求会被发送到一个确定的节点;

(2)接收到这个请求的节点会将这个查询广播到这个索引的每个分片(可能是主分片,也可能是副本分片);

(3)每个分片执行这个搜索查询并返回结果;

(4)所有的结果在通道节点上合并、排序并返回给用户。

默认情况下ES使用docid(如果不指定的话ES会自己生成一个随机值)进行路由将文档平均的分布在所有的分片上。这导致ES不能确定文档的位置,所以就必须将这个请求广播到所有的100个分片去执行。这也解释了为什么主分片的数量在索引创建的时候就固定下来了,并且永远不能改变。如果分片的数量改变了,所有先前的路由值都变成非法的话,文档也就相当于丢失了(???)。 所以它必须将这个请求广播到所有的N个分片上去执行;显然这种操作会给集群带来较大的负担。

3、为什么需要自定义Routing模式?

默认的Routing在多数情况下是能够满足需求的——平均的数据分布、对用户透明、大多情况下性能尚可。但是在深入理解业务特征(数据的搜索应用场景),使用自动以的Routing模式会给我们带来更好的性能。

具体来说通过自定义Routing,可以使我们的查询更具目的性,而不是盲目的广播查询。举个例子:

(1)没有routing:帮我查询满足condition1的文档有哪些?——所有分片都要查。

(2)自定义routing:帮我查询满足condition1的文档有哪些,它就在shard1分片上(其他分片就不要扫描了)。——查shard1即可。

4、routing带来的问题

(1)docid不再全局唯一。在routing的这个分片可以有一个文档id为docid1的记录,在其他分片依然可以存在一个文档id为docid1的记录。

ES shard的是指是一个Lucene的索引,即每个分片都是一个功能完善的倒排索引。ES能保证docid全局唯一的原因是其默认采用docid来路由,即同样的docid肯定会路由到同一个分片上;如果docid重复,其效果就是update或者抛异常。显然着是可以保证集群内部docid唯一的。但是如果换用了其他值做routing,显然就保证不了了。如果用户还需要docid唯一,那就必须自己保证。

(2)容易造成负载不均衡。为此ES提供了一种将数据路由到一组shard而不是一个的机制。只需要在创建索引的时候设置index.routing_partition_size,默认值是1,即只路由到1个shard,可以将其设置为大于1且小于索引shard总数的某个值,就可以路由到一组shard了。值越大数据越均匀。当然,从设置就能看出来这个设置是针对单个索引的,可以加入到动态模板中,以对多个索引生效。指定后shard的计算方式变为:

shard_num = (hash(_routing) + hash(_id) % routing_partition_size) % num_primary_shards

对于同一个routing值,hash(_routing)的结果固定的,hash(_id) % routing_partition_size的结果有 routing_partition_size 个可能的值,两个组合在一起,对于同一个routing值的不同doc,也就能计算出 routing_partition_size 可能的shard num了,即一个shard集合。但要注意这样做以后有两个限制:

1)索引的mapping中不能再定义join关系的字段,原因是join强制要求关联的doc必须路由到同一个shard,如果采用shard集合,这个是保证不了的。
2)索引mapping中_routing的required必须设置为true。

5、注意事项

网上有一堆设置routing的教程,其中大部分类似于如下在mapping中加入_routing,required,path等参数工作的,但是使用后发现有错误。如下: reason": Mapping definition for [_routing] has unsupported parameters:  [path : category]"。

查看官网后发现: 原来在es2.0之后就不支持这种方式了(注:required还是认的,但path已经不认了)。

"required" : true 的效果就是插入数据和查询数据都必须带上”?routing=xxxxx“,否则就抱错。

关于routing使用、效果可以参见 ElasticSearch——路由(_routing)机制 - 曹伟雄 - 博客园

18、索引别名(alias)

类似于数据库的视图,其实就是给索引创建别名。例如为索引my_index创建一个别名my_index_alias,这样对my_index_alias的操作就和直接对my_index操作一样。别名不仅仅可以关联一个索引,他能聚合多个索引。例如,为my_index_1和my_index_2创建一个别名my_index_alias,这样对my_index_alias的操作(仅限于读操作)会操作my_index_1和my_index_alias,类似于聚合了这两个索引。另外值得注意的是我们不能对my_index_alias进行写操作,因为当有多个索引时alias不能区分到底操作哪一个。

这里最常见的用法就是将不同的索引建立在同一个索引别名下,这样就可以实现统一的对外索引名称、实现查询统一等。如下列出关于别名的一些操作:

#查看所有别名
GET /_alias#查看某个别名下的索引
GET /_alias/alias_name
GET /_alias/es_qidian_flow_oa#查看某个索引的别名
GET /index_name/_alias#添加并删除别名#将别名与多个索引相关联

二、ES基本操作

1、查看mapping

GET /[index_name]/_mapping#例如
GET /online_qd_analysis_202012/_mapping

2、查看集群健康状态

GET /_cat/health
GET /_cat/health?v  #带"?v"就是列出列名的意思

3、查询ES中所有的index

GET _cat/indices
GET _cat/indices?v  #带"?v"就是列出列名的意思

4、删除索引

#删除指定索引
DELETE index_name

5、查看索引的分片情况

GET _cat/shards/index_name
GET _cat/shards/index_name?v

如上,每个分片是主副分片、状态、文档数、占用存储、ip等都一目了然。

6、根据docid查询文档

GET /index_name/type_name/docid#例如
GET /online_qd_analysis_202012/kw/corp_uin_2852156690_2852156690_1442795696_1608777956283

7、常规查找——在Type中所有数据中查找

注:_search的含义是在所有数据中查找。

#指定index和type;就是在这个type_name中查找的意思
GET index_name/type_name/_search
{"size":30,"query":{}
}#指定index
GET index_name/_search
{"size":30,"query":{}
}

8、限制查找条数

#限制查找条数有两种方式.1)在get语句中限定 2)在内部参数中限定
#1)GET语句中限定
GET index_name/type_name/_search?size=100
{"query": {"match": {"session_id": }}
}#2)内部参数限定
GET index_name/type_name/_search
{"size":3,"query": {"match": {"session_id": }}
}

具体规则可以参见:  CSDN

三、ES的CURD操作

下面以一个电商的例子,说明下es的增删改查。

1、插入一条数据

 指定docid,POST/PUT都可以;不指定docid,貌似只能POST。

#PUT操作插入一条数据
PUT /my_index/my_type/docid1111
{"name":"dior chengyi","desc":"shishang gaodang","price":7000,"producer":"dior producer","tags":["shishang","shechi"]
}

2、根据docid查询某条记录

#根据docid查询商品
GET /my_index/my_type/docid1111

3、根据其他字段查询记录

GET /my_index/my_type/_search
{"size":5,"query":{"match":{"name":"dior chengyi"}}
}

4、修改数据

(1)PUT方式修改字段——其他字段依然带上

#把price改成8000.如下是ok的
PUT /my_index/my_type/docid1111
{"name":"dior chengyi","desc":"shishang gaodang","price":8000,"producer":"dior producer","tags":["shishang","shechi"]
}

(2)PUT方式仅涉及修改字段——其他字段不带上(会覆盖原来所有)

#这样update是不行的.会把docid1111完全覆盖掉
PUT /my_index/my_type/docid1111
{"price":9000
}

(3)POST方式修改数据——比较理想的方法

#POST方式进行update.注意:"_update"、"doc"等都要有
POST /my_index/my_type/docid1111/_update
{   "doc":{"price":8500}
}

5、删除商品数据

#删除商品数据
DELETE /my_index/my_type/docid1111

6、继续插入两条数据

#再插入一条记录
PUT /my_index/my_type/docid1112
{"name":"hailanzhijia chenyi","desc":"shangwu xiuxian","price":200,"producer":"hailanzhijia producer","tags":["xiuxian"]
}#在插入一条记录
PUT /my_index/my_type/docid1113
{"name":"uniqlo chenyi","desc":"jujia xiuxian","price":150,"producer":"uniqlo producer","tags":["jujia","xiuxian"]
}

7、查看所有数据

#查看所有数据
GET /my_index/my_type/_search

ElasticSearch入门详解相关推荐

  1. 【ElasticSearch 01】elasticsearch入门详解

    概述 es是一个基于Lucene的搜索引擎.对于初学者来说,可以将其看作一款NoSQL.es一般可以用作项目中的搜索.检索模块,提供关键词检索.条件过滤.聚合等功能. es在单独使用时,可以实现的功能 ...

  2. elasticsearch入门详解以及mapping介绍

    本文目录 elasticsearch简介 elasticsearch的Type区别 核心数据类型: 复杂数据类型 倒排索引 index内部模型 自动识别规则 匹配查询 elasticsearch 中t ...

  3. ElasticSearch搜索引擎详解-持续更新中

    ElasticSearch搜索引擎详解 1. ElasticSearch概述 1.1 elasticsearch是什么 1.2 全文搜索引擎 1.3 elasticsearch and solr 1. ...

  4. linux 日志按大小切割_nginx入门详解(六)- 日志切割

    上一章讲解了nginx的目录加密功能,本章重点介绍nginx的日志切割. 笨办法学linux:nginx入门详解(五)- 目录加密​zhuanlan.zhihu.com 在第二章,我们探讨了nginx ...

  5. python怎么安装myqr模块-python二维码操作:对QRCode和MyQR入门详解

    python是所有编程语言中模块最丰富的 生活中常见的二维码功能在使用python第三方库来生成十分容易 三个大矩形是定位图案,用于标记二维码的大小.这三个定位图案有白边,通过这三个矩形就可以标识一个 ...

  6. python语言编程基础-Python语言入门详解!快速学成Python!

    原标题:Python语言入门详解!快速学成Python! 很多技能是被职场所需要的,但很可惜... 这些技能在大学中并学习不到. 大学和职场现实存在的横沟对大部分同学来说难以跨越或碰得头破血流... ...

  7. python语言入门m-Python语言入门详解!快速学成Python!

    今日主题 "Python语言入门详解" 近两年来,Python语言借着数据科学和人工智能的"东风"成为了最流行的编程语言--街头巷尾人们口口相传.同时,Pyth ...

  8. python语言入门详解-python初级教程:入门详解

    python初级教程:入门详解 Crifan Li 目录 前言 .................................................................... ...

  9. 【GCN】图卷积网络(GCN)入门详解

    机器学习算法与自然语言处理出品 @公众号原创专栏作者 Don.hub 单位 | 京东算法工程师 学校 | 帝国理工大学 图卷积网络(GCN)入门详解 什么是GCN GCN 概述 模型定义 数学推导 G ...

  10. python符号格式化设置区间_Python 数值区间处理_对interval 库的快速入门详解

    使用 Python 进行数据处理的时候,常常会遇到判断一个数是否在一个区间内的操作.我们可以使用 if else 进行判断,但是,既然使用了 Python,那我们当然是想找一下有没有现成的轮子可以用. ...

最新文章

  1. mysql relay bin 主库_MySQL主库binlog(master-log)与从库relay-log关系代码详解
  2. Nginx配置指令之listen
  3. scrapy使用cookie的三种方式
  4. 自学考试c语言真题,自学考试《C语言程序设计》练习题及答案
  5. c 语言运算符号大全,c语言运算符号详细说明
  6. java用scanner类_java中关于scanner类的详细介绍
  7. SAP自学指南:案例公司的特点
  8. 矩池云通过rsync指令上传文件到服务器网盘
  9. 【linux】dpkg info修复及dpkg: warning: files list file for package
  10. 2019华为软件精英挑战赛 赛后总结
  11. CV520国产替代Ci521 13.56MHz 非接触式读写器芯片
  12. 华为手机助手上架流程_华为手机助手导入音乐文件在哪里看 详细步骤介绍
  13. 浅谈文字编码和Unicode(中)[转]
  14. GNU 软件文档下载
  15. rust怎么发送求救信号_海上遇险怎么发求救信号?
  16. 使用ctex宏包出现的kpathsea错误
  17. 资本转移-从汇率看通胀
  18. 电蚊拍一天用30-50次?
  19. 基于javaweb+mysql的汽车配件销售管理系统(java+SpringBoot+layui+html+maven+mysql)
  20. 使用防晒霜的十大误区

热门文章

  1. annotation:@Override出现The method of type must override asuperclass解决方案
  2. GetModuleFileNameA函数与GetCurrentDirectoryA函数
  3. break , continue , exit
  4. Orchard是如何运行的
  5. ubuntu 10.04下vmware tools安装和一些应用
  6. Security+ 学习笔记29 虚拟化
  7. 无线网络中终端设备接入过程
  8. 单臂路由VLAN通信
  9. 华三中各种路由协议的缺省优先级
  10. Leetcode 刷题笔记(二十九) ——动态规划篇之子序列问题:编辑距离