Elasticsearch 7.x 之文檔、索引和 REST API 【基礎入門篇】

  • 2019 年 10 月 16 日
  • 筆記

前幾天寫過一篇《Elasticsearch 7.x 最詳細安裝及配置》,今天繼續最新版基礎入門內容。這一篇簡單總結了 Elasticsearch 7.x 之文檔、索引和 REST API。

  • 什麼是文檔
  • 文檔Unique ID
  • 文檔元數據
  • 什麼是索引
  • REST API

一、索引文檔(Document)

1.1 白話什麼是文檔

從使用案例出發,Elasticsearch 是面向文檔,文檔是所有搜索數據的最小單元。

  • 案例一:每個公司都有業務日誌平台,比如交易業務日誌。
    文檔:每一條日誌文件中的日誌項,就是文檔

  • 案例二:可以搜索並播放電影的在線影片網站
    文檔:每一個電影的具體資訊,就是文檔

  • 案例三:可以搜索並下載文件的雲存儲網站,類似百度雲
    文檔:每一個文件具體內容資訊,就是文檔

等等案例很多,那麼文檔就是類似資料庫裡面的一條長長的存儲記錄。文檔(Document)是索引資訊的基本單位。

文檔被序列化成為 JSON 格式,物理保存在一個索引中。JSON 是一種常見的互聯網數據交換格式:

  • 文檔欄位名:JSON 格式由 name/value pairs 組成,對應的 name 就是文檔欄位名
  • 文檔欄位類型:每個欄位都有對應的欄位類型:String、integer、long 等,並支援數據&嵌套

1.2 文檔的 Unique ID

file

每個文檔都會有一個 Unique ID,其欄位名稱為 _id

  • 自行設置指定 ID 或通過 Elasticsearch 自動生成
  • 其值不會被索引
  • 注意:該 _id 欄位的值可以在某些查詢 term, terms, match, query_string, simple_query_string 等中訪問,但不能在 aggregations,scripts 或 sorting 中使用。如果需要對 _id 欄位進行排序或匯總,建議新建一個文檔欄位複製 _id 欄位的內容
PUT my_index/_doc/1  {    "text": "Document with ID 1"  }    PUT my_index/_doc/2&refresh=true  {    "text": "Document with ID 2"  }    GET my_index/_search  {    "query": {      "terms": {        "_id": [ "1", "2" ]      }    }  }

1.3 文檔元數據

file

元數據是用於標註文檔的相關資訊,那麼索引文檔的元數據如下:

  • _index 文檔所屬索引名稱
  • _type 文檔所屬類型名
  • _id 文檔唯一 ID
  • _score 文檔相關性打分
  • _source 文檔 JSON 數據
  • _version 文檔版本資訊

其中 _type 文檔所屬類型名,需要關注版本不同之間區別:

  • 7.0 之前,一個索引可以設置多個 types
  • 7.0 開始,被 Deprecated 了。一個索引只能創建一個 type,值為 _doc

二、索引(Index)

2.1 索引不同意思

作為名詞,索引代表是在 Elasticsearch 集群中,可以創建很多不同索引。也是本小節要總結的內容。

作為動詞,索引代表保存一個文檔到 Elasticsearch。就是在 Elasticsearch 創建一個倒排索引的意思

2.2 什麼是索引

索引,就是相似類型文檔的集合。類似 Spring Bean 容器裝載著很多 Bean ,ES 索引就是文檔的容器,是一類文檔的集合。

以前導入了 kibana_sample_data_flights 索引,通過 GET 下面這個 URL ,就能得到索引一些資訊:

GET http://localhost:9200/kibana_sample_data_flights

結果如下:

{      "kibana_sample_data_flights": {          "aliases": {},          "mappings": {              "properties": {                  "AvgTicketPrice": {                      "type": "float"                  },                  "Cancelled": {                      "type": "boolean"                  },                  "Carrier": {                      "type": "keyword"                  },                  "DestLocation": {                      "type": "geo_point"                  },                  "FlightDelay": {                      "type": "boolean"                  },                  "FlightDelayMin": {                      "type": "integer"                  },                  "timestamp": {                      "type": "date"                  }              }          },          "settings": {              "index": {                  "number_of_shards": "1",                  "auto_expand_replicas": "0-1",                  "blocks": {                      "read_only_allow_delete": "true"                  },                  "provided_name": "kibana_sample_data_flights",                  "creation_date": "1566271868125",                  "number_of_replicas": "0",                  "uuid": "SfR20UNiSLKJWIpR1bcrzQ",                  "version": {                      "created": "7020199"                  }              }          }      }  }

根據返回結果,我們知道:

  • mappings:定義文檔欄位的類型
  • settings:定義不同數據分布
  • aliases:定義索引的別名,可以通過別名訪問該索引

索引,是邏輯空間概念,每個索引有對那個的 Mapping 定義,對應的就是文檔的欄位名和欄位類型。相比後面會講到分片,是物理空間概念,索引中存儲數據會分散到分片上。

實戰經驗總結:aliases 別名大有作為,比如 my_index 遷移到 my_index_new , 數據遷移後,只需要保持一致的別名配置。那麼通過別名訪問索引的業務方都不需要修改,直接遷移即可。

2.3 跟 MySQL 類比

基本理解了 Elasticsearch 重要的兩個概念,可以將 ES 關鍵點跟關係型資料庫類比如下:

file

三、REST API 方便 ES 被各種語言調用

file

如圖,Elasticsearch 提供了 REST API,方便,相關索引 API 如下:

# 查看索引相關資訊  GET kibana_sample_data_ecommerce    # 查看索引的文檔總數  GET kibana_sample_data_ecommerce/_count    # 查看前10條文檔,了解文檔格式  POST kibana_sample_data_ecommerce/_search  {  }    # _cat indices API  # 查看indices  GET /_cat/indices/kibana*?v&s=index    # 查看狀態為綠的索引  GET /_cat/indices?v&health=green    # 按照文檔個數排序  GET /_cat/indices?v&s=docs.count:desc    # 查看具體的欄位  GET /_cat/indices/kibana*?pri&v&h=health,index,pri,rep,docs.count,mt    # How much memory is used per index?  GET /_cat/indices?v&h=i,tm&s=tm:desc

具體 API 可以通過 POSTMan 等工具操作,或者安裝 kibana ,對應的 Dev Tools
工具進行訪問。

(完),更多可以看 ES 7.x 系列教程 bysocket.com

資料: