Postgres 只从 jsonb 获取匹配的数组项

问题描述 投票:0回答:0

我有大约 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

postgresql full-text-search jsonb openai-whisper
© www.soinside.com 2019 - 2024. All rights reserved.