Im trying to change a trigger that was implemented for fulltext search. But I dont understand how this
procedure works.
Im trying to change my fulltext-trigger that looks like this:
CREATE TRIGGER trigger_memo
BEFORE INSERT OR UPDATE
ON memo
FOR EACH ROW
EXECUTE PROCEDURE tsearch2(‘fulltextsearch_memo’, ‘memo_text’);
memo_text is a text-column.
fulltextsearch_memo is the vector column needed for the fulltextsearch.
Instead of a text-column I switch to bytea, where I save html-code from a web-editor.
Now I used the following command to get just the relevant text without the html-tags etc:
strip_tags(replace(encode(memo_html, ‘escape’),’\000’,’’));
strip_tags is a function for stripping the html tags.
I thought I would be able to just change it like this:
…
FOR EACH ROW
EXECUTE PROCEDURE tsearch2(‘fulltextsearch_memo’, strip_tags(replace(encode(memo_html, ‘escape’),’\000’,’’)));
But it doesnt work.
Now I dont understand if i have to pass two columns to tsearch2 function or how I can change this, to pass the converted content from my bytea-column ?
Also meine Frage ist eigentlich, ob ich statt:
EXECUTE PROCEDURE tsearch2(‘fulltextsearch_memo’, ‘memo_text’);
auch irgendwie Text mitgeben kann, statt dem ‘memo_text’ Parameter (das ist ja eine Spalte auf meiner memo Tabelle gewesen).
Z.B. :
EXECUTE PROCEDURE tsearch2(‘fulltextsearch_memo’, ‘Das ist Text der bitte in die Volltextspalte übernommen werden soll’);
Das ganze sah bei mir in etwa so aus:
EXECUTE PROCEDURE tsearch2(‘fulltextsearch_memo’, “strip_tags(replace(encode(memo_html, ‘escape’),‘\000’,‘’))”);
Und dann sagt er als Fehler, die Spalte “strip_tags(replace(encode(memo_html, ‘escape’),‘\000’,‘’))” kennt er nicht, zu Recht.
Bin da jetzt etwas überfordert wie ich das nun übergeben muss und ob das überhaupt funktioniert.
In den Beispielen (z.B. von hier tsearch-v2-intro) ist das immer eine Spaltenname der übergeben wird.
Da meine Spalte nun aber ein bytea Datentyp ist, muss ich den Inhalt erst Encoden und noch durch 2 Funktionen laufen lassen.
In deiner 1. Frage hast du das 2. Argument nicht in Double-Quotes gehabt, hier schon.
Funktionieren sollte es ohne Double-Quotes, du willst ja das Ergebnis deines Funktionsaufrufes übergeben und nicht das String-Lateral für den Aufruf.
Es ist auch so, das Double-Quotes in PG (und anderen DBMS ?) immer ein Datenbankobjekt kennzeichnen.
String-Laterale werden in Single-Quotes gepackt.
Du willst hier aber gar nichts Quoten sondern das Ergebnis deines Funktionsaufrufes übergeben.
Das geht in PG genauso wie auch anderswo(Shell,c,PHP,Java,usw.)
Du musst nur auf den richtigen Typ achten, da ist PG sehr penibel.
DROP TRIGGER trigger_memo ON memo;
CREATE TRIGGER trigger_memo
BEFORE INSERT OR UPDATE
ON memo
FOR EACH ROW
EXECUTE PROCEDURE tsearch2(‘fulltextsearch_memo’, ‘encode(memo_html, escape)’);
das funktioniert auch nicht. Ohne Quotes kann ich den Index erst garnicht erzeugen, da die Parameter nicht korrekt übergeben werden.
Also du meinstest dann das,wenn ich das richtg verstanden habe:
EXECUTE PROCEDURE tsearch2(‘fulltextsearch_memo’, hier steht mein Text); --funktioniert nicht!
Ich werde nun eine weitere Spalte für den Text implementieren, da ich diese früher oder später sowieso brauchen werde.
–Die gehört zu der Volltextsuche
CREATE OR REPLACE FUNCTION tsearch2()
RETURNS trigger AS
‘$libdir/tsearch2’, ‘tsa_tsearch2’
LANGUAGE c VOLATILE
COST 1;
DROP TRIGGER trigger_memo ON memo;
CREATE TRIGGER trigger_memo
BEFORE INSERT OR UPDATE
ON memo
FOR EACH ROW
EXECUTE PROCEDURE tsearch2(‘fulltextsearch_memo’, encode(memo_html, escape));
FEHLER: Syntaxfehler bei »(«
LINE 6: …E PROCEDURE tsearch2(‘fulltextsearch_memo’, encode(memo_html…
. ^
EDIT: Das ^- Zeichen ist eigentlich zwischen dem ende von encode und der Klammer auf.
********** Fehler **********
FEHLER: Syntaxfehler bei »(«
SQL Status:42601
Zeichen:177
mea culpa meine Ignoranz des Themas TSearch2 bisher.
Du hast völlig Recht:
In der Triggerfunktion wird immer eine Spalte aus der Tabelle erwartet(siehe PostgreSQL: Documentation: 9.2: Additional Features)
Also kommst du um eine weitere Spalte nicht herum, es sei denn du nimmst davon Abstand bytea zu benutzen.
Vielleicht geht es auch mit einem Trigger auf eine View ?