2016-08-26 6 views
0

Я хотел бы реализовать полнотекстовый поиск в своем приложении, но я сталкиваюсь с некоторыми блокпостами, связанными с моими столбцами типа Array. Как реализовать триггер psql, чтобы при обновлении моей таблицы «объектов» каждый элемент (который является строками) столбца массива добавлен в столбец tsvector моей таблицы «поиска»?PostgreSQL полнотекстовый поиск с массивами

+1

Просто объедините (с промежутком между ними) все элементы в массиве и используйте это как свой документ. – univerio

+0

@univerio Правильно, я понимаю теоретически. Но как я мог бы выполнить это как SQL внутри моего триггера. Я знаю, как обновить столбец tsvector, когда столбцы, из которых он происходит, являются текстовыми. Но как я могу извлечь отдельные элементы массива (внутри SQL, испускаемого для создания триггера). Does 'to_tsvector()' просто работать над массивом (aka применить себя к каждому элементу массива)? Кажется маловероятным. –

+0

Как связана эта SQLAlchemy? Я имею в виду, что, хотя вы можете создавать обработчики событий SQLA, это, вероятно, лучше всего обслуживает триггеры SQL в Postgresql. –

ответ

0

В Postgres 9.6 array_to_tsvector was added.

Если вы имеете дело с одной и той же таблицей, вы можете написать что-то вроде этого.

CREATE FUNCTION tsv_trigger() RETURNS trigger AS $$ 
    begin 
    IF (TG_OP = 'INSERT') OR old.array_column <> new.array_column THEN 
    new.tsv := array_to_tsvector(new.array_column); 
    END IF; 
    return new; 
end 
$$ LANGUAGE plpgsql; 

CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE 
ON my_table FOR EACH ROW EXECUTE PROCEDURE tsv_trigger(); 

Если вы имеете дело с двумя таблицами, чем вам нужно написать обновить

CREATE FUNCTION cross_tables_tsv_trigger() RETURNS trigger AS $$ 
    begin 
    IF (TG_OP = 'INSERT') OR old.array_column <> new.array_column THEN 
    UPDATE search_table st 
    SET tsv = array_to_tsvector(new.array_column) 
    WHERE st.id = new.searchable_record_id 
    END IF; 
    # you can't return NULL because you'll break the chain 
    return new; 
end 
$$ LANGUAGE plpgsql; 

Обратите внимание, что она будет отличаться от умолчанию to_tsvector (array_to_string)() комбинации.

Он не содержит номера позиций и нормализации нижнего регистра, поэтому вы можете получить неожиданные результаты.

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