2016-12-09 6 views
2

Я хочу быстро определить таблицу и столбец, которые содержат определенное ключевое слово в базе данных, хранящейся в Vertica. Vertica предоставляет функцию Text Index для полнотекстового поиска. Однако текстовый индекс может быть создан только для определенной схемы/отношения, а не для всей базы данных.Создайте инвертированный индекс глобально в базе данных в Vertica

Кто-нибудь знает, есть ли простой способ построить инвертированный индекс для всей базы данных в Vertica?

ответ

2

Вы не можете создать единый текстовый индекс, который пересекает несколько объектов. Каждый индекс является индексом только для одного столбца таблицы.

Возможно, вы можете сгенерировать созданные вами объекты, выбрав столбцы в таблице столбцов (хотя было бы необычно делать их честно). Это предполагает, что каждая таблица имеет PK с именем id. Я просто пытаюсь упростить.

select 'create text index ' || table_schema || '.t_' || table_name || '_' || column_name 
          || '_index on ' || table_schema || '.' || table_name 
          || '(id,' || column_name || ');' 
from columns 
where data_type ilike '%char'; 

Тогда вы можете создать представление, которое выбирает из всех текстовых индексов. Тем не менее, я не знаю, насколько это будет хорошо. Казалось бы, оптимизатор будет делать то, что ему нужно, но сказать сложно. Это может быть сгенерировано аналогично указанному выше запросу и будет выглядеть так, когда это будет сделано (обратите внимание, что если вы являетесь разделом, вам нужно добавить столбец для этого).

create view v_all_text_indexes 
as 
select 'schema1' schema_name, 'table1' table_name, 'column1' column_name, word, doc_id 
from schema1.t_table1_column1_index 
union all 
select 'schema1' schema_name, 'table1' table_name, 'column2' column_name, word, doc_id 
from schema1.t_table1_column2_index 
. 
. 
. 
select 'schema1' schema_name, 'tablen' table_name, 'columnn' column_name, word, doc_id 
from schema1.t_tablen_columnn_index 

Я понятия не имею, как хорошо это будет выполнять для вас. YMMV.

+0

Дайте мне знать, если я неправильно понял вопрос. – woot

+0

Вы хорошо поняли мою проблему. Благодарю. Фактически, я придумал аналогичное решение. Я дам вам знать, есть ли проблема с производительностью. –

+0

Просто обязательно сделайте 'union all', а не' union'. Вы, наверное, знали это, но просто подумали, что я назову это на всякий случай. – woot

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

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