分佈式搜索引擎—ElasticSearch 快速上手

1、環境搭建

1. 安裝 ElasticSearch

在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

2.啓動ElasticSearch服務

完成第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]

2、快速上手

在本地啓動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

5d342b49e4b0b3e4dccce432.png

在最新版本的ES中,只有索引,文檔和字段的概念,索引至關於Mysql中的數據庫,文檔表明數據行,字段表示列,沒有了表的概念,其它都是同樣的。restful

1.新建索引 Index

理解了上面的概念,如今咱們來新建一個索引,因爲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
}

2.添加文檔 Document

創建好索引,下一步咱們在索引中添加數據,即文檔(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表示成功。

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"
                }
            }
        ]
    }
}

3、總結

整體來講,ES仍是很是容易上手的,固然也僅僅侷限於上手,文中用到的只是ES功能中的冰山一角,真正的實踐中,有更多複雜的用法,能夠實現很是強大的功能。例如:對數據進行聚合查詢和分頁,多條件過濾查詢,甚至對地理位置進行查詢。另外,咱們可能對ES中的核心概念還有些模糊,對ES的底層實現機制也不瞭解,可是如今不理解不要緊,有了實踐經驗以後,之後理解起來會很快,掌握的更深入。後面我也會對ES的核心概念和實現原理總結和分析,但願對你有用!

相關文章
相關標籤/搜索