Contents

ElasticSearch 前需要了解東西

使用 ElasticSearch 之前,需要先了解它的核心索引概念,特別是倒排索引(Inverted Index),這是 ElasticSearch 能夠快速全文搜尋的關鍵。

正向索引 vs 倒排索引

正向索引(Forward Index)

傳統資料庫的索引方式:「文件 → 詞語」的映射。

文件 ID 內容
Doc 1 Java 是程式語言
Doc 2 Python 也是程式語言
Doc 3 Java 和 Python 都很流行

搜尋「Java」時,需要逐一掃描每個文件,效率低。

倒排索引(Inverted Index)

ElasticSearch 使用的方式:「詞語 → 文件列表」的映射。

詞語 出現在哪些文件
Java Doc 1, Doc 3
Python Doc 2, Doc 3
程式語言 Doc 1, Doc 2
流行 Doc 3

搜尋「Java」時,直接查詢索引表,立即得到 Doc 1 和 Doc 3,不需要掃描全部文件。


倒排索引的建立過程

ElasticSearch 在寫入文件時,會對文字欄位進行分析(Analysis)

  1. Tokenization(斷詞):將文字拆成詞元(Token)

    • 輸入:"Java is a programming language"
    • 輸出:["java", "is", "a", "programming", "language"]
  2. 過濾(Filtering):移除停用詞、轉小寫、詞幹提取(Stemming)

    • 輸出:["java", "programming", "language"](去除 “is”, “a”)
  3. 建立倒排索引:記錄每個詞在哪些文件、哪個位置出現


ElasticSearch 基本架構

核心概念對照

ElasticSearch 概念 對應關聯式資料庫
Index 資料庫(Database)
Document 資料列(Row)
Field 欄位(Column)
Mapping Schema

Shard(分片)

一個 Index 可以分成多個 Shard,分散儲存在不同節點(Node)上,實現水平擴展。

1
2
3
4
Index: products
├── Shard 0 → Node 1
├── Shard 1 → Node 2
└── Shard 2 → Node 3

Replica(副本)

每個 Shard 可以有多個 Replica(副本),提供:

  • 高可用性:主 Shard 故障時,Replica 接手
  • 讀取效能:搜尋請求可分散到 Replica
1
2
Shard 0 (Primary) → Node 1
Shard 0 (Replica) → Node 2  ← 讀取可以分散到這裡

為何 ElasticSearch 適合全文搜尋?

  1. 倒排索引:詞語查詢 O(1),不隨資料量增加而變慢
  2. 相關性評分(Relevance Score):使用 BM25 演算法對結果排序,最相關的排在最前面
  3. 分散式架構:透過 Shard 水平擴展,可處理 TB 級資料
  4. 近即時(Near Real-Time):文件寫入後約 1 秒內可被搜尋到
  5. 豐富的查詢語法:支援全文搜尋、模糊搜尋、範圍查詢、地理位置查詢等

基本操作範例

建立文件

1
2
3
curl -X POST "localhost:9200/products/_doc/1" \
  -H "Content-Type: application/json" \
  -d '{"name": "Java 程式設計", "price": 500}'

全文搜尋

1
2
3
4
5
6
7
8
9
curl -X GET "localhost:9200/products/_search" \
  -H "Content-Type: application/json" \
  -d '{
    "query": {
      "match": {
        "name": "程式設計"
      }
    }
  }'

參考資料