使用 JavaScript 指令碼來進行複雜的查詢改寫

2023-07-20 10:01:03 字數 3812 閱讀 4880

有這麼乙個需求:

閘道器裡怎樣對跨集群搜尋進行支援的呢?我想實現: 輸入的搜尋請求是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軟體並匯入需要對比的兩個 可以通過選擇 ...

如何使用小號來保護個人隱私或進行其他用途呢?

網購搜券省錢用 百傭 網購達人們都在用,某寶某東,拼夕夕,某音某手等都能省。無論是年輕人還是老年人,在閒暇之餘都會開啟抖音來欣賞各種有趣 搞笑 有創意的短 有時候我們可能不想使用自己的主賬號登入抖音,而是想要使用乙個小號來保護個人隱私或進行其他用途。一 抖音怎樣用小號登陸?你需要 並安裝抖音應用程式...