ES教程
介绍:
Elastcisearch 是分布式的 文档 存储。
实时 JSON文档
在 Elasticsearch 中, 每个字段的所有数据 都是 默认被索引的 。 即每个字段都有为了快速检索设置的专用倒排索引
文档 ==根对象 ID唯一
文档本身数据 1.index索引--文档在哪存放 2.type文档表示的对象类别 3.id文档唯一标识
ps:索引:名字必须小写,不能以下划线开头,不能包含逗号
type 命名可以是大写或者小写,但是不能以下划线或者句号开头,不应该包含逗号, 并且长度限制为256个字符
字段的名字可以是任何合法的字符串,但不可以包含时间段。
1.命令:
curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'
VERB
适当的 HTTP 方法 或 谓词 : GET`、 `POST`、 `PUT`、 `HEAD 或者 `DELETE`。
PROTOCOL
http 或者 https`(如果你在 Elasticsearch 前面有一个 `https 代理)
HOST
Elasticsearch 集群中任意节点的主机名,或者用 localhost 代表本地机器上的节点。
PORT
运行 Elasticsearch HTTP 服务的端口号,默认是 9200 。
PATH
API 的终端路径(例如 _count 将返回集群中文档数量)。Path 可能包含多个组件,例如:_cluster/stats 和 _nodes/stats/jvm 。
QUERY_STRING
任意可选的查询字符串参数 (例如 ?pretty 将格式化地输出 JSON 返回值,使其更容易阅读)
BODY
一个 JSON 格式的请求体 (如果请求需要的话)
//查询
curl -XGET 'http://localhost:9200/_count?pretty' -d '
{
"query": {
"match_all": {}
}
}
'
//添加数据
使用自定义id索引文档
使用PUT请求创建一个索引为countries类型为country的文档。其文档编号为1,文档内容包含name和capital
curl -XPUT http://localhost:9200/countries/country/1?pretty -d '
{
"name": "中国",
"capital": "北京"
}'
ps:使用PUT时 索引ID存在则更新 不存在则创建
使用系统分配的id索引文档
curl -XPOST http://localhost:9200/countries/country?pretty -d '
{
"name": "韩国",
"capital": "首尔"
}'
ps:自动生成的 ID 是 URL-safe、 基于 Base64 编码且长度为20个字符的 GUID 字符串。 这些 GUID 字符串由可修改的 FlakeID 模式生成,这种模式允许多个节点并行生成唯一 ID ,且互相之间的冲突概率几乎为零。
原理:新建、索引和删除请求都是写(write)操作,它们必须在主分片上成功完成才能复制到相关的复制分片上,下面我们罗列在主分片和复制分片上成功新建、索引或删除一个文档必要的顺序步骤:
1、客户端给Node 1发送新建、索引或删除请求。
2、节点使用文档的_id确定文档属于分片0。它转发请求到Node 3,分片0位于这个节点上。
3、Node 3在主分片上执行请求,如果成功,它转发请求到相应的位于Node 1和Node 2的复制节点上。当所有的复制节点报告成功,Node 3报告成功到请求的节点,请求的节点再报告给客户端。
复制时的参数说明 replication:
复制默认的值是sync。这将导致主分片得到复制分片的成功响应后才返回,如果你设置replication为async,请求在主分片上被执行后就会返回给客户端。它依旧会转发请求给复制节点,但你将不知道复制节点成功与否。
PUT是幂等方法,POST不是。所以PUT用于更新、POST用于新增比较合适。
PUT,DELETE操作是幂等的。所谓幂等是指不管进行多少次操作,结果都一样。比如我用PUT修改一篇文章,然后在做同样的操作,每次操作后的结果并没有不同,DELETE也是一样。
POST是作用在一个集合资源之上的/articles),而PUT操作是作用在一个具体资源之上的(/articles/123)
ES可以使用PUT或者POST对文档进行更新,如果指定ID的文档已经存在,则执行更新操作
注意:执行更新操作的时候
ES首先将旧的文档标记为删除状态
然后添加新的文档
旧的文档不会立即消失,但是你也无法访问
ES会在你继续添加更多数据的时候在后台清理已经标记为删除状态的文档
//查询API
GET方法
GET http://localhost:9200/countries/_search?q=*&pretty
ps:q=*将匹配索引中的所有文档
POST方法
POST http://localhost:9200/countries/_search?pretty
{
"query": {
"match_all": {}
},
"from": 2,
"size": 1,
"sort": [
{
"capital": {
"order": "desc"
}
}
]
}
ps:使用from和size来翻页
1.size控制返回条目,默认为10
2.form默认为0
3.sort排序 排序方式为根据首都 降序
搜索注意事项 Term搜索时为精确搜索,String默认会分词,需要设置索引时"index":"not_analyzed"
批量操作
mget 可以使我们一次取回多个文档同样的方式, bulk 允许在单个步骤中进行多次 create 、 index 、 update 或 delete 请求。
bulk
{ action: { metadata }}\n //指定 哪一个文档 做 什么操作 。
//metadata 应该 指定被索引、创建、更新或者删除的文档的 _index 、 _type 和 _id 。
{ request body }\n //由文档的 _source 本身组成--文档包含的字段和值。
// 删除操作不需要 request body 行。
{ action: { metadata }}\n
{ request body }\n
格式理由:在批量请求中引用的每个文档可能属于不同的主分片, 每个文档可能被分配给集群中的任何节点。这意味着批量请求 bulk 中的每个 操作 都需要被转发到正确节点上的正确分片。lasticsearch可以直接读取被网络缓冲区接收的原始数据。 它使用换行符字符来识别和解析小的 action/metadata 行来决定哪个分片应该处理每个请求。
如果单个请求被包装在 JSON 数组中,那就意味着我们需要执行以下操作:
将 JSON 解析为数组(包括文档数据,可以非常大)
查看每个请求以确定应该去哪个分片
为每个分片创建一个请求数组
将这些数组序列化为内部传输格式
将请求发送到每个分片
介绍:
Elastcisearch 是分布式的 文档 存储。
实时 JSON文档
在 Elasticsearch 中, 每个字段的所有数据 都是 默认被索引的 。 即每个字段都有为了快速检索设置的专用倒排索引
文档 ==根对象 ID唯一
文档本身数据 1.index索引--文档在哪存放 2.type文档表示的对象类别 3.id文档唯一标识
ps:索引:名字必须小写,不能以下划线开头,不能包含逗号
type 命名可以是大写或者小写,但是不能以下划线或者句号开头,不应该包含逗号, 并且长度限制为256个字符
字段的名字可以是任何合法的字符串,但不可以包含时间段。
1.命令:
curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'
VERB
适当的 HTTP 方法 或 谓词 : GET`、 `POST`、 `PUT`、 `HEAD 或者 `DELETE`。
PROTOCOL
http 或者 https`(如果你在 Elasticsearch 前面有一个 `https 代理)
HOST
Elasticsearch 集群中任意节点的主机名,或者用 localhost 代表本地机器上的节点。
PORT
运行 Elasticsearch HTTP 服务的端口号,默认是 9200 。
PATH
API 的终端路径(例如 _count 将返回集群中文档数量)。Path 可能包含多个组件,例如:_cluster/stats 和 _nodes/stats/jvm 。
QUERY_STRING
任意可选的查询字符串参数 (例如 ?pretty 将格式化地输出 JSON 返回值,使其更容易阅读)
BODY
一个 JSON 格式的请求体 (如果请求需要的话)
//查询
curl -XGET 'http://localhost:9200/_count?pretty' -d '
{
"query": {
"match_all": {}
}
}
'
//添加数据
使用自定义id索引文档
使用PUT请求创建一个索引为countries类型为country的文档。其文档编号为1,文档内容包含name和capital
curl -XPUT http://localhost:9200/countries/country/1?pretty -d '
{
"name": "中国",
"capital": "北京"
}'
ps:使用PUT时 索引ID存在则更新 不存在则创建
使用系统分配的id索引文档
curl -XPOST http://localhost:9200/countries/country?pretty -d '
{
"name": "韩国",
"capital": "首尔"
}'
ps:自动生成的 ID 是 URL-safe、 基于 Base64 编码且长度为20个字符的 GUID 字符串。 这些 GUID 字符串由可修改的 FlakeID 模式生成,这种模式允许多个节点并行生成唯一 ID ,且互相之间的冲突概率几乎为零。
原理:新建、索引和删除请求都是写(write)操作,它们必须在主分片上成功完成才能复制到相关的复制分片上,下面我们罗列在主分片和复制分片上成功新建、索引或删除一个文档必要的顺序步骤:
1、客户端给Node 1发送新建、索引或删除请求。
2、节点使用文档的_id确定文档属于分片0。它转发请求到Node 3,分片0位于这个节点上。
3、Node 3在主分片上执行请求,如果成功,它转发请求到相应的位于Node 1和Node 2的复制节点上。当所有的复制节点报告成功,Node 3报告成功到请求的节点,请求的节点再报告给客户端。
复制时的参数说明 replication:
复制默认的值是sync。这将导致主分片得到复制分片的成功响应后才返回,如果你设置replication为async,请求在主分片上被执行后就会返回给客户端。它依旧会转发请求给复制节点,但你将不知道复制节点成功与否。
PUT是幂等方法,POST不是。所以PUT用于更新、POST用于新增比较合适。
PUT,DELETE操作是幂等的。所谓幂等是指不管进行多少次操作,结果都一样。比如我用PUT修改一篇文章,然后在做同样的操作,每次操作后的结果并没有不同,DELETE也是一样。
POST是作用在一个集合资源之上的/articles),而PUT操作是作用在一个具体资源之上的(/articles/123)
ES可以使用PUT或者POST对文档进行更新,如果指定ID的文档已经存在,则执行更新操作
注意:执行更新操作的时候
ES首先将旧的文档标记为删除状态
然后添加新的文档
旧的文档不会立即消失,但是你也无法访问
ES会在你继续添加更多数据的时候在后台清理已经标记为删除状态的文档
//查询API
GET方法
GET http://localhost:9200/countries/_search?q=*&pretty
ps:q=*将匹配索引中的所有文档
POST方法
POST http://localhost:9200/countries/_search?pretty
{
"query": {
"match_all": {}
},
"from": 2,
"size": 1,
"sort": [
{
"capital": {
"order": "desc"
}
}
]
}
ps:使用from和size来翻页
1.size控制返回条目,默认为10
2.form默认为0
3.sort排序 排序方式为根据首都 降序
搜索注意事项 Term搜索时为精确搜索,String默认会分词,需要设置索引时"index":"not_analyzed"
批量操作
mget 可以使我们一次取回多个文档同样的方式, bulk 允许在单个步骤中进行多次 create 、 index 、 update 或 delete 请求。
bulk
{ action: { metadata }}\n //指定 哪一个文档 做 什么操作 。
//metadata 应该 指定被索引、创建、更新或者删除的文档的 _index 、 _type 和 _id 。
{ request body }\n //由文档的 _source 本身组成--文档包含的字段和值。
// 删除操作不需要 request body 行。
{ action: { metadata }}\n
{ request body }\n
格式理由:在批量请求中引用的每个文档可能属于不同的主分片, 每个文档可能被分配给集群中的任何节点。这意味着批量请求 bulk 中的每个 操作 都需要被转发到正确节点上的正确分片。lasticsearch可以直接读取被网络缓冲区接收的原始数据。 它使用换行符字符来识别和解析小的 action/metadata 行来决定哪个分片应该处理每个请求。
如果单个请求被包装在 JSON 数组中,那就意味着我们需要执行以下操作:
将 JSON 解析为数组(包括文档数据,可以非常大)
查看每个请求以确定应该去哪个分片
为每个分片创建一个请求数组
将这些数组序列化为内部传输格式
将请求发送到每个分片