我有大约 800 个来自 openai/whisper 的 json 格式的 vods 转录本,我想将它存储在 postgres 中,索引转录本并使其尽可能快地可以使用 tsvector 进行搜索。这是存储数百小时成绩单的更大档案的一部分。
这是我从 whisper 获得的示例 json 文件(截断的片段,只有
text
对于这个问题很重要):
{
"segments": [
{
"id": 1,
"start": 90.0,
"end": 112.52,
"text": "Ich habe heute endlich mal alles von dem iPhone, was ich von der Firma hatte umgestellt auf"
},
{
"id": 2,
"start": 112.52,
"end": 117.24,
"text": "mein neues iPhone, weil das andere muss ich abgeben \u00fcbermorgen."
},
{
"id": 3,
"start": 117.24,
"end": 128.88,
"text": "Es n\u00e4hert sich ja dem Ende alles. Mir ist wieder mal aufgefallen, wie abartig es ist,"
},
{
"id": 4,
"start": 128.88,
"end": 136.16,
"text": "Daten vom iPhone runterzubekommen. Also was ja in der Regel recht gut geht,"
},
{
"id": 5,
"start": 136.16,
"end": 145.76,
"text": "ist wenn man das gleich beim Setup macht, die einen Sachen vom alten aufs neue iPhone zu kopieren."
}
]
}
我有一个名为
vods
的表,其中包含多列,但最重要的两列是:
Transcript
- jsonb - 保存原始 json 数据TranscriptVector
- tsvector - 用杜松子酒索引现在,我想使用我的 gin 索引在 jsonb 中搜索
text
值,并且只取回我的对象中匹配的数组项。如果只返回匹配的段,我的 sql 查询会是什么样子?
到目前为止,我正在使用以下内容:
select * from vods where vods.transcript_vector @@ websearch_to_tsquery('german', 'iPhone')
但它给了我整个 jsonb。我只想要匹配的片段。我试过使用
jsonb_array_elements(vods.transcript)
但无法想出一个可行的解决方案。
我在这里创建了一个 dbfiddle:https://dbfiddle.uk/F3XmSn-H
编辑:我使用 postgres 15