作者介紹:
李猛(ynuosoft),Elastic-stack 産品深度使用者,ES 認證工程師,2012 年接觸 Elasticsearch,對 Elastic-Stack 開發、架構、運維等方面有深入體驗,實踐過多種 Elasticsearch 項目,最暴力的大資料分析應用,最複雜的業務系統應用;業餘為企業提供 Elastic-stack 咨詢教育訓練以及調優實施。
現狀背景
背景需求
産品資訊,資料量在幾個 TB 級以上,每種工業産品都有大量的标簽資訊,标簽資訊多數屬于數值類型,且是屬于範圍那種資料,如某安防頭盔尺寸是 L 碼,配合适合範圍55cm~65cm,對于此種資料查詢,若标簽屬性較少,還可以走傳統的資料庫索引查詢,若标簽屬性很多,則顯然很吃力。
原有方案
企業技術負責人入行IT很早,原始的技術棧組合是 Sqlserver+Clucene 組合,原始工業産品資訊存儲在資料庫中,搜尋查詢走 Clucene,有很多問題,如下:
• 自主包裝 Clucene 核心庫,架構與業務代碼深度耦合,單次需求變更都需要釋出版本,不具備穩定性
• 索引實時更新幾乎沒有,屬于離線更新,且更新一次周期很長
• Clucene 版本很舊,對于搜尋的支援還是早期分詞階段,僅支援反向索引
• 對于範圍搜尋,采用的是分詞方式實作,不能做到精确的範圍搜尋,這個是最核心迫切需要的功能
• 基于 Clucene 開發的搜尋應用 ,索引資料太大,客戶花很多精力實作分布式,且效果不理想。
技術實作
相比傳統關系型資料庫,Elasticsearch 實作的方式更加直接高效。
Range類型設定
Elasticsearch 支援多種範圍類型
• 數值類型
• 日期類型
• IP位址類型
若在關系資料庫中則每個标簽屬性需要2個字段表示範圍值。
Range資料填充
填充範圍資料,有多種表達式
• 大于,gt
• 小于,lt
• 大于等于,gte
• 小于等于,lte
Range資料查詢
查詢文法很簡單,不過查詢的關聯關系有幾種
• 相交,查詢條件的範圍與字段資料範圍有交叉,預設使用
• 包含,查詢條件的範圍值,包含字段的資料範圍值
• 反包含,與包含相反,查詢條件的範圍值包含在字段的資料範圍之内。
若在關系資料庫中查詢相交則需要2組表達式合并才可以,若多個标簽屬性同時查詢,則更複雜。
技術原理
在跟客戶企業溝通中,發現比較重要的資訊是,技術負責人對于搜尋領域的知識認知比較陳舊,Lucene 發展早已不僅僅是反向索引,已經支援了很多索引算法,且應用領域也早就突破分詞搜尋,Elastic 産品版本近年更新很快,相應的 Lucene 也一樣。
為什麼選擇 Elasticsearch 替代關系型資料庫做範圍查詢最合适呢?原因如下:
産品功能
Elasticsearch 從 2016 年引入了 BKD 樹算法,在建構索引時會依據字段類型設定不同的算法實作,無需要人工幹預,隻要設計正确的類型,如下
• 若是字元類型的,基于 Inverted Index 建構索引
• 若是數值類型,基于 BKD-Tree 建構索引
算法介紹
• Bkd-Tree 作為一種基于 K-D-B-tree 的索引結構,用來對多元度的點資料 (multi-dimensional point data) 集進行索引。關于建構 BKD-Tree 過程不在本文探讨範圍内,詳細可以查閱更專業的論文。
• 從前面客戶需求描述得到,客戶的工業産品資訊有很多範圍類型的标簽屬性,在 Elasticsearch 中,僅需要建構一個索引即可滿足高效查找,且預設是所有标簽屬性自動構造索引。
• 想想看若基于傳統關系型資料庫實作,每标簽屬性都需要至少 2 個字段,且多個标簽屬性要任意組合查詢,不能通過一個索引實作,需要建立很多索引,查詢時還必須保持最左原則;
• BKD-Tree 索引查詢效率比關系型資料庫的 BTree 更勝一籌。
結語
經驗總結
• Elastic 核心基于 Lucene,功能發展非常成熟,普通使用者沒有必要基于 Lucene 自主開發搜尋應用,隻需要關注自己的業務實作。
• 資料産品的競争更多的是産品背後實作算法的競争,對于我們來說需要經常更新自己的知識體系,選擇最合适的技術方案響應變化。
• DB 與 ES 混合應用已經成為目前潮流,Elastic 已經成為目前查詢應用标配
• ES 用的好,下班必須早
聲明:本文由原文作者“李猛”授權轉載,對未經許可擅自使用者,保留追究其法律責任的權利。
【
阿裡雲Elastic Stack】100%相容開源ES,獨有9大能力,提供免費X-pack服務(單節點價值$6000)
相關活動
更多折扣活動,請
通路阿裡雲 Elasticsearch 官網 阿裡雲 Elasticsearch 商業通用版,1核2G ,SSD 20G首月免費 阿裡雲 Logstash 2核4G首月免費