Elasticsearch入門到精通第一篇-基礎概念到安裝查詢

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

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搭建之後會搭建一個可視化界面,有以下選擇(也可以再搜索看看有沒有更好的,或者自己造一個?):

    這裏推薦: 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": [數據]
    }}
    

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

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