create table test_ft(id int4,arry VARCHAR[],content1 jsonb,body text); insert into test_ft values(1,ARRAY [ 'x', 'y' ],'{ "guid": "9c36adc1-7fb5-4d5b-83b4-90356a46balabala", "name": "james", "is_active": true, "company": "Oracle", "address": "178 Howard Place, Gulf, Washington, 702", "registered": "2009-11-07T08:53:22 +08:00", "latitude": 19.793713, "longitude": 86.513373, "tags": [ "enim", "aliquip", "qui" ]}','postgresql支持两种json数据类型:json和jsonb,而两者唯一的区别在于效率,json是对输入的完整拷贝,使用时再去解析,所以它会保留输入的空格,重复键以及顺序等。而jsonb是解析输入后保存的二进制,它在解析时会删除不必要的空格和重复的键,顺序和输入可能也不相同。使用时不用再次解析。两者对重复键的处理都是保留最后一个键值对。效率的差别:json类型存储快,使用慢,jsonb类型存储稍慢,使用较快。');
查询JSON的某个key,如下:
select id,arry, content1->'name',substr(body,1,100) from test_ft t where t.arry @>'{"x"}' and t.content1 @>'{"name":"james"}'
查询JSON中某个数组类型属性的某个索引等于n的记录:
select id,arry, content1->'name',substr(body,1,100) from test_ft t where t.arry @>'{"x"}' and t.content1 @>'{"name":"james"}' and t.content1->'tags'->>1='aliquip'
如此以来,所有的key都可以查询了。
https://www.postgresql.org/docs/current/functions-json.html
index on jsonb
gin提供了对jsonb的原生支持。 什么时候需要在json字段上建立索引呢?全文检索的时候。如下所示:
每套房子在每个标签上都有一个属性,这些属性既可以单独每列存储,也可以存储在JSON中(mongodb和es的通常做法)。同时,搜索文本框作为全文检索字段,为了高精确率(因为很多术语、地点、企业名并非标准分词,见scws),一般需要维护可配置的词法库。
关于GIN的实现以及原理,可以参考postgresql查询优化之GIN(Generalized Inverted Index)索引与全文检索。怎么样在JSONB上创建GIN索引呢?