我有一个带有jsonb列的表,其中存储了可变数据。我想搜索此列并查找片段(前导或尾随空格)。我想我知道如何使用文本列执行此操作,但无法解决如何使用jsonb
列实现此目的。
我希望实现两种方案:
data->>company
)jsonb
列安装扩展程序pg_trgm:
CREATE extension if not exists pg_trgm;
创建表格&指数:
CREATE TABLE tbl (
col_text text,
col_json jsonb
);
CREATE INDEX table_col_trgm_idx ON tbl USING gin (col_text gin_trgm_ops);
示例查询:
SELECT * FROM tbl WHERE col_text LIKE '%foo%'; -- leading wildcard
SELECT * FROM tbl WHERE col_text ILIKE '%foo%'; -- works case insensitive as well
尝试使用jsonb列失败。如果我尝试索引整列
CREATE INDEX table_col_trgm_idx ON tbl USING gin (col_json gin_trgm_ops);
我收到错误
ERROR (datatype_mismatch): operator class "gin_trgm_ops" does not accept data type jsonb
(这是有道理的)。如果我尝试仅索引jsonb列的一个键,我也会收到错误:
CREATE INDEX table_col_trgm_idx ON tbl USING gin (col_json->>company gin_trgm_ops);
错误:
ERROR (syntax_error): syntax error at or near "->>"
我使用this answer @erwin-brandstetter作为参考。任何帮助都非常感谢(不,我现在不想实现Elasticsearch :))。
编辑:像这样创建索引实际上有效:
CREATE INDEX table_col_trgm_idx ON tbl USING gin ((col_json->>'company') gin_trgm_ops);
查询它也不会导致错误:
SELECT * FROM tbl WHERE col_json->>'company' LIKE '%foo%';
但结果总是为空。