ES安装
首先先去官网下载,我使用的ELK中EK都是7.12.0版本的且都是window,后续会更改成centos docker的,前期为了尽快入门,所以才使用windows。
elastic官网
下载压缩包并进行解压,执行bin目录下的elasticsearch.bat即可。(前提是你需要具备jdk1.8和node的环境, es需要jdk1.8,node为es-head和kibana需要)。
至于kibana不再这里过多叙述了,可见我kibana文章配置一下即可。
进入到这个页面说明已经安装完成。
官网基础命令学习
学习一个新技术最好的方式就是拜读官网文档。不过对于英语不好的同学比较困难,可以去搜索中文版的。
备注: 本文只是为了方便学习命令,对于es概念不明确的同学,还是要去学习一下,否则很容易不知道索引,文档,映射等知识点。
首先第一步
创建索引
PUT /customer?pretty
执行这个命令就会创建一个名为customer的索引,有的同学可能问pretty什么意思?为什么要加这个?
这个参数只是为了方便看返回值结构,官网说,这个参数调用是为了把返回值打印成json格式。接下来的命令我就不在过多叙述这个pretty 了。
执行成功,返回值是这个样子的,其中acknowledged字段表示执行成功!
删除索引
DELETE /customer?pretty
创建文档
PUT /customer/doc/1?pretty
{"name": "test"}
这个命令是在customer索引下创建一个文档,文档_id为1,body里就是文档的内容。
解释一下这些属性:
前5个我觉得比较简单,一看就知道什么意思,就是索引customer的文档,_id为1,版本1,执行的是创建操作;_shards代表的分片,说有两个分片,执行成功一个,失败0个,有的同学会问还有一个去哪里了?因为写入操作只会有一个分片相应进行执行,不会全部都执行。
seq_no:严格递增的顺序号,每个文档一个,Shard级别严格递增,保证后写入的Doc的_seq_no大于先写入的Doc的_seq_no。
_primary_term:_primary_term也和_seq_no一样是一个整数,每当Primary Shard发生重新分配时,比如重启,Primary选举等,_primary_term会递增1。
_primary_term主要是用来恢复数据时处理当多个文档的_seq_no一样时的冲突,比如当一个shard宕机了,raplica需要用到最新的数据,就会根据_primary_term和_seq_no这两个值来拿到最新的document。
查询文档
GET /customer/doc/1?pretty
_source字段专门用来存储返回数据的。
更新文档
POST /customer/doc/1/_update?pretty
{"doc": {"name":"Jane Doe"}}
备注: es是没有物理修改和删除功能的。对于修改官网的说法是:es删除旧文档然后在该索引下创建新文档并应用更新。删除的话,es中有个.del的文件,只要是删除操作就会将该文档标记为删除状态,在搜索的时候其实也是可以搜索到的,只不过es过滤了一下所以才不会返回出来。每次在启动segment合并工作时,那些被标记为删除的文档才会被真正删除。
删除文档
DELETE /cusotmer/doc/2?pretty
批量操作
像上面命令那样都是针对单条数据操作,es还提供了批量操作。
POST /customer/doc/_bulk?pretty
{"index":{"_id":"1"}}
{"name": "John Doe" }
{"index":{"_id":"2"}}
{"name": "Jane Doe" }
这个例子是官网提供的,代表这要在customer索引下创建两个文档,文档索引_id不同。
POST /customer/doc/_bulk?pretty
{"update":{"_id":"1"}}
{"doc": { "name": "John Doe becomes Jane Doe" } }
{"delete":{"_id":"2"}}
执行完以上命令之后,会修改第一条数据,并删除第二条。
以上都是小试牛刀,接下来才到了es复杂的命令
搜索API
GET /bank/_search?q=*&sort=account_number:asc&pretty
这个命令是查询bank索引的所有数据,q=* 表示匹配所有文档在bank索引下,sort=account_number:asc表示,返回值依据account_number进行asc排序。
除了上面的方式之外,还可以将参数放入body中
GET /bank/_search
{
"query": {"match_all": {}},
"sort": [
{"account_number": "asc"}
]
}
一如既往,我根据官网的说法解释一下属性含义:
took: 调用这个接口的反应时间
time_out: 判断查询是否超时
_shards: 有多少分片被查询了,同时告诉我们成功多少,失败多少
hits: 查询结果
hits.total: 匹配我们查询条件的文档总数
hits.hits: 实际查询的结果集合
hits.sort: 排序的关键字
hits._score和max_score这些字段都是需要在filter时候,才会有值;意义是,根据score可以获取相似度最高的数据,分数值越高相似度越大。
介绍查询语言
GET /bank/_search
{
"query": { "match_all": {} },
"size" : 1
}
size字段表示,匹配查询的数据,返回1条
GET /bank/_search
{
"query": { "match_all": {} },
"from": 10,
"size": 10
}
from字段表示,从序号多少开始,
GET /bank/_search
{"query": {"match_all": {}},
"_source": {"account_number", "balance"}
}
_source字段表示返回值显示的字段有哪些。
备注: match_all是查询所有;match是匹配某字段值;match_phrase匹配所有包含的数据。
eg.
GET /bank/_search
{
"query": { "match_phrase": { "address": "mill lane" } }
}
匹配所有==mill lane的数据。
bool查询
GET /bank/_search
{
"query": {
"bool": {
"must": [
{ "match": { "address": "mill" } },
{ "match": { "address": "lane" } }
]
}
}
}
查询所有满足address包含mill lane的数据,
备注: must 为包含的条件必须都为true才满足;should:包含条件满足一条即可;must_not:都不满足。
当然也可以进行组合使用:
GET /bank/_search
{
"query": {
"bool": {
"must": [
{ "match": { "age": "40" } }
],
"must_not": [
{ "match": { "state": "ID" } }
]
}
}
}
filter 查询
GET /bank/_search
{
"query": {
"bool": {
{"must": {"match_all": {}}},
"filter": {
"range":{
"balance": {
"gte": 20000,
"lte": 30000
}
}
}
}
}
}
这个接口的意思是,首选匹配所有数据,然后根据balance字段进行过滤,查询出所有满足balance大于等于20000,小于等于30000,如果是大于就是gt(greater than) lt (less than) e(equal)
聚合查询
GET /bank/_search
{
"size": 0,
"aggs": {
"group_by_state": {
"terms": {
"field": "state.keyword"
}
}
}
}
这个接口相当于mysql中
SELECT state, COUNT(*) FROM bank GROUP BY state ORDER BY COUNT(*) DESC
结论
本文只是针对官网给出的入门级案例做出解释,主要是自己为了忘记时候方便查看,不喜勿喷。后续随着官网文档的深入会继续更新。