有這麼乙個需求:
閘道器裡怎樣對跨集群搜尋進行支援的呢?我想實現: 輸入的搜尋請求是極限閘道器自帶的過濾器lp:9200/index1/_search
這個索引在 3 個集群上,需要跨集群檢索,也就是閘道器能否改成lp:9200/cluster01:index1,cluster02,index1,cluster03:index1/_search
呢? 索引有一百多個,名稱不一定是 app, 還可能多個索引一起的。
content_regex_replace
雖然可以實現字元正則替換,但是這個需求是帶引數的變數替換,稍微複雜一點,沒有辦法直接用這個正則替換實現,有什麼其他辦法實現麼?
當然有的,上面的這個需求,理論上我們只需要將其中的索引index1
匹配之後,替換為cluster01:index1,cluster02,index1,cluster03:index1
就行了。
答案就是使用自定義指令碼來做,再複雜的業務邏輯都不是問題,都能通過自定義指令碼來實現,一行指令碼不行,那就兩行。
使用極限閘道器提供的 j**ascript 過濾器可以很靈活的實現這個功能,具體繼續看。
首先建立乙個指令碼檔案,放在閘道器資料目錄的scripts
子目錄下面,如下:
➜ gateway ✗ tree datadata└──gateway └─nodes └─c9bpg0ai4h931o4ngs3g ├─kvdb ├─queue ├─scripts │ index_path_rewrite.js └─stats這個指令碼的內容如下:
function process(context) var resultnames = var clusternames = cluster01", cluster02"] if(indexnames.length > 0) }和普通的 j**ascript 一樣,定義乙個特定的函式
process
來處理請求裡面的上下文資訊,_ctx.request.path
是閘道器內建上下文的乙個變數,用來獲取請求的路徑,通過context.get("_ctx.request.path")
在指令碼裡面進行訪問。
中間我們使用了 j**ascript 的正則匹配和字元處理,做了一些字元拼接,得到新的路徑newpath
變數,最後使用context.put("_ctx.request.path",newpath)
更新閘道器請求的路徑資訊,從而實現查詢條件裡面的引數替換。
有關閘道器內建上下文的變數列表,請訪問 request context
接下來,建立乙個閘道器配置,並使用j**ascript
過濾器呼叫該指令碼,如下:
entry: -name: my_es_entry enabled: true router: my_router max_concurrency: 10000 network: binding: 0.0.0.0:8000flow: -name: default_flow filter: -dump: context: -ctx.request.path - j**ascript: file: index_path_rewrite.js - dump: context: -ctx.request.path - elasticsearch: elasticsearch: devrouter: -name: my_router default_flow: default_flowelasticsearch:- name: dev enabled: true schema: http hosts: -192.168.3.188:9206上面的例子中,使用了乙個
j**ascript
過濾器,並且指定了載入的指令碼檔案為index_path_rewrite.js
,並使用了兩個dump
過濾器來輸出指令碼執行前後的路徑資訊,最後再使用乙個elasticsearch
過濾器來**請求給 elasticsearch 進行查詢。
我們啟動閘道器測試一下,如下:
➜ gateway ✗ bin/gateway __gateway] a light-weight, powerful and high-performance elasticsearch gateway.[gateway] 1.0.0_snapshot, 2022-04-18 07:11:09, 2023-12-31 10:10:10, 8062c4bc6e57a3fefcce71c0628d2d4141e46953[04-19 11:41:29] [inf] [app.go:174] initializing gateway.[04-19 11:41:29] [inf] [app.go:175] using config: /users/medcl/go/src/infini.sh/gateway/gateway.yml.[04-19 11:41:29] [inf] [instance.go:72] workspace: /users/medcl/go/src/infini.sh/gateway/data/gateway/nodes/c9bpg0ai4h931o4ngs3g[04-19 11:41:29] [inf] [app.go:283] gateway is up and running now.[04-19 11:41:30] [inf] [api.go:262] api listen at: 11:41:30] [inf] [entry.go:312] entry [my_es_entry] listen at: 11:41:30] [inf] [module.go:116] all modules are started[04-19 11:41:30] [inf] [actions.go:349] elasticsearch [dev] is **ailable執行下面的查詢來驗證查詢結果,如下:
curl localhost:8000/abc,efg/_search可以看到閘道器通過
dump
過濾器輸出的除錯資訊:
---dumping context --ctx.request.path : abc,efg/_search---dumping context --ctx.request.path : cluster01:abc,cluster02:abc,cluster01:efg,cluster02:efg/_search查詢條件按照我們的需求進行了改寫,nice!
好吧,我們剛剛只是修改了查詢的索引而已,那麼查詢請求的 dsl 呢?行不行?
那自然是可以的嘛,瞧下面的例子:
function process(context) context.put("_ctx.request.body",json.stringify(jsonobj));先是獲取查詢請求,然後轉換成 json 物件,之後任意修改查詢物件就行了,儲存回去,搞掂。
測試一下:
curl -xpost localhost:8000/abc,efg/_search -d'}'輸出:
---dumping context --ctx.request.path : abc,efg/_search_ctx.request.body : 04-19 18:14:24] [inf] [reverseproxy.go:255] elasticsearch [dev] hosts: [192.168.3.188:9206]--dumping context --ctx.request.path : abc,efg/_search_ctx.request.body : size":123,"aggs":}是不是感覺解鎖了新的世界?
通過使用 j**ascript 指令碼過濾器,我們可以非常靈活的進行複雜邏輯的操作來滿足我們的業務需求。
使用MassCMS進行企業內容資產管理
masscms是乙個面向企業的數位化內容管理系統,可以幫助企業建立 管理和發布以客戶體驗為中心的內容,並且借助內建的工作流程,為數字內容的協作式管理和建立提供自動化流程,從而提高運營效率和客戶滿意度並增加業務收益。masscms是一種無頭cms,無頭 cms 是一種專注於提供內容管理 api 的 c...
使用Excel表格進行資料對比與重複項查詢的方法
在處理大量資料時,經常需要對多個excel 進行對比,並找出其中的重複資料。這對於資料分析和資料清洗非常重要。本文將介紹如何使用excel 進行資料對比,找出重複資料,並提供一些實用的方法和技巧。一 資料匯入和準備 1.1 匯入excel 首先,開啟excel軟體並匯入需要對比的兩個 可以通過選擇 ...
如何使用小號來保護個人隱私或進行其他用途呢?
網購搜券省錢用 百傭 網購達人們都在用,某寶某東,拼夕夕,某音某手等都能省。無論是年輕人還是老年人,在閒暇之餘都會開啟抖音來欣賞各種有趣 搞笑 有創意的短 有時候我們可能不想使用自己的主賬號登入抖音,而是想要使用乙個小號來保護個人隱私或進行其他用途。一 抖音怎樣用小號登陸?你需要 並安裝抖音應用程式...