五分鐘學會Elasticsearch查詢代理設計
Elasticsearch(ES)是一款基於Lucene的開源分散式搜尋引擎。由於其穩定、可靠、快速、安裝使用方便等優良特性,目前在業界已廣泛使用。ES用途主要分兩個方向:分散式實時檔案儲存 以及 分散式實時分析搜尋引擎。
一、為什麼需要查詢代理
遮蔽複雜的DSL
某二手交易平臺使用ES,主要用來支援商品、使用者等(以下統稱文件)的搜尋和分析。
ES為查詢功能提供了基於Json的完整Query DSL,功能非常強大,但同時也略顯複雜,學習成本不低。
以搜尋暱稱為化仁的使用者為例,DSL大致如下:
json {"from" : 0, "size" : 20, "query" : {"bool" : { "must" : { "multi_match" : {"query" : "化仁", "fields": [ "nickname", "nickname.pinyin" ], "type" :"best_fields", "operator" : "OR","minimum_should_match" : "1", "tie_breaker" : 1.0} }, "filter" : { "term" : { "del" : 0 } } } } }
如果讓每個業務方根據需要編寫DSL實現相應功能,工作量及維護複雜程度可想而知!
避免依賴限制擴散
· ES要求客戶端和服務端JDK版本儘量保持一致
· ES2.x要求JDK7以上
· ES5.x要求JDK8以上
· 大量Jar包依賴
· 其它可能出現的限制
使用查詢代理之後,各業務方無需引入上述依賴和限制
松耦合及管控
遮蔽底層引擎變動對線上業務的影響,例如底層引擎偶爾需要升級或重啟,此時,只需查詢代理層實現主從切換等機制,引擎的升級可做到對線上業務完全透明。
此外,查詢代理還可以遮蔽業務方錯誤的危險操作,防止叢集直接暴露給各業務方,從而降低不確定因素對系統的影響。
二、查詢代理層實現
業界做法
業界有將SQL作為代理層語言,實現一套SQL轉DSL的解析器,這種方式針對將ES作為DB使用的情況非常合適。但是,前面提到過,某二手交易平臺的使用場景是文件的搜尋,其中涉及到文件的複雜排序,SQL無法完整實現目標需求,而且文件屬性非常多的情況下,容易產生語句過於複雜的問題。
方案
種種因果,我們最終的實現方案如下:
請求語法
· 語句分為query域和param域,query域為篩選召回條件,param域為排序引數;
· 域為屬性欄位的組合;
· 域使用URL引數語法表述;
還以搜尋暱稱為化仁的使用者為例,請求如下:
query:from=1&size=10&nickname=化仁 param: null 請求會自動轉換成前面提到的DSL例子。可以看到,相比之下還是非常簡單的。
實現邏輯
補充說明:
· 根據解析方式,欄位大致分為:內建欄位 (起始位置、獲取數量、排序策略等) 和 配置欄位 (字串、數值、日期、經緯度等,會解析成對應ES支援的索引欄位型別)
· 配置欄位根據使用場景分為:匹配篩選型、排序引數型、欄位排序型、排序打分型、二次打分型等
· 各種型別的配置欄位配有配置解析器和請求處理器
· 處理過程中會做諸如欄位預設值、非法欄位過濾等處理
· 處理過程生成query的梗概資訊作為外部快取的key值,減輕ES叢集壓力
· 請求經過校驗、解析、處理後拼裝成ES的DSL,請求傳送到系統分配ES叢集
配置樣例:
yml entry.user:index: user type: user query_fields: - { face: id, type: Number, class: Long }- { face: nickname, type: StringMultiMatch, fieldName:"nickname,nickname.pinyin", _tie_breaker: 1 } order_strategys:default: boostMode: multiply scores: - type: NumberTermsFilter fieldName: label_idclass: Long values: "1141730738345" weight: 2
三、總結
本文從ES查詢介面的必要性出發,主要講述了某二手交易平臺ES查詢介面的語法設計和實現邏輯及簡要說明。其中有不合理之處,歡迎指正交流。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69976011/viewspace-2697781/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Elasticsearch查詢Elasticsearch
- Elasticsearch複合查詢——boosting查詢Elasticsearch
- ElasticSearch DSL 查詢Elasticsearch
- Elasticsearch 高亮查詢Elasticsearch
- elasticsearch之exists查詢Elasticsearch
- Elasticsearch(三):索引查詢Elasticsearch索引
- elasticsearch之多索引查詢Elasticsearch索引
- ElasticSearch的查詢(二)Elasticsearch
- Elasticsearch 分頁查詢Elasticsearch
- elasticsearch的模糊查詢Elasticsearch
- Elasticsearch 或並查詢Elasticsearch
- Elasticsearch中的Term查詢和全文查詢Elasticsearch
- Elasticsearch 第六篇:聚合統計查詢Elasticsearch
- elasticsearch查詢之大資料集分頁查詢Elasticsearch大資料
- elasticSearch head 查詢報錯Elasticsearch
- Elasticsearch系列---聚合查詢(一)Elasticsearch
- Elasticsearch系列---聚合查詢原理Elasticsearch
- Elasticsearch 查詢與過濾Elasticsearch
- Elasticsearch 並或查詢 JSONElasticsearchJSON
- Elasticsearch——filter過濾查詢ElasticsearchFilter
- Elasticsearch 複合查詢——多字串多欄位查詢Elasticsearch字串
- 通用查詢設計思想
- 10分鐘看懂動態代理設計模式設計模式
- 將聚合新增到 Elasticsearch 查詢Elasticsearch
- Elasticsearch Query DSL查詢入門Elasticsearch
- 快速學會慢查詢SQL排查SQL
- 5分鐘學會 Python 函數語言程式設計Python函數程式設計
- 實踐006-elasticsearch查詢之1-URI Search查詢Elasticsearch
- 簡版會員私信表設計及sql 私信列表查詢SQL
- elasticsearch之單請求多查詢Elasticsearch
- Elasticsearch複合查詢—constant score queryElasticsearch
- SpringBoot整合Elasticsearch遊標查詢(scroll)Spring BootElasticsearch
- ElasticSearch基礎及查詢語法Elasticsearch
- ElasticSearch類似Mysql的not in 和 in 查詢ElasticsearchMySql
- Elasticsearch 單字串多欄位查詢Elasticsearch字串
- Elasticsearch——定位不合法的查詢Elasticsearch
- 【ElasticSearch】給ElasticSearch資料庫配置慢查詢日誌Elasticsearch資料庫
- 設計模式之狀態模式(三分鐘學會一個設計模式)設計模式