ES是一个实时的分布式搜索分析引擎,它被用作全文检索,结构化检索,分析以及这三个功能的组合;
一个运行中的 Elasticsearch 实例称为一个节点,而集群是由一个或者多个拥有相同 cluster.name
配置的节点组成, 它们共同承担数据和负载的压力。当有节点加入集群中或者从集群中移除节点时,集群将会重新平均分布所有的数据。
集群通过选举模式推选出主节点。
主节点负责管理集群范围内的所有变更。比如新增,删除索引,新增,删除节点等。
主节点不负责管理文档和搜索等操作,所以即便流量增加也不会引发瓶颈。
每个节点都知道任意文档所处的位置。
GET /_cluster/health
通过status字段指示当前集群是否正常运行
索引是指向一个或者多个物理分片的逻辑命名空间。
索引名,这个名字必须小写,不能以下划线开头,不能包含逗号。
PUT /blogs
{
"settings" : {
"number_of_shards" : 3,
"number_of_replicas" : 1
}
}
关系型数据库采用索引列的方式(比如B树)提高查询速度。
ES采用倒排索引的方式达到相同的目的
一个分片是一个底层的工作单元,它仅保存了全部数据中的一部分。
分片是一个底层的工作单元,它仅仅保存了全部数据的一部分。
每个分片都是一个Lucene的实例,它本身是一个完整的搜索引擎。
一个主分片最大存储INTEGER.MAX_VALUE-128个文档。(正负20亿)
不可变更
副本分配是主分片的拷贝,副本分片作为硬件故障时保护数据不丢失的冗余备份,并为索引和返回文档等读操作提供服务。
可随时变更
索引的主分片数量是不可变更的,副本分片可以随时改变。
通过增加副本分片数量可以提高检索速度。
节点不变,一味地增加副本数量是无效的。副本之间抢夺节点性能。节点数量才是扩容的基本。
创建索引时,指定3个主分片,1个副本分片。含义是每个主分片各拥有一个副本分片。相当于6个分片。
一个节点下建立多少个副本分片都是没有意义的,因为节点挂掉数据全丢。
节点与分片的1比1配比,是N个节点对应N个分片。既每个节点下保存一个分片。
当某个节点异常时,ES自动丢弃,并在正常节点下完善分片结构。
当异常节点恢复时,ES会重新分配分片结果,并争取重用历史数据仅同步变更数据。
它是指最顶层或者根对象, 这个根对象被序列化成 JSON 并存储到 Elasticsearch 中,指定了唯一 ID。
字段的名字可以是任何合法的字符串,但 不可以 包含英文句号(.)。
PUT /{index}/{type}/{id}
{
"field": "value",
...
}
PUT /{index}/{type}
{
"field": "value",
...
}
PUT /website/blog/123?op_type=create
{ ... }
PUT /website/blog/123/_create
{ ... }
GET /website/blog/123
GET /website/blog/123?pretty
?pretty用于美化返回结果格式
GET /website/blog/123?_source
GET /website/blog/123/_source
GET /website/blog/123?_source=field1,field2,...
GET /_mget
{
"docs" : [
{
"_index" : "website",
"_type" : "blog",
"_id" : 2
},
{
"_index" : "website",
"_type" : "pageviews",
"_id" : 1,
"_source": "views"
}
]
}
通过docs数组组装多个条件进行批量获取,返回数据分组返回。
返回结果永远是200,需要判断结果断定查询结果
HEAD /website/blog/123
仅返回状态码 200表示存在404表示不存在
PUT /website/blog/123
{
"title": "My first blog entry",
"text": "I am starting to get the hang of this...",
"date": "2014/01/02"
}
在ES中文档是不可变更的,所以更新操作是先删除后新增。_version递增
POST /website/blog/1/_update
{
"doc" : {
"tags" : [ "testing" ],
"views": 0
}
}
在ES中文档是不可变更的,所以更新操作是先删除后新增。_version递增
POST /website/pageviews/1/_update
{
"script" : "ctx._source.views+=1",
"upsert": {
"views": 1
}
}
通过upsert为不存在的属性初始值
POST /website/pageviews/1/_update?retry_on_conflict=5
{
"script" : "ctx._source.views+=1",
"upsert": {
"views": 0
}
}
通过retry_on_conflict属性设置失败后重试次数。仅仅在更新顺序不重要的情况下适用。例如访问计数功能。
DELETE /website/blog/123
如果文档不存在,_version一样会累加,新增后_version不再是1.
bulk API允许在单个步骤中进行多次create、index、update、delete请求。
最后一定要以\n结尾,delete操作不需要body
批量操作并非越大越好,多次尝试找到平衡点,建议1000~5000一个批次。
格式
{ action: { metadata }}\n
{ request body }\n
{ action: { metadata }}\n
{ request body }\n
...
实例1
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"} }
实例2
POST /website/log/_bulk
{ "index": {}}
{ "event": "User logged in" }
{ "index": { "_type": "blog" }}
{ "title": "Overriding the default type" }
减少重复录入_index、_type,参数为空,自动从URL中提取。
文章中部分内容来源于:
Elasticsearch: The Definitive Guide by Clinton Gormley and Zachary Tong (O’Reilly). Copyright 2015 Elasticsearch BV, 978-1-449-35854-9。