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会导致:错误“重复键值违反唯一约束 - 已存在”。