【发布时间】:2018-01-22 16:06:21
【问题描述】:
我将相当复杂的 JSONB 存储在一个 jsonb 列中。
数据库表如下:
CREATE TABLE sites (
id text NOT NULL,
doc jsonb,
PRIMARY KEY (id)
)
我们存储在doc 列中的数据是一个复杂的嵌套JSONB 数据:
{
"_id": "123",
"type": "Site",
"identification": "Custom ID",
"title": "SITE 1",
"address": "UK, London, Mr Tom's street, 2",
"buildings": [
{
"uuid": "12312",
"identification": "Custom ID",
"name": "BUILDING 1",
"deposits": [
{
"uuid": "12312",
"identification": "Custom ID",
"audits": [
{
"uuid": "12312",
"sample_id": "SAMPLE ID"
}
]
}
]
}
]
}
所以我的JSONB 的结构如下:
SITE
-> ARRAY OF BUILDINGS
-> ARRAY OF DEPOSITS
-> ARRAY OF AUDITS
我们需要通过每种类型的条目中的一些值来实现全文搜索:
SITE (identification, title, address)
BUILDING (identification, name)
DEPOSIT (identification)
AUDIT (sample_id)
SQL 查询应仅在这些字段值中运行全文搜索。
我猜需要使用GIN 索引和tsvector 之类的东西,但没有足够的Postgresql 背景。
那么,我的问题是可以索引然后查询这种嵌套的JSONB 结构吗?
【问题讨论】:
-
第一个镜头是“非规范化”存储:为了简洁而牺牲一些存储空间。在单独的字段中提取所需的数据:站点、建筑物、存款、审计,包含所需字段的纯字符串连接,即
building.identification ||';'||building.title||';'||building.address等(这可以使用 postgres 的函数作为默认值或基于触发器来完成,如果您的数据已修改)。然后在这些字段上创建 GIN 索引 -> 然后在这些字段上构建相应的全文查询 -
谢谢@IlyaDyoshin。我喜欢你的想法 - 将尝试尝试它。
-
或者你可以等到 10.0 版本发布 - json/jsonb FTS 将成为一等公民postgresql.org/docs/10/static/release-10.html
-
哇,感谢@IlyaDyoshin 提供的信息:啤酒:
-
伙计们,请参阅下面的@Nick 方法。我测试了它 - 效果很好 + 1
标签: postgresql full-text-search jsonb postgresql-9.5 postgresql-9.6