2015-11-20 56 views
0

我想基於id(1-111.1x)和我的行的名稱字段構建tsvector,全部來自觸發器和tsvector_update_trigger(tsv,'pg_catalog.german' ,id,name)Postgres全文搜索自定義tsvector轉換

但是我的ID最終被截斷爲'-111.1'而不是'1-111.1x'。

有沒有一種方法可以自定義轉換,以便在正確轉換名稱字段的同時保留id字段(或應用某些操作,如lower())?

像這樣的東西(它不工作,因爲setweight期望tsvector)?

CREATE FUNCTION tsv_trigger() RETURNS trigger AS $$ 
begin 
    new.tsv := 
    setweight(new.id, 'A') || 
    setweight(to_tsvector('pg_catalog.german', coalesce(new.name,'')), 'D'); 
    return new; 
end 
$$ LANGUAGE plpgsql; 

CREATE TRIGGER TS_tsv 
    BEFORE INSERT OR UPDATE ON "model" 
FOR EACH ROW EXECUTE PROCEDURE 
    tsv_trigger(); 

謝謝!

回答

0

我最終創建了另一個字段'_id',這是'id'的標準化再聲明(所以不是'1-111' - >'1111')。搜索輸入必須被刪除' - ','。',用空字符串替換它們。

當然,我們需要小心,因爲有時剝去某些字符可能不合適;我創建了一個正則表達式模式,只在匹配的id中刪除它們,但不在文本中。

就我而言,這似乎是一個可行的解決方案,儘管它僅僅是一種解決方法。我很樂意提出一個真正的解決方案。