bool查詢原理 es 談談ES在資料應用中的作用

2021-10-13 17:48:30 字數 2357 閱讀 7980

es全名elasticsearch翻譯過來是彈性搜尋;從名字直觀的了解,這個東西是解決搜搜的問題;

作為乙個經常寫sql的人來說;搜尋在我的映像中就是select * from table where,那為什麼還要es?

mysql對於一些較為固定,欄位較少的查詢方式,可以通過簡單的增加索引來完成優化,在大多數公司,即使你對索引優化不熟悉,也有專門的dba來幫你完成一些簡單的優化。甚至有些電商公司要求程式中不允許出現orm,必須用純sql來完成業務邏輯,這樣dba可以直接介入到**中來。

不過到字段太多的時候這招就不靈了,欄位越多,查詢自然就越慢(比如單條記錄可能都超過了4k什麼,甚至有些oracle的表裡,乙個欄位就有幾兆資訊,當然幾兆資訊的這種這裡也解決不了,嗯)。

mysql表在普通查詢過程中,比如select * from *** limit 100w, 100;這種,小**隨便寫sql,可能不會體會到翻頁的痛。但你在乙個單錶3000w的系統中寫了limit 10000000, 10。那資料庫伺服器就哭了。因為實際上資料庫為了取出你想要的那幾條資料,需要把所有的資料也就是10000010條都取到記憶體中,複雜一點的select再加上order by則可能會同時涉及到多次磁碟讀取和檔案排序。慢上加慢。

除此之外,現在最流行的innodb之類的儲存引擎在計算count的時候非常的慢。當然了,網路上會有人從亂七八糟的文章裡看到換myisam應該就會更快的結論,但這其實是錯的。如果在select語句的where條件中也有表示式時,這兩種儲存引擎本質上都是一樣的,都會很慢很慢。

還有mysql的like,其實沒什麼玄幻的,每次做like本質還是查詢內容去和資料庫欄位做字串匹配。非常地慢。

現在一般的網際網路系統都是普遍的寫少讀多的系統,寫/讀搞不好會有1/5以上?但因為資料量龐大,為了讀取效率而去做拆表或者拆庫的話,有時候實在是有點得不償失。而且拆表拆庫對業務**來說也並不透明,還可能會對本來支援的功能造成額外的影響。只是為了查詢而去拆分的話,不是很合適。

上面這些問題,es都可以解決。企業裡對資料的查詢一般可以分為三種:列表查詢、詳情查詢和統計查詢。看名字也可以理解的差不多了,列表一般就是列表頁對應的查詢,詳情查詢一般就是具體id對應的詳情查詢,而統計查詢一般都是在看一些數值之類的報表,也就是一堆count值。

這三種查詢裡,mysql做起來最困難的是1和3,即列表查詢和統計查詢。列表查詢這種場景也會對應各種各樣的查詢條件,例如字段等於/小於/大於/不等判斷,或者像字串的嚴格匹配/前字尾模糊查詢,時間欄位的範圍查詢,in查詢等等。這些查詢都可以翻譯為es中的bool查詢,舉乙個簡單的例子:

}},},}]}},

"sort" : ,

"highlight" :

}

例如上面這個es中的bool查詢,就是從這種sql翻譯過來的:

select * from db/table where create_time between ('2016-08-11 00:00:00' and '2016-08-11 23:59:59')

and user_id = 37540 and status in (2, 1, 0);

對應到業務裡,常用的查詢其實大多數都是這些很簡單的條件並列,a && b && c && d。所以翻譯起來也比較簡單。

單錶的count放在es裡做也非常的快,為什麼呢?因為es本身會把單個欄位的一種值當作乙個term,然後會記錄這個term出現的所有文件和出現次數。舉個例子,我們公司的業務,你可能會去查詢某個業務線下的所有工單。那麼查詢條件就類似於where business_type is 6這樣。可能只需要一毫秒就返回了結果。很費解是不是?其實es也只是去讀了一下這個business_type是6的term出現的文件數。邏輯上是很簡單的。

這是不是說明es就是萬能的了?

對於搜尋來說,es不是萬能的

首先是翻頁的問題,es裡有上億資料,翻到最後一頁的時候還是會比較慢,並且會影響到整個系統的load,然後系統響應變慢。因為其原理還是拿一堆資料來做merge。

從傳統的sql思維翻譯到es的dsl過程也稍微有點痛苦。因為es畢竟是從搜尋引擎的角度去做這些事情,所以如果你當db來用的話,其dsl設計就顯得很彆扭。雖然有了上面的轉換規則,但實際上業務轉換起來並沒有這麼方便,比如在通常的查詢裡還可能會有where a = 1 or b = 2。顯然想轉成dsl就沒有這麼方便了。

把es作為儲存來用,是有短板的

es不是資料庫,所以如果你想要實現聯表查詢也會變得很麻煩。並且es不是乙個資料庫,所以沒有事務概念;所以一般用es+mysql來解決搜尋+儲存的功能

es父子結構查詢 ES 系列3 ES 檢索原理

索引原理 磁碟io與預讀 倒排索引 fst索引是加速資料查詢的重要手段,其核心原理是通過不斷的縮小想要獲取資料的範圍來篩選出最終想要的結果,同時把隨機的事件變成順序的事件。也就是說,有了這種索引機制,我們可以總是用同一種查詢方式來鎖定資料。磁碟io程式設計中非常高昂的操作,也是影響程式效能的重要因素...

es的bool,排序,聚合組合查詢

傳入的jsonobject sort 排序指定key aggs 聚合指定key sql的count 操作 列名6 獲取連線,clustername 集群名,hostname ip,port 埠號 9300 public transportclient init catch unknownhostex...

ES 004 ES工作原理

儲存資料shard hash routing number of primary shards routing是可變值,支援自定義,預設是文件 id hash函式生成資料,經過求餘演算法得到餘數,這個餘數就是分片的位置如何水平擴容put blogs settings elk 優勢 分布式實時檔案儲存...