簡體   English   中英

搜索jsonb GIN索引時在postgres中將function參數與like_regex function結合起來

[英]Combining function parameter with a like_regex function in postgres when searching jsonb GIN index

我正在嘗試對屬性值進行不區分大小寫的部分搜索(包含字符串) - 存儲在 postgres 的 jsonb 字段中。

搜索正在查找表目標的標題列中的值,該值具有如下元素數組:

[{"key": "EN", "text":"london and milk"},{"key": "FR", "text":"Edinburgh with milk and honey"}]

我在標題字段上創建了一個 GIN 索引和一個 function 來處理搜索。

CREATE OR REPLACE FUNCTION search(query_string character varying)   
    RETURNS SETOF destination 
    LANGUAGE 'plpgsql'  
AS $BODY$
begin
return query select *
from destination
--where title @? '$.* ? (@ like_regex ' || query_string || ' flag "i")';
where title @? '$.* ? (@ like_regex ".*milk.*" flag "i")';
end;
$BODY$;

因此,如果正則表達式字符串是硬編碼的(如上所示),function 工作得很好,但搜索應該基於傳入的query_string function 中的注釋行顯示了嘗試在查詢中包含參數的嘗試。 (這將導致未終止的字符串常量錯誤)

  1. 如何將硬編碼的牛奶交換為參數search_query

  2. 還有其他(更簡單)的方法可以產生相同的最終結果嗎?

你的問題是優先級之一。 @? 和'||' 被捆綁並從左到右處理,所以你正在應用@? 只是字符串的一個片段而不是完全構建的字符串。 然后你試圖將事情連接到@? . 您可以通過在括號內構造字符串來解決此問題。 這樣做的一個副作用是您必須將其顯式轉換為 jsonpath。

where title @? ( '$.* ? (@ like_regex "' || query_string || '" flag "i")' )::jsonpath;

但我認為在變量中構造 jsonpath 會更干凈,而不是在查詢本身中動態構建。 有人可以在 jsonpath 字符串中注入一些可以做一些討厭的事情嗎? 我對 jsonpath 的了解還不夠,無法排除這種情況。

(由問題作者編輯的建議解決方案的代碼部分包含缺少的雙引號 - 見評論)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM