Wie kann man nach dem Upsize eine Volltextsuche hinzufügen? [ERLEDIGT]
Moderator: Moderatoren
- dtmackenzie
- Rekursionen-Architekt
- Beiträge: 265
- Registriert: Do, 22. Nov 2007 9:02
- Wohnort: Leipzig
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 22 Mal
- Kontaktdaten:
Wie kann man nach dem Upsize eine Volltextsuche hinzufügen? [ERLEDIGT]
Hallo alle,
beim Upsize auf Postgres kann man eine Volltextsuche hinzufügen, tolle Sache, geht richtig schnell.
Ich finde aber leider keine Informationen darüber, wie man dies im Normalbetrieb (nach dem Upsize) macht.
Steht bestimmt irgendwo beschrieben, aber weißt jemand zufällig wo?
beim Upsize auf Postgres kann man eine Volltextsuche hinzufügen, tolle Sache, geht richtig schnell.
Ich finde aber leider keine Informationen darüber, wie man dies im Normalbetrieb (nach dem Upsize) macht.
Steht bestimmt irgendwo beschrieben, aber weißt jemand zufällig wo?
Zuletzt geändert von dtmackenzie am Do, 25. Mär 2021 15:36, insgesamt 1-mal geändert.
Viele Grüße,
David
David
- dtmackenzie
- Rekursionen-Architekt
- Beiträge: 265
- Registriert: Do, 22. Nov 2007 9:02
- Wohnort: Leipzig
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 22 Mal
- Kontaktdaten:
Re: Wie kann man nach dem Upsize eine Volltextsuche hinzufügen?
Gibt es eine Möglichkeit, die gleiche Funktion aufzurufen, die das Upsize benutzt?
Viele Grüße,
David
David
- HaPe
- 1000 working lines a day
- Beiträge: 996
- Registriert: So, 15. Nov 2015 17:44
- Wohnort: 71665 Vaihingen-Enz
- Hat sich bedankt: 17 Mal
- Danksagung erhalten: 15 Mal
Re: Wie kann man nach dem Upsize eine Volltextsuche hinzufügen?
Normalerweise kann man bei SQL-Servern die Volltext-Suche nur bei der Erstellung der Datenbank angeben (gerade wieder in einem Vortrag gehört - nicht zu PostGreSQL).
--
Hans-Peter
Hans-Peter
- dtmackenzie
- Rekursionen-Architekt
- Beiträge: 265
- Registriert: Do, 22. Nov 2007 9:02
- Wohnort: Leipzig
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 22 Mal
- Kontaktdaten:
Re: Wie kann man nach dem Upsize eine Volltextsuche hinzufügen?
Hallo HaPe,
Danke für Deine Antwort!
Inzwischen habe ich für den konkreten Fall die Datenbank "neugeupsized", habe aber nun auch in der Hilfe zumindest eine allgemeine Beschreibung des Vorgangs gefunden unter:
Xbase++ Developer Bookshelf / Database Engines / PostgreSQL... / Samples... / Upsizing MDIDEMO / Adding full-text search / Behind the scenes
Da drin steht u.a. Folgendes:
Danke für Deine Antwort!
Inzwischen habe ich für den konkreten Fall die Datenbank "neugeupsized", habe aber nun auch in der Hilfe zumindest eine allgemeine Beschreibung des Vorgangs gefunden unter:
Xbase++ Developer Bookshelf / Database Engines / PostgreSQL... / Samples... / Upsizing MDIDEMO / Adding full-text search / Behind the scenes
Da drin steht u.a. Folgendes:
Die Prozedur sollte manuell nachvollziehbar sein wenn ich eine schon konvertierte Tabelle anschaue (ich nehme an, dass das UPDATE Ähnliches machen soll wie im Trigger zu sehen ist), vielleicht lässt sie sich doch in eine Funktion kapseln, das versuche ich nächstes Mal.The deferred action creating a full-text search index does a number of things on behalf of the SQL server:
* Alters the table to add a field "fts_col" with the "tsvector" data type.
* Executes an UPDATE statement for storing the transformed textual data from the fields listed in the binding clause into "fts_col".
* Creates a GIST index for the "fts_col" field.
* Creates a trigger to automatically maintain the "fts_col" data if changes occur in one of the bound fields (lastname, firstname, city, notes).
Viele Grüße,
David
David
- nightcrawler
- 1000 working lines a day
- Beiträge: 653
- Registriert: Di, 24. Apr 2012 16:33
- Wohnort: 72184 Weitingen
- Hat sich bedankt: 3 Mal
- Danksagung erhalten: 96 Mal
- Kontaktdaten:
Re: Wie kann man nach dem Upsize eine Volltextsuche hinzufügen?
gilt nicht für alle. Ich kenne mindestens einen, bei dem eine Volltextsuche auch nachträglich per Index angelegt werden kann;)
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9388
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 104 Mal
- Danksagung erhalten: 362 Mal
- Kontaktdaten:
Re: Wie kann man nach dem Upsize eine Volltextsuche hinzufügen?
Die Schritte, die David aus der Doku zitiert hat, ließen sich natürlich auch nachträglich anwenden - wenn man genauere Kenntnis über sie hätte.
Herzlich,
Tom
Tom
- dtmackenzie
- Rekursionen-Architekt
- Beiträge: 265
- Registriert: Do, 22. Nov 2007 9:02
- Wohnort: Leipzig
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 22 Mal
- Kontaktdaten:
Re: Wie kann man nach dem Upsize eine Volltextsuche hinzufügen?
Danke nightcrawler und Tom,
ich glaube, das Meiste müsste in der Postgres-Doku zu finden sein.
Mit pgAdmin4 sehe ich die Trigger, die vom Upsize angelegt wurden, z.B:
Ich vermute, dass das UPDATE genau das Gleiche machen müsste, nur für die ganze Tabelle anstatt eines einzelnen Datensatzes.
ich glaube, das Meiste müsste in der Postgres-Doku zu finden sein.
Mit pgAdmin4 sehe ich die Trigger, die vom Upsize angelegt wurden, z.B:
Code: Alles auswählen
begin
new.fts_col_ang := to_tsvector(coalesce(new.bemerk,''))||to_tsvector(coalesce(new.benutzer,''))||to_tsvector(coalesce(new.ktb,''))||to_tsvector(coalesce(new.ftb,''))||to_tsvector(coalesce(new.info,''));
return new;
end
Viele Grüße,
David
David
- nightcrawler
- 1000 working lines a day
- Beiträge: 653
- Registriert: Di, 24. Apr 2012 16:33
- Wohnort: 72184 Weitingen
- Hat sich bedankt: 3 Mal
- Danksagung erhalten: 96 Mal
- Kontaktdaten:
Re: Wie kann man nach dem Upsize eine Volltextsuche hinzufügen?
Hallo David,
es gibt einen Trick, wie man jeden Datensatz anfassen kann und somit die Update-Trigger der einzelnen Datensätze feuert:
es gibt einen Trick, wie man jeden Datensatz anfassen kann und somit die Update-Trigger der einzelnen Datensätze feuert:
Code: Alles auswählen
UPDATE [tabelle] SET [einfeld]=[einfeld]
- dtmackenzie
- Rekursionen-Architekt
- Beiträge: 265
- Registriert: Do, 22. Nov 2007 9:02
- Wohnort: Leipzig
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 22 Mal
- Kontaktdaten:
Re: Wie kann man nach dem Upsize eine Volltextsuche hinzufügen?
Hallo Joachim,
das gefällt mir sehr, vermeidet Code-Duplizierung, Danke!
Wie gesagt, ich habe im aktuellen Fall ein erneutes Upsize gemacht, aber nächstes Mal habe ich vor, doch ein Programmchen dafür zu schreiben und hier zu posten.
das gefällt mir sehr, vermeidet Code-Duplizierung, Danke!
Wie gesagt, ich habe im aktuellen Fall ein erneutes Upsize gemacht, aber nächstes Mal habe ich vor, doch ein Programmchen dafür zu schreiben und hier zu posten.
Viele Grüße,
David
David
- dtmackenzie
- Rekursionen-Architekt
- Beiträge: 265
- Registriert: Do, 22. Nov 2007 9:02
- Wohnort: Leipzig
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 22 Mal
- Kontaktdaten:
Re: Wie kann man nach dem Upsize eine Volltextsuche hinzufügen?
Es ist soweit, musste ich doch noch eine Volltextsuche hinzufügen!
Keine Garantien, aber folgender Code ging für mich, ist hoffentlich selbsterklärend...
Keine Garantien, aber folgender Code ging für mich, ist hoffentlich selbsterklärend...
Code: Alles auswählen
FUNC XSQL(cSQL)
LOCAL oStmt:=DacSqlStatement():fromChar(cSQL)
RETURN oStmt:build():execute()
PROC AddFullTextSearch(cTableName, aFieldNames)
LOCAL cFTS_Col:="fts_col_"+cTableName, cFieldNames:="", cFirstField:=aFieldNames[1],;
cSQL:="", cTFName:=cFTS_Col+"_tsvector_trigger()", cr:=CHR(13)
// Procedure based (slightly modified) upon Xbase++ help:
// Xbase++ Developer Bookshelf / Database Engines / PostgreSQL... / Samples...
// / Upsizing MDIDEMO / Adding full-text search / Behind the scenes
// Most comments are "borrowed" from there.
// Assumes that the current DacSession is connected and has sufficient privileges.
// No error-handling!
// Alter the table to add a field <cFTS_Col> with the "tsvector" data type.
cSQL := "ALTER TABLE " + cTableName + " ADD COLUMN " + cFTS_Col + " tsvector"
XSQL(cSQL)
// Create a GIST index for the <cFTS_Col> field.
AEVAL(aFieldNames, {|c| cFieldNames += c + " "})
cSQL := "CREATE INDEX " + cFTS_Col + "_idx ON " + cTableName +;
" USING gist ( " + cFTS_Col + ")"
XSQL(cSQL)
// Create a trigger to automatically maintain the <cFTS_Col> data
// if changes occur in one of the bound fields.
cSQL := "CREATE FUNCTION public." + cTFName + cr
cSQL += " RETURNS trigger" + cr
cSQL += " LANGUAGE 'plpgsql'" + cr
cSQL += " COST 100" + cr
cSQL += " VOLATILE NOT LEAKPROOF" + cr
cSQL += "AS $BODY$" + cr
cSQL += "begin" + cr
cSQL += " new." + cFTS_Col + " := " + cr
cSQL += "to_tsvector(coalesce(new." + cFirstField + ",''))"
AEVAL(aFieldNames, {|c| cSQL += "||to_tsvector(coalesce(new." + c + ",''))"}, 2)
cSQL += ";" + cr
cSQL += "return new;" + cr
cSQL += "end" + cr
cSQL += "$BODY$;" + cr
XSQL(cSQL)
cSQL := "CREATE TRIGGER " + cFTS_Col + "_tsvector_update" + cr
cSQL += " BEFORE INSERT OR UPDATE" + cr
cSQL += " ON public." + cTableName + cr
cSQL += " FOR EACH ROW" + cr
cSQL += " EXECUTE PROCEDURE public." + cTFName + cr
XSQL(cSQL)
// Execute an UPDATE statement for storing the transformed textual data
// from the fields listed in the binding clause into <cFTS_Col>.
// Thanks to nightcrawler in Xbase forum for the elegant solution!
cSQL := "UPDATE " + cTableName + " SET " + cFirstField + "=" + cFirstField
XSQL(cSQL)
RETURN
Viele Grüße,
David
David