沒錯,你離分佈式搜索只差一個Elasticsearch入門

學習真的是一件令人開心的事情,上次分享了 Redis 入門的文章後,收到了很多小夥伴的鼓勵,比如說:“哎呀,不錯呀,二哥,通俗易懂,十分鐘真的入門了”。瞅瞅,瞅瞅,我決定再接再厲,入門一下 Elasticsearch,因爲我們公司的商城系統升級了,需要用 Elasticsearch 做商品的搜索。

不過,我首先要聲明一點,我對 Elasticsearch 並沒有進行很深入的研究,僅僅是因爲要用,就學一下。但作爲一名負責任的技術博主,我是用心的,爲此還特意在某某時間上買了一門視頻課程,作者叫阮一鳴。說實話,他光禿禿的頭頂讓我對這門課程產生了濃厚的興趣。

01、Elasticsearch 是什麼

Elasticsearch 是一個分佈式、RESTful 風格的搜索和數據分析引擎,能夠解決不斷湧現出的各種用例。作爲 Elastic Stack 的核心,它集中存儲您的數據,幫助您發現意料之中以及意料之外的情況。

以上引用來自於官方,不得不說,解釋得蠻文藝的。意料之中和意料之外,這兩個詞讓我想起來了某一年的高考作文題(情理之中和意料之外)。

Elastic Stack 又是什麼呢?整個架構圖如下圖(來源於網絡,侵刪)所示。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-CiOoRCUi-1590569499118)(https://upload-images.jianshu.io/upload_images/22459064-f1fe8e18c683820d?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

信息量比較多,對吧?那就記住一句話吧,Elasticsearch 是 Elastic Stack 的核心。

國內外的很多知名公司都在用 Elasticsearch,比如說滴滴、骨骼、微軟等等。Elasticsearch 有很多強大的功能,比如說全文搜索、購物推薦、附近定位推薦等等。

理論方面的內容就不說太多了,我怕小夥伴們會感到枯燥。畢竟入門嘛,實戰才重要。

02、安裝 Elasticsearch

Elasticsearch 是由 Java 開發的,所以早期的版本需要先在電腦上安裝 JDK 進行支持。後來的版本中內置了 Java 環境,所以直接下載就行了。Elasticsearch 針對不同的操作系統有不同的安裝包,我們這篇入門的文章就以 Windows 爲例吧。

下載地址如下:

https://www.elastic.co/cn/downloads/elasticsearch

最新的版本是 7.6.2,280M 左右。但我硬生生花了 10 分鐘的時間才下載完畢,不知道是不是連通的 200M 帶寬不給力,還是官網本身下載的速度就慢,反正我去洗了 6 顆葡萄喫完後還沒下載完。

Elasticsearch 是免安裝的,只需要把 zip 包解壓就可以了。

image

1)bin 目錄下是一些腳本文件,包括 Elasticsearch 的啓動執行文件。

2)config 目錄下是一些配置文件。

3)jdk 目錄下是內置的 Java 運行環境。

4)lib 目錄下是一些 Java 類庫文件。

5)logs 目錄下會生成一些日誌文件。

6)modules 目錄下是一些 Elasticsearch 的模塊。

7)plugins 目錄下可以放一些 Elasticsearch 的插件。

直接雙擊 bin 目錄下的 elasticsearch.bat 文件就可以啓動 Elasticsearch 服務了。

輸出的日誌信息有點多,不用細看,注意看到有“started”的字樣就表明啓動成功了。爲了進一步確認 Elasticsearch 有沒有啓動成功,可以在瀏覽器的地址欄裏輸入 http://localhost:9200 進行查看(9200 是 Elasticsearch 的默認端口號)。

你看,爲了 Search。

那如何停止服務呢?可以直接按下 Ctrl+C 組合鍵——粗暴、壁咚。

03、安裝 Kibana

通過 Kibana,我們可以對 Elasticsearch 服務進行可視化操作,就像在 Linux 操作系統下安裝一個圖形化界面一樣。

下載地址如下:

https://www.elastic.co/cn/downloads/kibana

最新的版本是 7.6.2,284M 左右,體積和 Elasticsearch 差不多。選擇下載 Windows 版,zip 格式的,完成後直接解壓就行了。下載的過程中又去洗了 6 顆葡萄喫,狗頭。

image

包目錄不再一一解釋了,進入 bin 目錄下,雙擊運行 kibana.bat 文件,啓動 Kibana 服務。整個過程比 Elasticsearch 要慢一些,當看到 [Kibana][http] http server running 的信息後,說明服務啓動成功了。

image

在瀏覽器地址欄輸入 http://localhost:5601 查看 Kibana 的圖形化界面。

由於當前的 Elasticsearch 服務端中還沒有任何數據,所以我們可以選擇「Try Our Sample Data」導入 Kibana 提供的模擬數據體驗一下。下圖是導入電商數據庫的看板頁面,是不是很豐富?

image

打開 Dev Tools 面板,可以看到一個簡單的 DSL 查詢語句(一種完全基於 JSON 的特定於領域的語言),點擊「運行」按鈕後就可以看到 JSON 格式的數據了。

04、Elasticsearch 的關鍵概念

在進行下一步之前,需要先來理解 Elasticsearch 中的幾個關鍵概念,比如說什麼是索引,什麼是類型,什麼是文檔等等。Elasticsearch 既然是一個數據引擎,它裏面的一些概念就和 MySQL 有一定的關係。

看完上面這幅圖(來源於網絡,侵刪),是不是瞬間就清晰了。向 Elasticsearch 中存儲數據,其實就是向 Elasticsearch 中的 index 下面的 type 中存儲 JSON 類型的數據。

05、在 Java 中使用 Elasticsearch

有些小夥伴可能會問,“二哥,我是一名 Java 程序員,我該如何在 Java 中使用 Elasticsearch 呢?”這個問題問得好,這就來,這就來。

Elasticsearch 既然內置了 Java 運行環境,自然就提供了一系列 API 供我們操作。

第一步,在項目中添加 Elasticsearch 客戶端依賴:

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.6.2</version>
</dependency>

第二步,新建測試類 ElasticsearchTest:

public class ElasticsearchTest {
    public static void main(String[] args) throws IOException {

        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("localhost", 9200, "http")));

        IndexRequest indexRequest = new IndexRequest("writer")
                .id("1")
                .source("name", "沉默王二",
                        "age", 18,
                        "memo", "一枚有趣的程序員");
        IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);

        GetRequest getRequest = new GetRequest("writer", "1");

        GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
        String sourceAsString = getResponse.getSourceAsString();

        System.out.println(sourceAsString);
        client.close();
    }
}

1)RestHighLevelClient 爲 Elasticsearch 提供的 REST 客戶端,可以通過 HTTP 的形式連接到 Elasticsearch 服務器,參數爲主機名和端口號。

有了 RestHighLevelClient 客戶端,我們就可以向 Elasticsearch 服務器端發送請求並獲取響應。

2)IndexRequest 用於向 Elasticsearch 服務器端添加一個索引,參數爲索引關鍵字,比如說“writer”,還可以指定 id。通過 source 的方式可以向當前索引中添加文檔數據源(鍵值對的形式)。

有了 IndexRequest 對象後,可以調用客戶端的 index() 方法向 Elasticsearch 服務器添加索引。

3)GetRequest 用於向 Elasticsearch 服務器端發送一個 get 請求,參數爲索引關鍵字,以及 id。

有了 GetRequest 對象後,可以調用客戶端的 get() 方法向 Elasticsearch 服務器獲取索引。getSourceAsString() 用於從響應中獲取文檔數據源(JSON 字符串的形式)。

好了,來看一下程序的輸出結果:

{"name":"老羅","age":18,"memo":"一枚有趣的程序員"}

完全符合我們的預期,perfect!

也可以通過 Kibana 的 Dev Tools 面板查看“writer”索引,結果如下圖所示。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章