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

Posted

技术标签:

【中文标题】PostgreSQL JSON 快速搜索(从任意键中搜索值)【英文标题】:PostgreSQL JSON quick search (search value in from any key) 【发布时间】:2017-08-31 09:48:19 【问题描述】:

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

表结构:

创建表实体 ( id bigint 非空, jtype 字符变化(64)NOT NULL, jdata jsonb, CONSTRAINT entity_pk PRIMARY KEY (id) )

想法是我们将不同类型的json存储在一张表中,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

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

从 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找到。

【讨论】:

谢谢,我们刚刚迁移到 Posgresql 10,我们将使用此功能

以上是关于PostgreSQL JSON 快速搜索(从任意键中搜索值)的主要内容,如果未能解决你的问题,请参考以下文章

使用 jooq/postgresql 从 json 中提取键/值对 - java

将数据从Json文件加载到Postgresql会导致:错误“重复键值违反唯一约束 - 已存在”。

PostgreSQL的NoSQL特性

聚合 json 数组中特定键的值 - PostgreSQL

加载 back.json 文件 PostgreSQL 时出现重复键问题

从匹配特定键的 JSON 中删除所有值