3

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

表结构:

CREATE TABLE 实体(id bigint NOT NULL,jtype character varying(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 的模拟是函数包含:

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

4

2 回答 2

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"

更多文档可以在这里找到。

于 2017-09-22T17:50:43.690 回答
0

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

于 2017-05-26T01:44:15.790 回答