Change Triggerfunction

Hi everyone,

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 ?

Any help is much appreciated.

Regards,
Manuel

‘it doesnt work’ is a senseless message.

Btw.: can we switch to german, it’s a german forum.


Regards, Andreas

Guten Morgen,

Natürlich, sorry.

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.

Gruß Manuel

Hi,

nur vorab: Mit TSearch habe noch nie gearbeitet.

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.

HTH
hkocam

Hi,

danke für den Hinweis. Das stimmt natürlich.

Habe jetzt mal folgendes probiert:

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)’);

bzw.: EXECUTE PROCEDURE tsearch2(‘fulltextsearch_memo’, ‘some text’);


FEHLER: Spalte »encode(memo_html, escape)« existiert nicht

********** Fehler **********

FEHLER: Spalte »encode(memo_html, escape)« existiert nicht
SQL Status:42703


Er interpretiert den Parameter also auch mit einfachen Hochkomma als Spalte (zumindest an dieser Stelle).

Er scheint da wohl wirklich nur mit Spalten arbeiten zu können. Schade

Hallo,

versuche es ganz ohne Quotes.

vg hkocam

Hi,

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.

Trotzdem nochmal danke für die Hilfe.

Gruß Manuel

Hallo,
also noch mal einen Schritt zurück:
Wie sieht das CREATE-Statement für deine tsearch2-Funktion aus ?

Und bitte auch die komplette Fehlermeldung beim Aufruf ohne Quotes.

vg
hkocam

Hi,

–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



Gruß Manuel

Hallo,

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 ?

vg hkocam

Hi,

Interessante Idee. Wäre mal ein Versuch wert.
Da die zusätzliche Spalte mir aber noch andere Vorteile bringt, werd ich die einfach einbauen.

Gruß Manuel