一、环境搭建
1. 安装 ElasticSearch
在MacOS安装ElasticSearch-7.2.0 版本,步骤非常简单,简单几行命令就可以搞定。下面是安装步骤
# 下载ElasticSearch程序
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.2.0-darwin-x86_64.tar.gz
# sha512秘钥文件
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.2.0-darwin-x86_64.tar.gz.sha512
# 文件比对
shasum -a 512 -c elasticsearch-7.2.0-darwin-x86_64.tar.gz.sha512
# 解压
tar -xzf elasticsearch-7.2.0-darwin-x86_64.tar.gz
2.启动ElasticSearch服务
完成第1步之后,我们可以直接在终端
运行下面的命令,来启动ES服务。
cd elasticsearch-7.2.0/
./bin/elasticsearch
执行启动命令后,如果终端上打印了类似如下的信息,说明ES服务启动成功了。
[2019-07-21T14:29:48,576][INFO ][o.e.p.PluginsService ] [maxiangchengdeMacBook-Pro.local] loaded module [aggs-matrix-stats]
[2019-07-21T14:29:48,577][INFO ][o.e.p.PluginsService ] [maxiangchengdeMacBook-Pro.local] loaded module [analysis-common]
[2019-07-21T14:29:48,577][INFO ][o.e.p.PluginsService ] [maxiangchengdeMacBook-Pro.local] loaded module [ingest-common]
[2019-07-21T14:29:48,577][INFO ][o.e.p.PluginsService ] [maxiangchengdeMacBook-Pro.local] loaded module [ingest-geoip]
[2019-07-21T14:29:48,577][INFO ][o.e.p.PluginsService ] [maxiangchengdeMacBook-Pro.local] loaded module [ingest-user-agent]
二、快速上手
在本地启动ElasticSearch服务后,ES默认监听9200端口,我们的查询,修改和添加等操作都会在该端口完成。客户端和ES的交互使用http协议,接口设计使用restful风格,使用起来非常简洁友好。换句话说,我们可以直接使用POSTMAN
和ES进行交互,通过发送PUT
,GET
,DELETE
等请求,来完成数据的CRUD操作。http协议对编程语言也非常友好,因为几乎所有编程语言都支持http协议,大大降低了使用门槛,这些也是ES非常流行的原因。
ES中有几个概念需要提前了解,ES不同于传统数据库,它的数据存储的单位和关系型数据库会略有差别,有些可能只是叫法不一样,我认为本质还是一样的。以大家经常使用的MySQL为例,我们对数据存储单元会有下面这几个等级的划分,从大到小排列,分别为database
,table
,row
,column
。分别表示 数据库
,表
,行
,列
。同样的,在ES中也有数据单元的划分,下图表示ES中数据存储单元和MySQL数据存储单元的对应关系。
在最新版本的ES中,只有索引,文档和字段的概念,索引相当于Mysql中的数据库,文档代表数据行,字段表示列,没有了表的概念,其它都是一样的。
1.新建索引 Index
理解了上面的概念,现在我们来新建一个索引,由于ES的交互基于http协议,索引我们只需要使用POSTMAN
向本地的ES服务发起http请求即可新建索引,请求类型为PUT请求,在请求地址中带上需要新建的索引名称。例如:下面的请求会新建一个customer
索引。
PUT http://localhost:9200/customer
请求完成后若得到如下响应,表示索引建立成功
{
"acknowledged": true,
"shards_acknowledged": true,
"index": "customer"
}
ES中索引名不能重复,若重复建立索引,会得到如下响应,表示索引已存在
{
"error": {
"root_cause": [
{
"type": "resource_already_exists_exception",
"reason": "index [customer/lpNY_ivHTBedu8Nj14jdBQ] already exists",
"index_uuid": "lpNY_ivHTBedu8Nj14jdBQ",
"index": "customer"
}
],
"type": "resource_already_exists_exception",
"reason": "index [customer/lpNY_ivHTBedu8Nj14jdBQ] already exists",
"index_uuid": "lpNY_ivHTBedu8Nj14jdBQ",
"index": "customer"
},
"status": 400
}
2.添加文档 Document
建立好索引,下一步我们在索引中添加数据,即文档(Document)
。客户端和ES的交互采用JSON格式和HTTP协议。例如:下面的请求将在customer
的索引中创建一个id为1的文档,文档中包含了username
,age
,phone
等字段。另外,在_doc后面指定了文档的id,文档id在每个索引中都是唯一的,类似数据库中的主键id。
PUT /customer/_doc/1
{
"username" : "jack",
"age" : 18,
"phone" : "18880000000"
}
添加成功后,得到如下响应
{
"_index": "customer",
"_type": "_doc",
"_id": "1",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}
响应中包含了很多字段,现在我们只需要关注successful字段即可,1表示成功。
3.修改文档 Document
我们也可以对文档进行修改,指定文档id,提交需要修改的JSON数据,就可以对指定id的文档进行修改。例如:下面的请求将修改文档id为1的文档。
PUT /customer/_doc/1
{
"username" : "meetmax",
"age" : 15,
"phone" : "18880000000"
}
修改成功后,得到如下响应
{
"_index": "customer",
"_type": "_doc",
"_id": "1",
"_version": 3,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 2,
"_primary_term": 1
}
4.删除文档 Document
针对一些不需要的文档,也可以执行删除操作,只需要指定索引名和文档id,然后调用DELETE
方法即可。
DELETE /customer/_doc/1
删除成功后,得到如下响应
{
"_index": "customer",
"_type": "_doc",
"_id": "1",
"_version": 4,
"result": "deleted",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 3,
"_primary_term": 1
}
5.匹配搜索 (match query)
有了索引和文档数据,我们需要对已有数据进行查询。不同于SQL语句,ES也有自己的查询语言,称为 Query DSL
。简单来讲,它是以JSON为载体构造出查询条件,只是换了个表述方式,和SQL语句的本质是一样的,能实现的查询功能也差不多,ES甚至支持SQL语法,只是需要安装扩展即可实现。例如:下面的请求,将查询在customer
索引中,username
字段值为jack的文档。
GET /customer/_search
{
"query" : {
"match" : { "username" : "jack" }
}
}
查询成功后,将得到如下响应,其中hits字段包含了匹配到的数据
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 0.9808292,
"hits": [
{
"_index": "customer",
"_type": "_doc",
"_id": "1",
"_score": 0.9808292,
"_source": {
"username": "jack",
"age": 18,
"phone": "18880000000"
}
}
]
}
}
三、总结
总体来说,ES还是非常容易上手的,当然也仅仅局限于上手,文中用到的只是ES功能中的冰山一角,真正的实践中,有更多复杂的用法,可以实现非常强大的功能。例如:对数据进行聚合查询和分页,多条件过滤查询,甚至对地理位置进行查询。
另外,我们可能对ES中的核心概念还有些模糊,对ES的底层实现机制也不了解,但是现在不理解没关系,有了实践经验之后,以后理解起来会很快,掌握的更深刻。后面我也会对ES的核心概念和实现原理总结和分析,希望对你有用!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。