2

一、环境搭建

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数据存储单元的对应关系。

5d342b49e4b0b3e4dccce432.png

在最新版本的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的核心概念和实现原理总结和分析,希望对你有用!


MeetMax
100 声望3 粉丝

I'm a monkey coder