搜索 jsonb GIN 索引时,将函数参数与 postgres 中的 like_regex 函数组合

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

我正在尝试对 属性 值进行不区分大小写的部分搜索(包含字符串)- 存储在 postgres 的 jsonb 字段中。

搜索正在 table 目的地的 title 列中查找一个值,该值具有如下元素数组:

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

我在 title 字段上创建了一个 GIN 索引和一个处理搜索的函数。

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$;

因此,如果正则表达式字符串是硬编码的(如上所示),该函数可以很好地工作,但搜索应基于传入的 query_string。函数中的注释行显示了尝试在查询中包含参数的尝试。 (这会导致未终止的字符串常量错误)

  1. 如何将硬编码的 milk 转换为参数 search_query?

  2. 是否有其他(更简单的)方法可以产生相同的最终结果?

您的问题是优先事项之一。 @? 和“||”被绑定并从左到右处理,因此您仅将 @? 应用于字符串的一部分而不是完整构建的字符串。然后你试图将东西连接到 @? 的布尔结果。您可以通过在括号内构造字符串来解决此问题。这样做的一个副作用是您必须将其显式转换为 jsonpath。

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

但我认为在变量中构建 jsonpath 比在查询本身中即时构建更清晰。有人可以在 jsonpath 字符串中注入一些东西来做一些令人讨厌的事情吗?我对 jsonpath 了解不够,无法排除这种情况。

(问题作者编辑的建议解决方案的代码部分包含缺少的双引号 - 请参阅评论)