1. 程式人生 > 實用技巧 >ElasticSearch - 1 概述 & 指令碼操作

ElasticSearch - 1 概述 & 指令碼操作

ElasticSearch - 1 概述 & 指令碼操作

1.1 基於資料庫查詢的問題

  • 效能低 最左匹配原則

  • 功能弱

    • 查詢“華為手機”

資料結構和演算法演示網站:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

1.2 倒排索引 (重點)

倒排索引:將文件進行分詞,形成詞條和id的對應關係即為反向索引

以唐詩為例,所處包含“前”的詩句
正向索引:由《靜夜思》-->窗前明月光--->“前”字

反向索引:“前”字-->窗前明月光-->《靜夜思》
反向索引的實現就是對詩句進行分詞,分成單個的詞,由詞推據,即為反向索引

“床前明月光”--> 分詞
將一段文字按照一定的規則,拆分為不同的詞條(term)

1.3 ES儲存和查詢的原理 (重點)

空間換時間

**
**

生成的倒排索引中,詞條會排序,形成一顆樹形結構,提升詞條的查詢速度

1. 使用“華為”作為關鍵字查詢
   華為:1,3
2. 使用“華為手機”作為關鍵字查詢
   華為:1,3
   手機:1,2,3

1.4 ES概念詳解

  • ElasticSearch是一個基於Lucene的搜尋伺服器

  • 是一個分散式、高擴充套件、高實時的搜尋與資料分析引擎

  • 基於RESTful web介面

  • Elasticsearch是用Java語言開發的,並作為Apache許可條款下的開放原始碼釋出,是一種流行的企業級搜尋引擎

  • 官網:

    https://www.elastic.co/

  • 應用場景

    • 搜尋:海量資料的查詢
    • 日誌資料分析 ELK
    • 實時資料分析
  • ES和MySql分工不同

2 ES及輔助工具的安裝

2.1 ES的安裝

2.1.1 方案一:原生的安裝方式

參見安裝文件

2.1.2 方案二:使用提供的虛擬機器

  • 安裝ES

開啟ES服務

docker start elasticsearch

如果啟動等一會(兩分鐘)後沒有反應,重啟docker後再次啟動es

# 重啟docker服務
systemctl restart docker
# 重啟ES服務
docker start elasticsearch

測試地址:http://192.168.31.130:9200/

  • 安裝Kibana

注意:一定要等ES啟動完成之後,再啟動kibana

啟動kibana

docker start kibana

測試地址:http://192.168.31.130:5601/

3 ElasticSearch核心概念(重點)

  • 索引(index)

    • ElasticSearch儲存資料的地方,可以理解成關係型資料庫中的資料庫概念。
  • 對映(mapping)

    • mapping定義了每個欄位的名稱、型別、欄位所使用的分詞器等。相當於關係型資料庫中的表結構。
  • 文件(document)

    • Elasticsearch中的最小資料單元,常以json格式顯示。一個document相當於關係型資料庫中的一行資料。
  • 倒排索引

    • 一個倒排索引由文件中所有不重複詞的列表構成,對於其中每個詞,對應一個包含它的文件id列表。
  • 型別(type) (瞭解)

    • 一種type就像一類表。如使用者表、角色表等。在Elasticsearch7.X預設type為_doc
    • ES 5.x中一個index可以有多種type
    • ES 6.x中一個index只能有一種type
    • ES 7.x以後,將逐步移除type這個概念,現在的操作已經不再使用,預設_doc

4 指令碼操作ES

4.1 RESTful風格介紹

  1. REST(Representational State Transfer),表述性狀態轉移,是一組架構約束條件和原則。滿足這些約束條件和原則的應用程式或設計就是RESTful。就是一種定義介面的規範。

  2. 基於HTTP。

  3. 使用XML格式定義或JSON格式定義。

  4. 每一個URI代表1種資源。

  5. 客戶端使用GET、POST、PUT、DELETE 4個表示操作方式的動詞對服務端資源進行操作:

    1. GET:用來獲取資源
    2. POST:用來新建資源(也可以用於更新資源)
    3. PUT:用來更新資源
    4. DELETE:用來刪除資源

4.2 操作索引

PUT

http://ip:埠/索引名稱

查詢

GET http://ip:埠/索引名稱  # 查詢單個索引資訊
GET http://ip:埠/索引名稱1,索引名稱2...  # 查詢多個索引資訊
GET http://ip:埠/_all  # 查詢所有索引資訊

刪除索引

DELETE http://ip:埠/索引名稱

關閉、開啟索引

POST http://ip:埠/索引名稱/_close  
POST http://ip:埠/索引名稱/_open

4.3 ES資料型別

簡單資料型別

  • 字串

    • text:會分詞,不支援聚合
    • keyword:不會分詞,將全部內容作為一個詞條,支援聚合

聚合:相當於mysql 中的sum(求和)

  • 數值

  • 布林:boolean

  • 二進位制:binary

  • 範圍型別

    • integer_range, float_range, long_range, double_range, date_range
  • 日期:date

複雜資料型別

  • 陣列:[ ] Nested: nested (for arrays of JSON objects 陣列型別的JSON物件)
  • 物件:{ } Object: object(for single JSON objects 單個JSON物件)

4.4 操作對映(熟練)

新增對映

 PUT person
 
 GET person
 #新增對映
 PUT /person/_mapping
 {
   "properties":{
     "name":{
       "type":"text"
     },
     "age":{
       "type":"integer"
     }
   }
 }

建立索引並新增對映

 #建立索引並新增對映
PUT /person1
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text"
      },
      "age": {
        "type": "integer"
      }
    }
  }
}

GET person1/_mapping

新增欄位

#新增欄位
PUT /person1/_mapping
{
  "properties": {
      "name": {
        "type": "text"
      },
      "age": {
        "type": "integer"
      }
    }
}

4.5 操作文件(熟練)

查詢所有文件

#查詢所有文件
GET /person1/_search

根據id查詢文件

GET /person1/_doc/1

新增文件,指定id

# POST 和 PUT 均可
POST /person1/_doc/2
{
  "name":"張三",
  "age":18,
  "address":"北京"
}

新增文件,不指定id

#新增文件,不指定id
POST /person1/_doc/
{
  "name":"張三",
  "age":18,
  "address":"北京"
}

刪除指定id文件

#刪除指定id文件
DELETE /person1/_doc/1