溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

五分鐘學(xué)會Elasticsearch查詢代理設(shè)計

發(fā)布時間:2020-08-07 22:32:23 來源:ITPUB博客 閱讀:178 作者:古月木易01 欄目:軟件技術(shù)

Elasticsearch(ES)是一款基于Lucene的開源分布式搜索引擎。由于其穩(wěn)定、可靠、快速、安裝使用方便等優(yōu)良特性,目前在業(yè)界已廣泛使用。ES用途主要分兩個方向:分布式實時文件存儲 以及 分布式實時分析搜索引擎。

一、為什么需要查詢代理

屏蔽復(fù)雜的DSL

某二手交易平臺使用ES,主要用來支持商品、用戶等(以下統(tǒng)稱文檔)的搜索和分析。

ES為查詢功能提供了基于Json的完整Query DSL,功能非常強大,但同時也略顯復(fù)雜,學(xué)習成本不低。

以搜索昵稱為化仁的用戶為例,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 } } } } }

如果讓每個業(yè)務(wù)方根據(jù)需要編寫DSL實現(xiàn)相應(yīng)功能,工作量及維護復(fù)雜程度可想而知!

避免依賴限制擴散

·        ES要求客戶端和服務(wù)端JDK版本盡量保持一致

·        ES2.x要求JDK7以上

·        ES5.x要求JDK8以上

·        大量Jar包依賴

·        其它可能出現(xiàn)的限制

使用查詢代理之后,各業(yè)務(wù)方無需引入上述依賴和限制

松耦合及管控

屏蔽底層引擎變動對線上業(yè)務(wù)的影響,例如底層引擎偶爾需要升級或重啟,此時,只需查詢代理層實現(xiàn)主從切換等機制,引擎的升級可做到對線上業(yè)務(wù)完全透明。

此外,查詢代理還可以屏蔽業(yè)務(wù)方錯誤的危險操作,防止集群直接暴露給各業(yè)務(wù)方,從而降低不確定因素對系統(tǒng)的影響。

二、查詢代理層實現(xiàn)

業(yè)界做法

業(yè)界有將SQL作為代理層語言,實現(xiàn)一套SQL轉(zhuǎn)DSL的解析器,這種方式針對將ES作為DB使用的情況非常合適。但是,前面提到過,某二手交易平臺的使用場景是文檔的搜索,其中涉及到文檔的復(fù)雜排序,SQL無法完整實現(xiàn)目標需求,而且文檔屬性非常多的情況下,容易產(chǎn)生語句過于復(fù)雜的問題。

方案

種種因果,我們最終的實現(xiàn)方案如下:

請求語法

·        語句分為query域和param域,query域為篩選召回條件,param域為排序參數(shù);

·        域為屬性字段的組合;

·        域使用URL參數(shù)語法表述;

還以搜索昵稱為化仁的用戶為例,請求如下:

query:from=1&size=10&nickname=化仁 param: null 請求會自動轉(zhuǎn)換成前面提到的DSL例子??梢钥吹?,相比之下還是非常簡單的。

實現(xiàn)邏輯

五分鐘學(xué)會Elasticsearch查詢代理設(shè)計

補充說明:

·        根據(jù)解析方式,字段大致分為:內(nèi)置字段 (起始位置、獲取數(shù)量、排序策略等) 和 配置字段 (字符串、數(shù)值、日期、經(jīng)緯度等,會解析成對應(yīng)ES支持的索引字段類型)

·        配置字段根據(jù)使用場景分為:匹配篩選型、排序參數(shù)型、字段排序型、排序打分型、二次打分型等

·        各種類型的配置字段配有配置解析器和請求處理器

·        處理過程中會做諸如字段默認值、非法字段過濾等處理

·        處理過程生成query的梗概信息作為外部緩存的key值,減輕ES集群壓力

·        請求經(jīng)過校驗、解析、處理后拼裝成ES的DSL,請求發(fā)送到系統(tǒng)分配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

三、總結(jié)

本文從ES查詢接口的必要性出發(fā),主要講述了某二手交易平臺ES查詢接口的語法設(shè)計和實現(xiàn)邏輯及簡要說明。其中有不合理之處,歡迎指正交流。

更多免費技術(shù)資料及視頻

五分鐘學(xué)會Elasticsearch查詢代理設(shè)計

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI