一、基本概念
1、Near Realtime(NRT 近实时)
Elasticsearch 是一个近实时的搜索平台。这意味着从您索引一个文档开始直到它可以被查询时会有轻微的延迟时间(通常为一秒)。 Lucence;
2、Cluster(集群)
cluster(集群)是一个或者多个节点的集合,它们一起保存数据并且提供所有节点联合索引以及搜索功能。集群存在一个唯一的名字身份且默认为 “elasticsearch”。这个名字非常重要,因为如果节点安装时通过它自己的名字加入到集群中的话,那么一个节点只能是一个集群中的一部分。
3、Node(节点)
node(节点)是一个单独的服务器,它是集群的一部分,存储数据,参与集群中的索引和搜索功能。像一个集群一样,一个节点通过一个在它启动时默认分配的一个随机的 UUID(通用唯一标识符)名称来识别。如果您不想使用默认名称您也可自定义任何节点名称。这个名字是要识别网络中的服务器对应这在您的 Elasticsearch 集群节点管理的目的是很重要的。
4、Index(索引)
动词,相当于MySQL中的insert; 名词,相当于MySQL中的Database
5、Type(类型)
在 Index(索引)中,可以定义一个或多个类型。 类似于MySQL中的Table;每一种类型的数据放在一起;
6、Document(文档)
保存在某个索引(Index)下,某种类型(Type)的一个数据(Document),文档是JSON格式的,Document就像是MySQL中的某个Table里面的内容
7、Shards & Replicas(分片 & 副本)
索引可以存储大量数据,可以超过单个节点的硬件限制。例如,十亿个文档占用了 1TB 的磁盘空间的单个索引可能不适合放在单个节点的磁盘上,并且从单个节点服务请求会变得很慢。
为了解决这个问题,Elasticsearch 提供了把 Index(索引)拆分到多个 Shard(分片)中的能力。在创建索引时,您可以简单的定义 Shard(分片)的数量。每个 Shard 本身就是一个 fully-functional(全功能的)和独立的 “Index(索引)”,(Shard)它可以存储在集群中的任何节点上。
Sharding(分片)非常重要两个理由是 : 1)水平的拆分/扩展。 2)分布式和并行跨 Shard 操作(可能在多个节点),从而提高了性能/吞吐量。 每个索引可以被拆分成多个分片,一个索引可以设置 0 个(没有副本)或多个副本。开启副本后,每个索引将有主分片(被复制的原始分片)和副本分片(主分片的副本)。分片和副本的数量在索引被创建时都能够被指定。在创建索引后,您也可以在任何时候动态的改变副本的数量,但是不能够改变分片数量。
ES的使用方式; 1)、搭建好了es服务器; 2)、我们只需要给es服务器发http请求即可测试es
二、初步检索 增删改查
1、_cat
GET /_cat/nodes:查看所有节点 GET /_cat/health:查看es健康状况 GET /_cat/master:查看主节点 GET /_cat/indices:查看所有索引
2、索引一个文档
保存一个数据,保存在哪个索引的哪个类型下,指定用哪个唯一标识 PUT customer/external/1;在customer索引下的external类型下保存1号数据为
代码语言:javascript复制PUT customer/external/1
{
"name": "John Doe"
}
PUT和POST都可以, POST新增。如果不指定id,会自动生成id。指定id就会修改这个数据,并新增版本号
PUT可以新增可以修改。PUT必须指定id;由于PUT需要指定id,我们一般都用来做修改操作,不指定id会报错。
3、查询文档
代码语言:javascript复制GET customer/external/1
4、更新文档
代码语言:javascript复制POST customer/external/1/_update
{
"doc":{
"name": "John Doew"
}
}
或者
代码语言:javascript复制PUT customer/external/1
{
"name": "John Doe"
}
或者
代码语言:javascript复制POST customer/external/1
{
"name": "John Doe2"
}
不同:POST操作会对比源文档数据,如果相同不会有什么操作,文档version不增加 PUT操作总会将数据重新保存并增加version版本; 带_update对比元数据如果一样就不进行任何操作。 看场景; 对于大并发更新,不带update; 对于大并发查询偶尔更新,带update;对比更新,重新计算分配规则。
更新同时增加属性
代码语言:javascript复制POST customer/external/1/_update
{
"doc": { "name": "Jane Doe", "age": 20 }
}
简单脚本更新
代码语言:javascript复制POST customer/external/1/_update
{
"script" : "ctx._source.age = 5"
}
5、删除文档&索引
代码语言:javascript复制DELETE customer/external/1
DELETE customer
6、bulk批量API
代码语言:javascript复制POST customer/external/_bulk
{"index":{"_id":"1"}}
{"name": "John Doe" }
{"index":{"_id":"2"}}
{"name": "Jane Doe" }
语法格式:
代码语言:javascript复制{ action: { metadata }}n
{ request body }n
{ action: { metadata }}n
{ request body }n
复杂实例:
代码语言:javascript复制POST /_bulk
{ "delete": { "_index": "website", "_type": "blog", "_id": "123" }}
{ "create": { "_index": "website", "_type": "blog", "_id": "123" }}
{ "title": "My first blog post" }
{ "index": { "_index": "website", "_type": "blog" }}
{ "title": "My second blog post" }
{ "update": { "_index": "website", "_type": "blog", "_id": "123", "_retry_on_conflict" : 3} }
{ "doc" : {"title" : "My updated blog post"} }
bulk API 以此按顺序执行所有的 action(动作)。如果一个单个的动作因任何原因而失败,它将继续处理它后面剩余的动作。当 bulk API 返回时,它将提供每个动作的状态(与发送的顺序相同),所以您可以检查是否一个指定的动作是不是失败了。
7、样本测试数据
我准备了一份顾客银行账户信息的虚构的 JSON 文档样本。每个文档都有下列的 schema(模式):
代码语言:javascript复制{
"account_number": 0,
"balance": 16623,
"firstname": "Bradshaw",
"lastname": "Mckenzie",
"age": 29,
"gender": "F",
"address": "244 Columbus Place",
"employer": "Euron",
"email": "bradshawmckenzie@euron.com",
"city": "Hobucken",
"state": "CO"
}
https://github.com/elastic/elasticsearch/blob/master/docs/src/test/resources/accounts.json?raw=true 导入测试数据 POST bank/account/_bulk 测试数据