ElasticSearch 前需要了解東西
Contents
使用 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):
-
Tokenization(斷詞):將文字拆成詞元(Token)
- 輸入:
"Java is a programming language" - 輸出:
["java", "is", "a", "programming", "language"]
- 輸入:
-
過濾(Filtering):移除停用詞、轉小寫、詞幹提取(Stemming)
- 輸出:
["java", "programming", "language"](去除 “is”, “a”)
- 輸出:
-
建立倒排索引:記錄每個詞在哪些文件、哪個位置出現
ElasticSearch 基本架構
核心概念對照
| ElasticSearch 概念 | 對應關聯式資料庫 |
|---|---|
| Index | 資料庫(Database) |
| Document | 資料列(Row) |
| Field | 欄位(Column) |
| Mapping | Schema |
Shard(分片)
一個 Index 可以分成多個 Shard,分散儲存在不同節點(Node)上,實現水平擴展。
|
|
Replica(副本)
每個 Shard 可以有多個 Replica(副本),提供:
- 高可用性:主 Shard 故障時,Replica 接手
- 讀取效能:搜尋請求可分散到 Replica
|
|
為何 ElasticSearch 適合全文搜尋?
- 倒排索引:詞語查詢 O(1),不隨資料量增加而變慢
- 相關性評分(Relevance Score):使用 BM25 演算法對結果排序,最相關的排在最前面
- 分散式架構:透過 Shard 水平擴展,可處理 TB 級資料
- 近即時(Near Real-Time):文件寫入後約 1 秒內可被搜尋到
- 豐富的查詢語法:支援全文搜尋、模糊搜尋、範圍查詢、地理位置查詢等
基本操作範例
建立文件
|
|
全文搜尋
|
|