引言
NoSql:主要指非关系型、分布式、不提供ACID的数据库设计模式。
1 ES总结
- 主旨在于随时可用和按需扩容,通过购买性能更强大(垂直扩容、或纵向扩容)或者数量更多的服务器(水平扩容、或横向扩容)来实现。
- 垂直扩容有限,真正的扩容能力来自于水平扩容(为集群增加更多的节点,将负载压力和稳定性分散到这些节点中)。
- 天生就是分布式,通过管理节点来提高扩容性和可用性。
1.1 功能
全文检索、结构化搜索、分析
1.2 数据的输入和输出
1.2.1 ES是分布式的文档存储
- 一个对象是基于特定语言的内存的数据结构。为了通过网络发送或者存储它,我们需要将它变成某种标准的格式。
- JSON是一种以人可读的文本表示对象的方法。它已经变成 NoSQL 世界交换数据的事实标准。当一个对象被序列化成为 JSON,它被称为一个 JSON 文档 。
- ES中,每个字段的所有数据都是默认被索引的。 即每个字段都有为了快速检索设置的专用倒排索引。而且,不像其他多数的数据库,它能在 同一个查询中使用所有这些倒排索引,并以惊人的速度返回结果。
1.2.2 什么是文档
- 字段的名字可以是任何合法的字符串,但 不可以包含英文句号( . )。
- 一个键可以是一个字段或者字段的名称,一个值可以为任意对象。
{
"name": "John Smith",
"age": 42,
"confirmed": true,
"join_date": "2014-06-01",
"home": {
"lat": 51.5,
"lon": 0.1
},
"accounts": [
{
"type": "facebook",
"id": "johnsmith"
},
{
"type": "twitter",
"id": "johnsmith"
}
]
}
- 在 Elasticsearch 中,术语文档有着特定的含义。它是指最顶层或者根对象, 这个根对象被序列化成 JSON 并存储到 Elasticsearch 中,指定了唯一 ID。
1.2.3 文档元数据
_index
文档在哪存放
一个索引名必须小写,不能以下划线开头,不能包含逗号。
_type
文档表示的对象类别
一个 _type
命名可以是大写或者小写,但是不能以下划线或者句号开头,不应该包含逗号, 并且长度限制为256个字符。
_id
文档唯一标识
ID 是一个字符串,当它和 _index
以及 _type
组合就可以唯一确定 Elasticsearch 中的一个文档。 当创建一个新的文档,要么提供自己的 _id
,要么让 Elasticsearch 帮你生成。
1.2.4 索引文档
- 使用自定义id
# 索引请求格式
--------------------------------------------------------------
PUT /{index}/{type}/{id}
{
"field": "value",
...
}
--------------------------------------------------------------
PUT /website/blog/123
{
"title": "My first blog entry",
"text": "Just trying this out...",
"date": "2014/01/01"
}
# 响应体
--------------------------------------------------------------
{
"_index": "website",
"_type": "blog",
"_id": "123",
"_version": 1,
"created": true
}
- ES帮我们生成
# 索引请求格式
--------------------------------------------------------------
POST /{index}/{type}/{id}
{
"field": "value",
...
}
--------------------------------------------------------------
POST /website/blog/
{
"title": "My second blog entry",
"text": "Still trying this out...",
"date": "2014/01/01"
}
# 响应体
--------------------------------------------------------------
{
"_index": "website",
"_type": "blog",
"_id": "AVFgSgVHUP18jI2wRx0w",
"_version": 1,
"created": true
}
'''
自动生成的 ID 是 URL-safe、 基于 Base64 编码且长度为20个字符的 GUID 字符串。 这些 GUID 字符串由可修改的 FlakeID 模式生成,这种模式允许多个节点并行生成唯一 ID ,且互相之间的冲突概率几乎为零。
'''
1.2.5 取回一个文档
- 为了从 Elasticsearch 中检索出文档,我们仍然使用相同的
_index
,_type
, 和_id
,但是 HTTP 谓词更改为GET
GET /website/blog/123?pretty
- 响应体
{
"_index" : "website",
"_type" : "blog",
"_id" : "123",
"_version" : 1,
"found" : true,
"_source" : {
"title": "My first blog entry",
"text": "Just trying this out...",
"date": "2014/01/01"
}
}
GET
请求的响应体包括{"found": true}
,这证实了文档已经被找到。 如果我们请求一个不存在的文档,我们仍旧会得到一个 JSON 响应体,但是found
将会是false
。 此外, HTTP 响应码将会是404 Not Found
,而不是200 OK
。