2017-05-20 2 views
1

내 응용 프로그램의 테이블에 전체 텍스트 검색을 추가하기 위해 pg_search gem을 사용하고 있습니다.PostgreSQL에서 배열 유형으로 tsvector_update_trigger를 사용하는 방법은 무엇입니까?

변경 후 날짜로 TSV의 열을 유지하는 트리거를 만들려고 할 때 내 문제는,이 내 마이그레이션입니다 :이 경우

class AddStoreItemsIndex < ActiveRecord::Migration[5.0] 
    def up 
    add_column :store_items, :tsv, :tsvector 
    add_index :store_items, :tsv, using: "gin" 

    execute <<-SQL 
     CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE 
     ON store_items FOR EACH ROW EXECUTE PROCEDURE 
     tsvector_update_trigger(
     tsv, 'pg_catalog.english', title, full_description, recommended_age, related_intelligences 
    ); 
    SQL 
    end 

    ... 
end 

에서, related_intelligences 열이 그렇게 할 때, 배열이다 이 쿼리를 시도하면 다음과 같은 오류가 발생합니다.

ActiveRecord::StatementInvalid: 
     PG::DatatypeMismatch: ERROR: column "related_intelligences" is not of a character type 

이 tsv 벡터 열에 어떻게 배열을 포함 할 수 있습니까?

답변

3

이것은 내가 그것을 어떻게 있습니다 :

class AddStoreItemsIndex < ActiveRecord::Migration[5.0] 
    def up 
    add_column :store_items, :tsv, :tsvector 
    add_index :store_items, :tsv, using: 'gin' 

    execute <<-SQL 
     CREATE FUNCTION update_tsv() RETURNS trigger AS $$ 
     BEGIN 
     new.tsv := 
      to_tsvector('pg_catalog.english', coalesce(new.title,'')) || 
      to_tsvector('pg_catalog.english', coalesce(new.full_description,'')) || 
      to_tsvector('pg_catalog.english', coalesce(new.recommended_age,'')) || 
      to_tsvector('pg_catalog.english', coalesce(array_to_string(new.related_intelligences, ' '),'')); 
     return new; 
     END 
     $$ LANGUAGE plpgsql; 

     CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE 
     ON store_items FOR EACH ROW EXECUTE PROCEDURE update_tsv(); 
    SQL 
    end 

    def down 
    execute <<-SQL 
     DROP TRIGGER tsvectorupdate 
     ON store_items; 
     DROP FUNCTION update_tsv(); 
    SQL 

    remove_index :store_items, :tsv 
    remove_column :store_items, :tsv 
    end 
end 

tsvector_update_trigger는, 배열 열을 사용하는 대신 나는 postgresql search features page에서 코드 샘플을 기반으로 사용자 정의 함수를 만들 수 없습니다.

array_to_string을 사용하여 배열 요소를 텍스트로 변환했습니다.