PostgreSQL JSON快速搜索(从任意键搜索值)

时间:2017-04-05 16:39:44

标签: json postgresql jsonb postgresql-9.6

我尝试在PostgreSQL JSONB列中找到快速搜索功能的解决方案。要求是我们可以在任何JSON密钥中搜索值。

表格结构:

  

CREATE TABLE实体(        id bigint NOT NULL,        jtype字符变化(64)NOT NULL,        jdata jsonb,        CONSTRAINT entity_pk PRIMARY KEY(id))

想法是我们在一个表中存储不同类型的jsons,jtype定义json实体类型,jdata - json数据,例如:

   jtype='person',jvalue = '{"personName":"John", "personSurname":"Smith", "company":"ABS Software", "position":"Programmer"}'
   jtype='company', jvalue='{"name":"ABS Software", "address":"Somewhere in Alaska"}'

目标是快速搜索用户可以输入' ABS'并找到两个记录 - 公司和在公司工作的人。

Oracle DB的模拟功能是CONTAINS:

  

SELECT jtype,jvalue FROM entity WHERE CONTAINS(jvalue,' ABS')> 0;

GIN索引仅允许搜索键/值对

  

GIN索引可用于有效搜索键或键/值   在大量jsonb文档(基准)中出现的对。二   GIN"运算符类"提供,提供不同的性能   和灵活性权衡。

https://www.postgresql.org/docs/current/static/datatype-json.html#JSON-INDEXING

2 个答案:

答案 0 :(得分:0)

https://github.com/postgrespro/jsquery可能对您正在寻找的内容有用,尽管我之前没有使用它。

答案 1 :(得分:0)

从Postgresql 10开始,您可以在JSON / JSONB列上创建索引,然后在该列的值内进行全文搜索:

libdata=# SELECT bookdata -> 'title'
         FROM bookdata
         WHERE to_tsvector('english',bookdata) @@ to_tsquery('duke');            
------------------------------------------
"The Tattooed Duke"
"She Tempts the Duke"
"The Duke Is Mine"
"What I Did For a Duke"

可以找到更多文档here