天天看點

Elasticsearch入門到精通第一篇-基礎概念到安裝查詢1. Elasticsearch 基礎概念2. Elasticsearch 安裝3. 簡單的案例介紹

本系列文章記錄,摘要,總結 對Elasticsearch 的系統學習,基于官方文檔 Elasticsearch 2.x 版本 , 内容可能過時

文章目錄

  • 1. Elasticsearch 基礎概念
    • 1.1 Elasticsearch 是什麼
    • 1.2 Elasticsearch 功能
    • 1.3 與Elasticsearch互動
  • 2. Elasticsearch 安裝
  • 3. 簡單的案例介紹
    • 3.1 分析需求
    • 3.2 插入資料
    • 3.3 查詢單條資料
    • 3.4查詢得到屬性解析
    • 3.5 查詢全部資料
    • 3.6 查詢屬性解析

1. Elasticsearch 基礎概念

1.1 Elasticsearch 是什麼

Elasticsearch 是一個開源的搜尋引擎,建立在一個全文搜尋引擎庫 Apache Lucene™ 基礎之上。 Lucene 可以說是當下最先進、高性能、全功能的搜尋引擎庫,但是很複雜.

Elasticsearch 使用 Java 編寫的,它的内部使用 Lucene 做索引與搜尋,但它使全文檢索變得簡單, 通過隐藏 Lucene 的複雜性,提供一套簡單一緻的 RESTful API。

1.2 Elasticsearch 功能

  • 全文搜尋引擎
  • 一個分布式的實時文檔存儲,每個字段 可以被索引與搜尋
  • 一個分布式實時分析搜尋引擎
  • 能勝任上百個服務節點的擴充,并支援 PB 級别的結構化或者非結構化資料

1.3 與Elasticsearch互動

互動可以選擇

  1. Java api 互動,其中包含兩種用戶端 (預設9300)
    • 節點用戶端(Node client)

      節點用戶端作為一個非資料節點加入到本地叢集中。換句話說,它本身不儲存任何資料,但是它知道資料在叢集中的哪個節點中,并且可以把請求轉發到正确的節點。

    • 傳輸用戶端(Transport client)

      輕量級的傳輸用戶端可以将請求發送到遠端叢集。它本身不加入叢集,但是它可以将請求轉發到叢集中的一個節點上。

其中叢集也是通過9300 通信
  1. restful API互動

    一般在es搭建之後會搭建一個可視化界面,有以下選擇(也可以再搜尋看看有沒有更好的,或者自己造一個?):

    • ElasticHD
    • elasticsearch-head
    • dejavu
    • kibana
    這裡推薦: kibana(官方出品,後續還可以組合ELK), es-head (老派ui,簡單易用,推薦插件安裝方式)

2. Elasticsearch 安裝

下載下傳較慢 , 官方下載下傳位址包含

目前版本是

Version: 7.7.1

, 可以使用yum , apt-get , docker , zip 等方式安裝在Linux或Windows , 官方有詳細的下載下傳安裝步驟

此處應該與你的Java 用戶端jar包版本對應 , 并且如果需要安裝kibana logstash 等也是需要版本對應

此時,你可以打開你的主機+端口 通路你的es , 如果出現es 資訊則說明成功!

如果要和Java 用戶端互動 需要注意9300 端口是否打開 9200 隻是http端口

如果後面需要對中文分詞還需要安裝中文分詞器插件,下載下傳對應版本後解壓到es/plugins/

3. 簡單的案例介紹

首先,在es中有

文檔

的概念,相當于sql中的表 ,在es中對整個文檔(相當于一條記錄)進行索引,排序,過濾,

而不是像sql那樣針對一列建立索引,并且這裡有 反向索引 後面有詳細講解,并且使用

JSON

作為文檔的序列化格式

這裡從一個簡單的案例介紹

文檔

索引

搜尋

聚合

等基礎概念 :

我們受雇于 Megacorp 公司,作為 HR 部門新的 “熱愛無人機” (“We love our drones!”)激勵項目的一部分,我們的任務是為此建立一個員工目錄。該目錄應當能培養員工認同感及支援實時、高效、動态協作,是以有一些業務需求:

  • 支援包含多值标簽、數值、以及全文本的資料
  • 檢索任一員工的完整資訊
  • 允許結構化搜尋,比如查詢 30 歲以上的員工
  • 允許簡單的全文搜尋以及較複雜的短語搜尋
  • 支援在比對文檔内容中高亮顯示搜尋片段
  • 支援基于資料建立和管理分析儀表盤

3.1 分析需求

那麼,首先我們應該存儲

員工

資料,才能進行後續的操作,我們将

員工

文檔

形式存儲,

一個文檔代表一個員工

, 存儲資料到es的行為叫做

索引

(動詞,索引一個文檔就是存儲一個文檔到索引中),但,在索引一個文檔前,需确定存儲到哪個

索引

(名詞,類似于關系資料庫中的

資料庫

概念)

是以

一個es叢集

可以包含很

多個索引

(名詞),

每個索引

(名詞)可以包含很

多個類型

(類似于表),

每個類型

可以存儲

多個文檔

,

每個文檔

又有

多個屬性

是以我們應該做以下操作:

  1. 每個員工索引一個文檔,文檔包含員工所有資訊
  2. 每個文檔都是

    employee

    類型
  3. 該類型位于索引

    megacorp

  4. 該索引儲存在我們的es叢集中

至此,我們應該能夠厘清楚每一步具體在做什麼,盡管步驟有點多,但是很簡單,那麼我們可以通過一條語句完成:

3.2 插入資料

PUT /megacorp/employee/1
{
    "first_name" : "John",
    "last_name" :  "Smith",
    "age" :        25,
    "about" :      "I love to go rock climbing",
    "interests": [ "sports", "music" ]
}

           

解釋以下這條語句

這是cUrl 格式語句,發送put的http請求到

localhost:9200/megacorp/employee/1?pretty

指定

json

格式,并包含請求内容

路徑

/megacorp/employee/1

包含了:

megacorp

索引名稱

employee

類型名稱

1

員工的id

請求内容則包含了該名員工的資訊

在我們發送請求時,沒有索引es會自動建立

索引

類型

屬性

再增加幾條資料

PUT /megacorp/employee/2
{
    "first_name" :  "Jane",
    "last_name" :   "Smith",
    "age" :         32,
    "about" :       "I like to collect rock albums",
    "interests":  [ "music" ]
}

PUT /megacorp/employee/3
{
    "first_name" :  "Douglas",
    "last_name" :   "Fir",
    "age" :         35,
    "about":        "I like to build cabinets",
    "interests":  [ "forestry" ]
}

           
将 HTTP 指令由 PUT 改為 GET 可以用來檢索文檔,同樣的,可以使用 DELETE 指令來删除文檔,以及使用 HEAD 指令來檢查文檔是否存在。如果想更新已存在的文檔,隻需再次 PUT 。

3.3 查詢單條資料

GET /megacorp/employee/1
           
{
  "_index": "megacorp",
  "_type": "employee",
  "_id": "1",
  "_version": 1,
  "found": true,
  "_source": {
    "first_name": "John",
    "last_name": "Smith",
    "age": 25,
    "about": "I love to go rock climbing",
    "interests": [
      "sports",
      "music"
    ]
  }
}
           

3.4查詢得到屬性解析

可以看到所屬

索引

類型

id

版本

(如果多次送出put就會覆寫,就會自動更新版本,目前是1)

foud 狀态辨別

_source

資料

3.5 查詢全部資料

GET /megacorp/employee/_search

           
{
  "took": 4,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 3,
    "max_score": 1,
    "hits": [
      {
        "_index": "megacorp",
        "_type": "employee",
        "_id": "1",
        "_score": 1,
        "_source": {
          "first_name": "John",
          "last_name": "Smith",
          "age": 25,
          "about": "I love to go rock climbing",
          "interests": [
            "sports",
            "music"
          ]
        }
      },
      {
        "_index": "megacorp",
        "_type": "employee",
        "_id": "2",
        "_score": 1,
        "_source": {
          "first_name": "Jane",
          "last_name": "Smith",
          "age": 32,
          "about": "I like to collect rock albums",
          "interests": [
            "music"
          ]
        }
      },
      {
        "_index": "megacorp",
        "_type": "employee",
        "_id": "3",
        "_score": 1,
        "_source": {
          "first_name": "Douglas",
          "last_name": "Fir",
          "age": 35,
          "about": "I like to build cabinets",
          "interests": [
            "forestry"
          ]
        }
      }
    ]
  }
}

           

3.6 查詢屬性解析

{
  "took": 花費時間,
  "timed_out": 是否查詢逾時,
  "_shards": {
    "total": 分片總數,
    "successful": 分片成功數,
    "failed": 分片失敗數
  },
  "hits": {
    "total": 本次搜尋,傳回幾條結果,
    "max_score": 本次搜尋的所有結果中,最大的相關度分數是多少,每一條document對于search的相關度,越相關,_score分數越大,排位越靠前,
    "hits": [資料]
    }}
    
           

至此,簡單的插入,查詢已經完成,下一節我們通過查詢表達式搜尋

繼續閱讀