我目前正在玩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()函数的输入吗?或者有不同的解决方案吗?
答案 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;
当标签,用户或其他字段等字段“简单”时,是可以推荐的,因为此字段没有“停用词”