我有一个person
必须插入任意数据的表。由于我使用的是 Postgres 9.4,jsonb
因此似乎是正确的选择。
示例数据:
id: 1, name: "Joe Doe", preferences: { color: "red" , toy: "car"}
id: 2, name: "Jane Doe", preferences: { color: "blue", food: "hamburguer" }
问题是我需要通过变量值来查询它,例如:
所有偏好有“汉堡”的人,部分查询肯定也是可以的,所以搜索“汉堡”一定会给我带来记录2。
使用json函数,我可以搜索值,只要我知道key,对吧?还是有一种快速搜索值的方法?
我想做的是创建一个 tsvector 列并转储 json 以使用全文搜索来执行部分查询。
对于Postgres 12或更高版本,请考虑 SQL/JSON 路径语言。看:
原始答案(对于旧版本)
我建议
MATERIALIZED VIEW
使用未嵌套的值和三元索引作为搜索工具。hstore
如果您不需要嵌套值,
hstore
则可能对您更好。使用该函数svals(hstore)
取消嵌套hstore
值。您需要为
hstore
每个数据库安装一次附加模块:桌子
物化视图
CROSS JOIN LATERAL
这是对 set-returning 函数的隐含svals()
。三元索引
您需要为
pg_trgm
每个数据库安装一次附加模块:然后:
细节:
询问
这对于选择性搜索词来说很快。
jsonb
如果您有嵌套的值或
numeric
或boolean
值,jsonb
可能会更有效。您可以使用以下方法执行与上述相同的操作jsonb_each_text(jsonb)
:相同的索引,相同的查询。
db<>在这里摆弄