PostgreSQL 9.4 - jsonb数组的元素到ts_vector中

时间:2015-06-05 07:01:42

标签: json postgresql full-text-search tsvector nosql

我目前正在玩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"}]

我试图获得"跟踪" -array中所有曲目的每个标题进入我的tsvector。整个表格中的曲目数量可能不同。

我尝试过使用

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

每行给我一个标题。

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

1 个答案:

答案 0 :(得分: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;
当标签,用户或其他字段等字段“简单”时,

是可以推荐的,因为此字段没有“停用词”