我目前正在使用 PostgreSQL 中的 NOSQL 数据库。它包含 3 个表,其中包含 id、数据 (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"}]
我试图将“轨道”数组中所有轨道的每个标题都放入我的 tsvector 中。整个表格中的轨道数量可能不同。
我试过用
(jsonb_array_elements(data->'tracklist'->'track'))->>'title'
每行给了我一个标题。
任何人都可以帮助将这些行作为 to_tsvector() 函数的输入吗?或者对此有不同的解决方案吗?
最佳答案
也许可以帮到你,我的表有 prop 作为 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;
当标签、用户或其他字段“简单”时推荐使用,因为这些字段没有“停用词”
关于json - PostgreSQL 9.4 - jsonb 数组的元素到 ts_vector 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30660298/