我尝试在 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