2015-06-05 3 views
1

Я сейчас играю с базой данных NOSQL в PostgreSQL. Он содержит 3 таблицы с полями id, data (jsonb) и tsv (tsvector).PostgreSQL 9.4 - Элементы массива jsonb для ts_vector в

У меня возникли трудности с созданием 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

возможно, это могло бы помочь: http://stackoverflow.com/questions/31699645/expand-multiple-rows-result-of-jsonb-array-elements-to-tsvector-inside-a-pl-pg – Tomqaz

ответ

0

может быть, может помочь вам, мой стол уже подпирать в 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 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; 

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

Смежные вопросы