ElasticSearch 是一个近实时的搜索平台。这意味着从您索引一个文档开始直到它可以被查询时会有轻微的延迟时间(通常为一秒)。
cluster(集群)是一个或者多个节点的集合,它们一起保存数据并且提供所有节点联合索引以及搜索功能。集群存在一个唯一的名字身份且默认为 “elasticsearch”。这个名字非常重要,因为如果节点安装时通过它自己的名字加入到集群中的话,那么一个节点只能是一个集群中的一部分。
node(节点)是一个单独的服务器,它是集群的一部分,存储数据,参与集群中的索引和搜索功能。像一个集群一样,一个节点通过一个在它启动时默认分配的一个随机的 UUID(通用唯一标识符)名称来识别。如果您不想使用默认名称您也可自定义任何节点名称。这个名字是要识别网络中的服务器对应,这在您的 Elasticsearch 集群节点管理的目的是很重要的。
动词,相当于MySQL中的insert;
名词,相当于MySQL中的Database
在 Index(索引)中,可以定义一个或多个类型。
类似于MySQL中的Table;每一种类型的数据放在一起;
5.x以前的版本里边,一个index下面是支持多个type的,
6.x的版本里改为一个index只支持一个type,type可以自定义。
7.x的版本所有的type默认为_doc(自定义type也能用,但是会提示不推荐)
保存在某个索引(Index)下,某种类型(Type)的一个数据(Document),文档是JSON格式的,Document就像是MySQL中的某个Table里面的内容
索引可以存储大量数据,可以超过单个节点的硬件限制。例如,十亿个文档占用了 1TB 的磁盘空间的单个索引可能不适合放在单个节点的磁盘上,并且从单个节点服务请求会变得很慢。
为了解决这个问题,ElasticSearch 提供了把 Index(索引)拆分到多个 Shard(分片)中的能力。在创建索引时,您可以简单的定义 Shard(分片)的数量。每个 Shard 本身就是一个 fully-functional(全功能的)和独立的 “Index(索引)”,(Shard)它可以存储在集群中的任何节点上。
Sharding(分片)非常重要两个理由是 :
1)水平的拆分/扩展。
2)分布式和并行跨 Shard 操作(可能在多个节点),从而提高了性能/吞吐量。
每个索引可以被拆分成多个分片,一个索引可以设置 0 个(没有副本)或多个副本。开启副本后,每个索引将有主分片(被复制的原始分片)和副本分片(主分片的副本)。分片和副本的数量在索引被创建时都能够被指定。在创建索引后,您也可以在任何时候动态的改变副本的数量,但是不能够改变分片数量。
GET /_cat/nodes:查看所有节点
GET /_cat/health:查看es健康状况
GET /_cat/master:查看主节点
GET /_cat/indices:查看所有索引
保存一个数据,保存在哪个索引的哪个类型下,指定用哪个唯一标识
PUT customer/_doc/1;在customer索引下的external类型下保存1号数据为
PUT和POST都可以,
POST新增。如果不指定id,会自动生成id。指定id就会修改这个数据,并新增版本号
PUT可以新增可以修改。PUT必须指定id;由于PUT需要指定id,我们一般都用来做修改操作,不指定id会报错。
PUT customer/_doc/1
{
"name": "John Doe"
}
GET customer/_doc/1
不同点:
使用场景:
简单更新
POST customer/_doc/1/_update
{
"doc":{
"name": "John Doew"
}
}
或者
PUT customer/_doc/1
{
"name": "John Doew"
}
或者
POST customer/_doc/1
{
"name": "John Doew"
}
更新同时增加属性
PUT customer/_doc/1
{
"doc": { "name": "Jane Doew", "age": 20 }
}
简单脚本更新
PUT customer/_doc/1
{
"script" : "ctx._source.age += 5"
}
DELETE customer/_doc/1
DELETE customer
语法格式:
{ action: { metadata }}
{ request body }
{ action: { metadata }}
{ request body }
action(必须是以下选项之一):
metadata:应该指定被索引、创建、更新或者删除的文档的 _index 、 _type 和 _id 。
request body:行由文档的 _source 本身组成—文档包含的字段和值。它是 index 和create、update 操作所必需的,而删除操作不需要 request body 行。
简单实例:
POST customer/_doc/_bulk
{"index":{"_id":"1"}}
{"name": "John Doe" }
{"index":{"_id":"2"}}
{"name": "Jane Doe" }
复杂实例:
POST _bulk
{ "delete": { "_index": "website", "_type": "_doc", "_id": "123" }}
{ "create": { "_index": "website", "_type": "_doc", "_id": "123" }}
{ "title": "My first blog post" }
{ "index": { "_index": "website", "_type": "_doc" }}
{ "title": "My second blog post" }
{ "update": { "_index": "website", "_type": "_doc", "_id": "123"} }
{ "doc" : {"title" : "My updated blog post"} }
bulk API 以此按顺序执行所有的 action(动作)。如果一个单个的动作因任何原因而失败,它将继续处理它后面剩余的动作。当 bulk API 返回时,它将提供每个动作的状态(与发送的顺序相同),所以您可以检查是否一个指定的动作是不是失败了。参考文档
由此可见,分片越多,查询的效率肯定会有一定影响的。