2016-04-03 2 views
0

Получение профиля человека как JSON. Как я могу это сделать так, чтобы каждое значение этого документа JSON было доступно для поиска?
Не только документ json должен быть доступен для поиска. Он также должен быть запрошен как «найти всех людей, которые любят фильмы Тарантино». Я могу определить этот документ в реляционной модели с одним или несколькими отношениями. Но такой подход не позволит свободно искать текст со стороны клиента.
Есть ли лучший способ справиться с такими сценариями?
документ выглядеть следующим образом:Как сохранить поисковый и запрашиваемый json-документ в Postgres?

{ 
    "name":"FirstN LastN", 
    "photo":nicephoto.jpg, 
    "location":"Boston, MA", 
    "contacts":[ 
     { 
     "type":"phone", 
     "value":"701290012734" 
     }, 
     { 
     "type":"email", 
     "value":"[email protected]" 
     } 
    ], 
    "movies":[ 
     { 
     "name":"The Godfather", 
     "director":"Francis Ford Coppola", 
     "releaseYear":"1972", 
     "favQuote":"I'm gonna make him an offer he can't refuse. Okay?" 
     }, 
     { 
     "name":"Pulp Fiction", 
     "director":"Quentin Tarantino", 
     "releaseYear":"1994", 
     "favQuote":"Just because you are a character doesn't mean that you have character." 
     } 
    ], 
    "school":null, 

} 
+0

В подходе решения (не полный ответ, я боюсь): попробуйте полная реляционная схема плюс прямая индексация на json. – miw

+0

Что вы подразумеваете под «прямым индексированием на json»? –

+0

Сначала я подумал о простой полнотекстовой индексации, но это не поможет, потому что это только для естественного языка. Оказывается, postgres имеет встроенную поддержку JSON: http://www.postgresql.org/docs/9.5/static/datatype-json.html – miw

ответ

0

«найти всех людей, которые любят Тарантино кино» должно быть написано или преобразованы в SQL, как:

select persons->>'name' from jdoc,json_array_elements(jdoc.persons->'movies') movies where movies->>'director' ~ 'Tarantino'; 

другие критерии выбора могут быть смоделированы аналогичным образом.

Требуется Postgres 9.3 или более поздняя версия

http://sqlfiddle.com/#!15/652eb/10

на вопрос "как сэкономить":

create table jdoc (persons json); 
insert into jdoc values ('{ 
    "name":"FirstN LastN", 
    "photo":"nicephoto.jpg", 
    "location":"Boston, MA", 
    "contacts":[ 
     { 
     "type":"phone", 
     "value":"701290012734" 
     }, 
     { 
     "type":"email", 
     "value":"[email protected]" 
     } 
    ], 
    "movies":[ 
     { 
     "name":"The Godfather", 
     "director":"Francis Ford Coppola", 
     "releaseYear":"1972", 
     "favQuote":"Im gonna make him an offer he cant refuse. Okay?" 
     }, 
     { 
     "name":"Pulp Fiction", 
     "director":"Quentin Tarantino", 
     "releaseYear":"1994", 
     "favQuote":"Just because you are a character doesnt mean that you have character." 
     } 
    ], 
    "school":null 

}') 
;