Elasticsearch 使用誤區(qū)之將 Elasticsearch 視為關(guān)系數(shù)據(jù)庫(kù)!
Elasticsearch 是一個(gè)強(qiáng)大的工具,尤其在全文檢索、實(shí)時(shí)分析、機(jī)器學(xué)習(xí)、地理數(shù)據(jù)應(yīng)用、日志和事件數(shù)據(jù)分析、安全信息和事件管理等場(chǎng)景有大量的應(yīng)用。
然而,Elastic Stack 技術(shù)棧的選型及應(yīng)用效能取決于正確的使用方式。選型錯(cuò)誤或者誤用 Elasticsearch 可能會(huì)導(dǎo)致擴(kuò)展性問(wèn)題、性能問(wèn)題(如為解決一個(gè)問(wèn)題使用非常復(fù)雜的腳本導(dǎo)致性能極差)等,從而使整體體驗(yàn)感變差。所以,本文區(qū)別于之前的正向講解的方式,更多的講解反例或者負(fù)面應(yīng)用案例?!耙允窞殍b”,以便于大家更好地使用 Elasticsearch。
本系列文章會(huì)有 10 幾篇左右,一篇一個(gè)知識(shí)點(diǎn)講解 Elasticsearch 使用誤區(qū)解讀,敬請(qǐng)期待!
誤區(qū)1:將 Elasticsearch 視為關(guān)系數(shù)據(jù)庫(kù)
Elasticsearch 常被誤解為 MySQL 或者 PostgreSQL 等關(guān)系數(shù)據(jù)庫(kù)的直接替代品,用戶除了直接替代使用外更看其全文搜索和快速聚合的能力。
然而,咱們必須清晰的認(rèn)知:Elasticsearch 設(shè)計(jì)初衷不是處理復(fù)雜事務(wù)和關(guān)系數(shù)據(jù)模型的。
我們從下面幾個(gè)維度逐一展開討論:
1、該不該選型 Elasticsearch ?
個(gè)人建議先了解 Elasticsearch 的適用場(chǎng)景以及不適用場(chǎng)景,這樣能清楚 Elastic Stack 技術(shù)棧更適合哪些業(yè)務(wù)需求。
例如,咱們文章之前圖解的六大應(yīng)用場(chǎng)景是非常適合的。然而,對(duì)于需要處理復(fù)雜事務(wù)、多表聯(lián)查操作和高一致性要求的應(yīng)用,如銀行系統(tǒng)的交易處理和ERP系統(tǒng)等,Elasticsearch 則不太適合。
圖片
Elasticsearch 更適用場(chǎng)景:
圖片
圖片
通過(guò)對(duì)比這些場(chǎng)景,反觀自己的業(yè)務(wù)需求,就能判斷是否應(yīng)該選型 Elasticsearch 甚至 Elastic Stack 作為技術(shù)棧。
2、理解 Elasticsearch 的設(shè)計(jì)
圖片來(lái)自官方博客
Elasticsearch 是一種面向文檔的搜索引擎,專為快速搜索大量數(shù)據(jù)而設(shè)計(jì)。
Elasticsearch 基于 Apache Lucene 構(gòu)建,提供了強(qiáng)大的全文搜索、分析和數(shù)據(jù)聚合功能。
以下是 Elasticsearch 的主要特點(diǎn):
- 全文搜索:Elasticsearch 提供了高效的全文搜索功能,能夠快速檢索和匹配大規(guī)模文本數(shù)據(jù)。
- 分布式架構(gòu):Elasticsearch 采用分布式架構(gòu),能夠水平橫向擴(kuò)展,處理海量數(shù)據(jù)(PB級(jí)甚至以上都不是問(wèn)題)和高并發(fā)請(qǐng)求。
- 數(shù)據(jù)分析:Elasticsearch 支持復(fù)雜的聚合查詢,可以做多維度的快速統(tǒng)計(jì)和分析數(shù)據(jù),但聚合、去重等結(jié)果不是精準(zhǔn)的。有精準(zhǔn)需求的企業(yè)場(chǎng)景也要評(píng)估和掂量一下。
- ......
圖片來(lái)自官方博客
如前所述,Elasticsearch 并不是設(shè)計(jì)用來(lái)處理關(guān)系數(shù)據(jù)和事務(wù)的。它的主要優(yōu)勢(shì)在于分析和搜索能力,而不是數(shù)據(jù)關(guān)系的嚴(yán)格維護(hù)。
3、理解 Elasticsearch 與關(guān)系數(shù)據(jù)庫(kù)的比較
關(guān)系數(shù)據(jù)庫(kù)(如 MySQL、Oracle 及 PostgreSQL 等)和 Elasticsearch 之間有幾個(gè)關(guān)鍵區(qū)別:
3.1 數(shù)據(jù)模型比較
- 關(guān)系數(shù)據(jù)庫(kù)使用結(jié)構(gòu)化的表和行來(lái)存儲(chǔ)數(shù)據(jù),并通過(guò)外鍵和約束來(lái)維護(hù)數(shù)據(jù)的一致性。
- Elasticsearch 則使用文檔(document,本質(zhì)是 JSON 格式)來(lái)存儲(chǔ)數(shù)據(jù),每個(gè)文檔可以包含不同的字段和數(shù)據(jù)類型。
特性 | 關(guān)系數(shù)據(jù)庫(kù) | Elasticsearch |
數(shù)據(jù)存儲(chǔ)結(jié)構(gòu) | 結(jié)構(gòu)化的表和行 | 文檔 |
數(shù)據(jù)類型 | 每個(gè)表的字段類型固定 | 每個(gè)文檔可以包含不同的字段和數(shù)據(jù)類型 |
數(shù)據(jù)一致性 | 通過(guò)外鍵和約束來(lái)維護(hù)數(shù)據(jù)的一致性 | 不提供數(shù)據(jù)一致性保障 |
查詢能力 | 支持復(fù)雜的 SQL 查詢、事務(wù)和聯(lián)接操作 | 主要用于全文搜索和數(shù)據(jù)聚合 |
事務(wù)支持 | 完整的事務(wù)支持 | 不支持事務(wù) |
性能優(yōu)化 | 索引、緩存和查詢優(yōu)化 | 分片、索引和緩存 |
主要優(yōu)勢(shì) | 關(guān)系數(shù)據(jù)處理和數(shù)據(jù)一致性維護(hù) | 快速搜索和高效的數(shù)據(jù)聚合 |
3.2 查詢能力比較
- 關(guān)系數(shù)據(jù)庫(kù)支持復(fù)雜的 SQL 查詢、事務(wù)和多表關(guān)聯(lián)操作,以保證數(shù)據(jù)的一致性和完整性。
- Elasticsearch 主要側(cè)重于全文搜索和數(shù)據(jù)聚合,不支持復(fù)雜的事務(wù)和多表關(guān)聯(lián)操作。
在關(guān)系數(shù)據(jù)庫(kù)中,我們可以使用復(fù)雜的 SQL 查詢、事務(wù)和多表關(guān)聯(lián)操作來(lái)保證數(shù)據(jù)的一致性和完整性。例如:
BEGIN TRANSACTION;
-- 更新訂單狀態(tài)
UPDATE orders
SET status = 'shipped'
WHERE order_id = 123;
-- 減少庫(kù)存
UPDATE products
SET stock = stock - 1
WHERE product_id = 456;
-- 記錄客戶活動(dòng)
INSERT INTO customer_activity (customer_id, activity)
VALUES (789, 'Order 123 shipped');
COMMIT;
圖片
上述事務(wù)示例能確保所有相關(guān)操作(更新訂單狀態(tài)、減少庫(kù)存和記錄客戶活動(dòng))要么全部成功,要么全部失敗,從而保證數(shù)據(jù)的一致性(事務(wù)的本質(zhì))。
在 Elasticsearch 中,我們主要側(cè)重于全文搜索和數(shù)據(jù)聚合分析,而不支持復(fù)雜的事務(wù)和多表關(guān)聯(lián)操作。
比如:用戶需求如下:
“想請(qǐng)教下大佬們,假設(shè) es 中 有兩個(gè)表,一個(gè)會(huì)員表,一個(gè)訂單表,如果想關(guān)聯(lián)查詢,例如查詢24年注冊(cè)的所有的會(huì)員的訂單總數(shù),通過(guò)什么方式能快速查詢?”
咱們文章做過(guò)剖析,Elasticsearch 不是一丁點(diǎn)也不支持多表關(guān)聯(lián),只是支持的力度有限,支持的形式核心有如下幾種:
- 自己業(yè)務(wù)層面實(shí)現(xiàn)
- Nested 嵌套數(shù)據(jù)類型
- Join 父子文檔類型
- 寬表冗余存儲(chǔ)
- Enrich processor 預(yù)處理方式