PostgreSQL:用jsonb列进行pg_trgm全文搜索?

时间:2016-11-03 15:24:34

标签: postgresql

我有一个带有jsonb列的表,其中存储了可变数据。我想搜索此列并查找片段(前导或尾随空格)。我想我知道如何使用文本列执行此操作,但无法解决如何使用jsonb列实现此目的。

我希望实现两种方案:

  1. 仅搜索jsonb列中的特定键(例如 data->>company
  2. 搜索整个jsonb
  3. 对于文本列,我使用gin生成pg_trgm索引。

    安装扩展程序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%'; 
    

    但结果总是为空

0 个答案:

没有答案