2016-12-07 4 views
0
root: { 
    dir: { 
    subDir: { 
     subSubDir: { 
     ... 
     }, 
     ... 
    }, 
    subDir_2: { 
     ... 
    } 
    }, 
    dir_2: { 
    ... 
    }, 
    ... 
} 

Мне нужно выполнить поиск в dir и все эти потомок, или в subDir и всех эти потомок и т.д. ... я буду немного изменения данных довольно часто (в 10-100 раз в день), включая узлы переименования (dir до directory или что-то еще). Объем данных может составлять от 1 МБ до сотен МБ и может быть даже около 1 ГБ, количество узлов может быть бесконечным, но в среднем до 10 тыс. Я думаю. Глубина гнездования будет, вероятно, до 20.Какая база данных может выполнять полнотекстовый поиск внутри вложенных «каталогов», например файловых систем?

Архитектура может быть изменена, но идея представления «как каталогов» должна быть там.

Я думал об этой альтернативе:

{ 
    [guid]: {title, text, path etc}, 
    [guid]: {title, text, path etc}, 
    [guid]: {title, text, path etc}, 
    [guid]: {title, text, path etc}, 
    [guid]: {title, text, path etc}, 
    } 

Это может быть реализовано в базе данных SQL, а также, но в случае переименования узла я должен буду изменить path свойство в каждом узле (сырье), которые могли бы быть чрезвычайно дорогим.

+2

Я считаю, что postgres имеет встроенный JSON и полнотекстовый поиск – NinjaGaiden

+0

Да, также ES имеет его, у mongodb есть и т. Д. Однако я до сих пор не вижу, как реализовать полнотекстовый поиск с данными условиями, которые описаны выше. – stkvtflw

+0

Если вы храните это как нормализованные иерархические данные, это довольно просто сделать с рекурсивным SQL-запросом в реляционной базе данных. –

ответ

1

Работа с иерархическими данными легко в SQL при использовании modern SQL и рекурсивного общего выражения таблицы.

Показано, например, следующие настройки:

создать каталог таблицы ( идентификатор первичного ключа,, имя VARCHAR (100) NOT NULL, текстовое описание, parent_directory_id целочисленные ссылки каталог );

insert into directory (id, name, description, parent_directory_id) 
values 
(1, 'Root', 'The root of all evil', null), 
(2, 'Toplevel1', 'First directory', 1), 
(3, 'Toplevel2', 'Second directory', 1), 
(4, 'T1-Subdir1', 'T1 - Some data', 2), 
(5, 'T2-Subdir1', 'T2 - Irrelevant', 3), 
(6, 'T1-S1-S1', 'T1-S1 important docs', 4), 
(7, 'T1-S1-S2', 'T1-S1 trashcan', 4), 
(8, 'T1-S1-S3', 'T1-S1 important scans', 4); 

Вы можете выполнить поиск всех подкаталогов "Toplevel1", которые содержат строку "важный", используя этот запрос:

with recursive tree as (
    select id, name, description, parent_directory_id 
    from directory 
    where id = 2 -- The starting directory 
    union all 
    select cd.id, cd.name, cd.description, cd.parent_directory_id 
    from directory cd 
    join tree parent on cd.parent_directory_id = parent.id 
) 
select id,name,description 
from tree 
where description like '%important%'; 

Вышеприведенные возвращается:

id | name  | description   
---+----------+---------------------- 
6 | T1-S1-S1 | T1-S1 important docs 
8 | T1-S1-S3 | T1-S1 important scans 

where условие также может использовать возможности полнотекстового поиска базы данных.

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

  • Нет связанных вопросов^_^