在MacOS安装ElasticSearch-7.2.0 版本,步骤很是简单,简单几行命令就能够搞定。下面是安装步骤sql
# 下载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
完成第1步以后,咱们能够直接在终端
运行下面的命令,来启动ES服务。shell
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数据存储单元的对应关系。json
在最新版本的ES中,只有索引,文档和字段的概念,索引至关于Mysql中的数据库,文档表明数据行,字段表示列,没有了表的概念,其它都是同样的。restful
理解了上面的概念,如今咱们来新建一个索引,因为ES的交互基于http协议,索引咱们只须要使用POSTMAN
向本地的ES服务发起http请求便可新建索引,请求类型为PUT请求,在请求地址中带上须要新建的索引名称。例如:下面的请求会新建一个customer
索引。
PUT http://localhost:9200/customer
请求完成后若获得以下响应,表示索引创建成功elasticsearch
{ "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 }
创建好索引,下一步咱们在索引中添加数据,即文档(Document)
。客户端和ES的交互采用JSON格式和HTTP协议。例如:下面的请求将在customer
的索引中建立一个id为1的文档,文档中包含了username
,age
,phone
等字段。另外,在_doc后面指定了文档的id,文档id在每一个索引中都是惟一的,相似数据库中的主键id。ui
PUT /customer/_doc/1 { "username" : "jack", "age" : 18, "phone" : "18880000000" }
添加成功后,获得以下响应spa
{ "_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表示成功。
咱们也能够对文档进行修改,指定文档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 }
针对一些不须要的文档,也能够执行删除操做,只须要指定索引名和文档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 }
有了索引和文档数据,咱们须要对已有数据进行查询。不一样于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的核心概念和实现原理总结和分析,但愿对你有用!