PostgreSQL 9.4 - Элементы массива jsonb для ts_vector в

В настоящее время я играю с базой данных NOSQL в PostgreSQL. Он содержит 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"}]

Я пытаюсь получить каждое название всех треков в массиве «треков» в свой tsvector. Количество дорожек может различаться по всей таблице.

я пытался использовать

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

который дал мне один заголовок в строке.

Может ли кто-нибудь помочь получить эти строки в качестве входных данных для функции to_tsvector()? Или есть другое решение для этого?


person user3599245    schedule 05.06.2015    source источник
comment
возможно, это поможет: stackoverflow.com/questions/31699645/   -  person Tomqaz    schedule 14.01.2016


Ответы (1)


может быть, может помочь вам, моя таблица поддерживает данные jsonb

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

когда я получаю теги:

SELECT prop->'tags' from test;

это возвращает такой объект

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

в этом случае я использую «теги» -> «теги» и получаю массив элементов

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;

рекомендуется, когда такие поля, как теги, пользователи или другие поля, являются «простыми», потому что в этих полях нет «стоп-слов»

person nikoz84    schedule 18.08.2017