ES入门篇
1 ES查询入门
1.1 基础
基于ApacheLucene,RestfulAPI的全文搜索
1.2 特性
分布式实时文件存储、分布式实时搜索引擎、伸缩性、可扩展型、PB级的结构化或非结构化数据处理。
1.3 数据结构层级
RDB: DB______TABLE_ROW_______COLUMN
ES: INDICES_TYPE__DOCUMENT_FIELDS
1.4 搜索方式
1)简单搜索:
GET /megacorp/employee/1
GET /megacorp/employee/_search
GET /megacorp/employee/_search?q=last_name:Smith
2)DSL语句:
GET /megacorp/employee/_search
{
"query" : {
"match" : {
"last_name" : "Smith"
}
}
}
GET /megacorp/employee/_search
{
"query" : {
"filtered" : {
"filter" : {
"range" : {
"age" : { "gt" : 30 } <1>
}
},
"query" : {
"match" : {
"last_name" : "smith" <2>
}
}
}
}
}
<1> 这部分查询属于区间过滤器(range filter),它用于查找所有年龄大于30岁的数据——gt为"greater than"的缩写。
<2> 这部分查询与之前的match语句(query)一致。
3)全文搜索:(相比于短语搜索更为广泛、内容按相关性排序)
GET /megacorp/employee/_search
{
"query" : {
"match" : {
"about" : "rock climbing"
}
}
}
4)短语搜索:
GET /megacorp/employee/_search
{
"query" : {
"match_phrase" : {
"about" : "rock climbing"
}
}
}
5)高亮支持:
GET /megacorp/employee/_search
{
"query" : {
"match_phrase" : {
"about" : "rock climbing"
}
},
"highlight": {
"fields" : {
"about" : {}
}
}
}
6)聚合:https://es.xiaoleilu.com/010_Intro/35_Tutorial_Aggregations.html
允许在指定条件查询结果的基础上进行统计分析的功能,类似于group by但更为强大;
2 ES数据结构入门
2.1 document:即ES中的一条数据,为JSON obj,但特指根节点的Obj
2.2 文档元数据:除数据外的部分:
_index 文档存储的地方(index数据库)
_type 文档代表的对象的类(class)
_id 文档的唯一标识 3.文档索引:
使用自己的ID
如果你的文档有自然的标识符(例如 user_account字段或者其他值表示文档),你就可以提供自己的 _id,使用这种形式的 index API:
PUT /{index}/{type}/{id}
{
"field": "value",
...
}
2.3 自增ID
如果我们的数据没有自然ID,我们可以让Elasticsearch自动为我们生成。请求结构发生了变化:PUT方法——“在这个URL中存储文档”变成了POST方法——“在这个类型下存储文档”。(译者注:原来是把文档存储到某个ID对应的空间,现在是把这个文档添加到某个_type下)。
URL现在只包含_index和_type两个字段:
POST /website/blog/
{
"title": "My second blog entry",
"text": "Still trying this out...",
"date": "2014/01/01"
}
2.4 文档增删改操作~
https://es.xiaoleilu.com/030_Data/25_Update.html
2.5 版本控制
两种锁;
悲观并发控制(Pessimistic concurrency control)
这在关系型数据库中被广泛的使用,假设冲突的更改经常发生,为了解决冲突我们把访问区块化。典型的例子是在读一行数据前锁定这行,然后确保只有加锁的那个线程可以修改这行数据。
乐观并发控制(Optimistic concurrency control):
被Elasticsearch使用,假设冲突不经常发生,也不区块化访问,然而,如果在读写过程中数据发生了变化,更新操作将失败。这时候由程序决定在失败后如何解决冲突。实际情况中,可以重新尝试更新,刷新数据(重新读取)或者直接反馈给用户。
CAS:主要核心为文档中的version字段;
以及外部版本控制系统;
2.6 Mget批处理查询请求
POST /_mget
{
“docs” : [
{
“_index” : “website”,
“_type” : “blog”,
“_id” : 2
},
{
“_index” : “website”,
“_type” : “pageviews”,
“_id” : 1,
“_source”: “views”
}
]
}
事实上,如果所有文档具有相同_index和_type,你可以通过简单的ids数组来代替完整的docs数组:
POST /website/blog/_mget
{
“ids” : [ “2”, “1” ]
}
2.7 批量更新
就像mget允许我们一次性检索多个文档一样,bulk API允许我们使用单一请求来实现多个文档的create、index、update或delete。这对索引类似于日志活动这样的数据流非常有用,它们可以以成百上千的数据为一个批次按序进行索引。
bulk请求体如下,它有一点不同寻常:
{ action: { metadata }}\n
{ request body }\n
{ action: { metadata }}\n
{ request body }\n
…
这种格式类似于用"\n"符号连接起来的一行一行的JSON文档流(stream)。两个重要的点需要注意:
每行必须以"\n"符号结尾,包括最后一行。这些都是作为每行有效的分离而做的标记。
每一行的数据不能包含未被转义的换行符,它们会干扰分析——这意味着JSON不能被美化打印。
POST /_bulk
{ “delete”: { “_index”: “website”, “_type”: “blog”, “_id”: “123” }} <1>
{ “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>
试着批量索引标准的文档,随着大小的增长,当性能开始降低,说明你每个批次的大小太大了。开始的数量可以在1000~5000个文档之间,如果你的文档非常大,可以使用较小的批次。
通常着眼于你请求批次的物理大小是非常有用的。一千个1kB的文档和一千个1MB的文档大不相同。一个好的批次最好保持在5-15MB大小间。
3 ES集群
3.1 基础概念
节点、主节点、集群
节点(node):一个es实例
主节点(master):它将临时管理集群级别的一些变更,例如新建或删除索引、增加或移除节点等。主节点不参与文档级别的变更或搜索,这意味着在流量增长的时候,该主节点不会成为集群的瓶颈。任何节点都可以成为主节点。我们例子中的集群只有一个节点,所以它会充当主节点的角色。
我们能够与集群中的任何节点通信,包括主节点。每一个节点都知道文档存在于哪个节点上,它们可以转发请求到相应的节点上。我们访问的节点负责收集各节点返回的数据,最后一起返回给客户端。这一切都由Elasticsearch处理。
3.2 集群健康度
集群健康(cluster health)。集群健康有三种状态: green、 yellow或 red。
GET /_cluster/health
3.3 添加索引
分片:主分片\复制分片
分片(shard):是最小级别的工作单元,本身就是一个完整的搜索引擎,但每个分片只保存了索引中的一部分;
索引中的每个文档属于一个单独的主分片,所以主分片的数量决定了索引最多能存出多少数据;
主分片的数目从建立索引的时候就固定了,建立索引时可配置其主分片及复制分片数目,
当你的集群扩容或缩小,Elasticsearch将会自动在你的节点间迁移分片,以使集群保持平衡。
集群的健康状态yellow表示所有的主分片(primary shards)启动并且正常运行了——集群已经可以正常处理任何请求——但是复制分片(replica shards)还没有全部可用。事实上所有的三个复制分片现在都是unassigned状态——它们还未被分配给节点。在同一个节点上保存相同的数据副本是没有必要的,如果这个节点故障了,那所有的数据副本也会丢失。
现在我们的集群已经功能完备,但是依旧存在因硬件故障而导致数据丢失的风险。
3.4 集群扩展
一方面可以增加服务器的数目,ES将自动迁徙分片
另一方面可以调节复制分片的数目,以增加冗余,提升容错性