2

我目前正在使用 PostgreSQL 中的 NOSQL 数据库。它包含 3 个具有 id、data (jsonb) 和 tsv (tsvector) 字段的表。

我在从数据字段创建 tsvector 时遇到了一些困难。使用 jsonb 对象我没有任何问题:

对于这样的事情:

    {"genres":{"genre": "Electronic"}, 
    "labels": {"label": {"@name": "Turbo", "@catno": "HEMI-06PU"}}, 
    "styles": {"style": ["House", "Techno", "Tech House"]}}

我用了:

UPDATE rel SET tsv = setweight(to_tsvector(coalesce(data->>'genre','')),'B') || 
    setweight(to_tsvector(coalesce(data->'labels'->'label'->>'@name','')),'C') || 
    setweight(to_tsvector(coalesce(data->'styles'->>'style','')),'D');

但现在我也有像这样的嵌套结构:

    "tracklist": {"track": [
     {"title": "Untitled", 
      "artists": {"artist": {"id": "676", "anv": null, "join": ",", "name": "Peter Benisch", "role": null, "tracks": null}}, 
      "duration": "5:42", 
      "position": "1"}, 
     {"title": "Good Morning", 
      "artists": {"artist": {"id": "166", "anv": null, "join": ",", "name": "Fred Everything", "role": null, "tracks": null}}, 
      "duration": "4:10", 
      "position": "2"}]

我正在尝试将“track”-array 中所有曲目的每个标题放入我的 tsvector 中。整个表格中的曲目数量可能不同。

我试过使用

    (jsonb_array_elements(data->'tracklist'->'track'))->>'title' 

这给了我每行一个标题。

任何人都可以帮助将这些行作为 to_tsvector() 函数的输入吗?或者对此有不同的解决方案?

4

1 回答 1

0

也许可以帮助你,我的桌子有道具作为 jsonb 数据

{"title":"title 1","description":"description bla","tags":["tag1","tag2"]} 

当我得到标签时:

SELECT prop->'tags' from test;

这会返回一个像这样的对象

{"tags":["tag1","tag2"]}

在这种情况下,我使用 'tags'->'tags' 并获取元素数组

SELECT prop->'tags'->'tags' from test;

这个返回数组:

["tag1","tags2"]

使用此函数 jsonb_array_elements_text() 获取数组上的元素并使用 WITH 子句封装结果并返回类似行

WITH r AS
(Select jsonb_array_elements_text(prop->'tags'->'tags') AS tags
FROM test)
SELECT to_tsvector('simple',string_agg(tags,' ')) AS ts_vector FROM r;

当标签、用户或其他字段等字段“简单”时推荐使用,因为这些字段没有“停用词”

于 2017-08-18T12:09:07.393 回答