ElasticSearch 億級資料檢索案例實戰
二、需求說明
資料能跨月查詢,並且支援1年以上的歷史資料查詢與匯出。
按條件的資料查詢秒級返回。
三、elasticsearch檢索原理
3.1 關於ES和Lucene基礎結構
Cluster 包含多個Node的叢集
Node 叢集服務單元
Index 一個ES索引包含一個或多個物理分片,它只是這些分片的邏輯名稱空間
Type 一個index的不同分類,6.x後只能配置一個type,以後將移除
Document 最基礎的可被索引的資料單元,如一個JSON串
Shards 一個分片是一個底層的工作單元,它僅儲存全部資料中的一部分,它是一個Lucence例項 (一個lucene索引最大包含2,147,483,519 (= Integer.MAX_VALUE - 128)個文件數量)
Replicas 分片備份,用於保障資料安全與分擔檢索壓力
3.2 Lucene索引實現
http://lucene.apache.org/core/7_2_1/core/org/apache/lucene/codecs/lucene70/package-summary.html#package.description
For other features that we now commonly associate with search, such as sorting, faceting, and highlighting, this approach is not very efficient. The faceting engine,
for example, must look up each term that appears in each document that will make up the result set and pull the document IDs in order to build the facet list. In Solr, this is maintained in memory, and can be slow to load (depending on the number of documents, terms, etc.)
3.3 關於ES索引與檢索分片
shard = hash(routing) % number_of_primary_shards
四、優化案例
ES僅提供欄位的檢索,僅儲存HBase的Rowkey不儲存實際資料。
實際資料儲存在HBase中,通過Rowkey查詢,如下圖。
提高索引與檢索的效能建議,可參考官方文件
https://www.elastic.co/guide/en/elasticsearch/reference/current/tune-for-indexing-speed.html
4.1 優化索引效能
4.2 優化檢索效能
http://lucene.apache.org/core/7_4_0/core/org/apache/lucene/index/PointValues.html
from + size: 每分片檢索結果數最大為 from + size,假設from = 20, size = 20,則每個分片需要獲取20 * 20 = 400條資料,多個分片的結果在協調節點合併(假設請求的分配數為5,則結果數最大為 400*5 = 2000條) 再在記憶體中排序後然後20條給使用者。
這種機制導致越往後分頁獲取的代價越高,達到50000條將面臨沉重的代價,預設from + size預設如下:
index.max_result_window :10000
search_after: 使用前一個分頁記錄的最後一條來檢索下一個分頁記錄
在我們的案例中,首先使用from+size,檢索出結果後再使用search_after,在頁面上我們限制了使用者只能跳5頁,不能跳到最後一頁。
scroll: 用於大結果集查詢,缺陷是需要維護scroll_id
{
"mappings": {
"data": {
"dynamic": "false",
"_source": {
"includes": ["XXX"] -- 僅將查詢結果所需的資料儲存僅_source中
},
"properties": {
"state": {
"type": "keyword", -- 雖然state為int值,但如果不需要做範圍查詢,儘量使用keyword,因為int需要比keyword增加額外的消耗。
"doc_values": false -- 關閉不需要欄位的doc values功能,僅對需要排序,匯聚功能的欄位開啟。
},
"b": {
"type": "long" -- 使用了範圍查詢欄位,則需要用long或者int之類 (構建類似KD-trees結構)
}
}
}
},
"settings": {......}
}
五、效能測試
單節點5千萬到一億的資料量測試,檢查單點承受能力。
叢集測試1億-30億的數量,磁碟IO/記憶體/CPU/網路IO消耗如何。
隨機不同組合條件的檢索,在各個資料量情況下表現如何。
另外SSD與機械盤在測試中效能差距如何。
六、生產效果
作者 | mikevictor 來源:https://www.cnblogs.com/mikevictor07/p/10006553.html
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31545820/viewspace-2667231/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Elasticsearch 億級資料檢索效能最佳化案例實戰!Elasticsearch
- 萬字詳解PHP+Sphinx中文億級資料全文檢索實戰(實測億級資料0.1秒搜尋耗時)PHP
- 基於ElasticSearch實現商品的全文檢索檢索Elasticsearch
- 讀書筆記:從Lucene到Elasticsearch:全文檢索實戰筆記Elasticsearch
- ElasticSearch進階檢索Elasticsearch
- ElasticSearch入門檢索Elasticsearch
- ElasticSearch 實現分詞全文檢索 - 概述Elasticsearch分詞
- 資料檢索
- ElasticSearch 實現分詞全文檢索 - delete-by-queryElasticsearch分詞delete
- 在ef core中使用postgres資料庫的全文檢索功能實戰資料庫
- Elasticsearch如何做到億級資料查詢毫秒級返回?Elasticsearch
- MySQL-檢索資料MySql
- Redis 實戰篇:巧用資料型別實現億級資料統計Redis資料型別
- Elasticsearch資料庫 | Elasticsearch-7.5.0應用搭建實戰Elasticsearch資料庫
- Elasticsearch加速檢索的Tips總結Elasticsearch
- Elasticsearch資料庫 | Elasticsearch-7.5.0應用基礎實戰Elasticsearch資料庫
- 用Elasticsearch做大規模資料的多欄位、多型別索引檢索Elasticsearch多型型別索引
- Redis 實戰篇:巧用Bitmap 實現億級海量資料統計Redis
- springboot ElasticSearch 簡單的全文檢索高亮Spring BootElasticsearch
- Elasticsearch學習系列三(搜尋案例實戰)Elasticsearch
- 在ef core中使用postgres資料庫的全文檢索功能實戰之中文支援資料庫
- AI Agent實戰:智慧檢索在Kingbase資料庫管理中的優勢應用AI資料庫
- 資料庫的檢索語句資料庫
- 資料檢索擴充套件包套件
- [轉]23個最有用的Elasticsearch檢索技巧Elasticsearch
- 騰訊雲大資料實戰案例大資料
- Elasticsearch 8.X:這個複雜的檢索需求如何實現?Elasticsearch
- 資訊檢索
- 學術檢索資料庫總結資料庫
- 109.全文檢索-ElasticSearch-入門-刪除資料&bulk批量操作匯入樣本測試資料Elasticsearch
- 從 Elasticsearch 到 Apache Doris,統一日誌檢索與報表分析,360 企業安全瀏覽器的資料架構升級實踐ElasticsearchApache瀏覽器架構
- 影象檢索:資訊檢索評價指標mAP指標
- NoSQL 資料庫案例實戰 -- MongoDB資料備份、恢復SQL資料庫MongoDB
- 一種基於概率檢索模型的大資料專利檢索方法與流程模型大資料
- 時序資料庫的秘密 —— 快速檢索資料庫
- 京東APP百億級商品與車關係資料檢索實踐 | 京東雲技術團隊APP
- DashVector + DashScope升級多模態檢索
- TS版LangChain實戰:基於文件的增強檢索(RAG)LangChain