HILFE! Funktionen unter PostgreSQL einbinden - ist das denn so schwer?

J

jamax

Mitglied
Thread Starter
Dabei seit
16.04.2007
Beiträge
51
Reaktionspunkte
0
Hallo Leute,

Ich brauch dringend mal Eure Hilfe - eien Nacht Google hat nichts geholfen. Ich muss unbedingt ds Modul 'fuzzystrmatch' unter PSQL zum laufen bekommen. Aber ich finde keinen Weg dorthin. Ist das denn so schwer?

Ich habe eine Datei fuzzystrmatch.tar mit dem Inhalt:

fuzzystrmatch.c
fuzzystrmatch.h
fuzzystrmatch.sql.in
Makefile
uninstall_fuzzystrmatch.sql

bekommen und weiß nicht weiter. Bei mir läuft PSQL in /Libray/Postgres ..., da ich das vorgeschlagene Paket für MacOS von Postgresql.org installiert habe.

Falls ich Euch noch mehr Daten liefern kann, sagt einfach Bescheid.

Ich danke Euch.
 
GCC installiert aber weiter?

So. ich bin nun einen Schritt weiter (oder nicht?) und habe erfahren, dass ich diese Dateien erst kompilieren muss. Aber er findet alle include-DAteien nciht. In welchen Ordner muss ich die dateien denn speichern, damit ich sie kompilieren kann? Danke.
 
1. welches Postgres
2. wie wird dieses Modul denn installiert? Muß gar Postgres neukompiliert werden?
3. Wofür soll das Paket denn gut sein? Sicher das es noch nicht in Postgres enthalten ist?
4. es fehlt eine genaue Fehlerbeschreibung.Ich fürchte Du hast noch nie Software selbst erstellt/Compiliert? Da hast Du einen längeren Weg bis zum Ziel vor Dir :)
 
Danke für Dein Interesse. Ich werde Dir die Fragen beantworten und hoffe anschließend auf einen Hinweis. Du hast übrigends recht. Ich ziehe einen Mac dem Pinguin vor, da ich hier hoffte, mich nicht mit solchen Dingen herum zu plagen.

... und richtig - ich habe noch nie kompiliert - ausser mal ein paar Dateien im Studium.

1. SELECT VERSION() liefert mir:
Code:
PostgreSQL 8.3.1 on i386-apple-darwin9.2.2, compiled by GCC i686-apple-darwin9-gcc-4.0.1 (GCC) 4.0.1 (Apple Inc. build 5478)
Die Anleitung unter MacUser-165232/ hat irgendwo nicht funktioniert und somit bin ich auf postgresqlformac.com ausgewichen.

2. Wie das Modul installiert wird, ist ja meine Frage. Ich habe die Datei mit angegeben Dateien heruntergeladen ud entpackt. In Übersichten von Linuxdisrtibutionen ist auch eine fuzzystrmatch.so zu finden - die Datei an sich ist abr unauffindbar. Infos über das Paket findet man HIER und HIER.

3. Das Paket enthält C-Funktionen für die Levenshtein-Funktion. Sowas ist u.a. in der datei fuzzystrmatch.sql.in enthalten:
Code:
CREATE OR REPLACE FUNCTION levenshtein (text,text) RETURNS int
AS 'MODULE_PATHNAME','levenshtein'
LANGUAGE C IMMUTABLE STRICT;
Nun dachte ich mir, suchst'de die Datei fuzzystrmatch.so und kopierste die in den Ordner --INCLUDEDIR zu den anderen dynamscihen Modulen. Aber die so-Datei bekomm ich nirgends ran. So wollte ich sie irgendwie kompilieren?!?! Ich hab keine Ahnung. Mein gedanke war - Reinkopieren und Server neu starten.
Da die Funktion
Code:
SELECT LEVENSHTEIN('TEST', 'TEXT');
einen Error
Code:
ERROR: function levenshtein(unknown, unknown) does not exist
liefert, nehem ich stark an, dass sie nicht vorhanden ist.

4. welchen Fehler? Mir felhlt das Versteändnis, bevor ich einen Fehler erzeugen kann.

Vielen Dank für schnelle Hilfe. Es ist schon beinahe (studiums-)lebenswichtig...
 
Das steht übrigends in der README.fuzzystrmatch aus einer PSQL-Distibution von packages.ubuntu.com...
Code:
/*
 * fuzzystrmatch.c
 *
 * Functions for "fuzzy" comparison of strings
 *
 * Copyright (c) Joseph Conway <joseph.conway@home.com>, 2001;
 *
 * levenshtein()
 * -------------
 * Written based on a description of the algorithm by Michael Gilleland
 * found at http://www.merriampark.com/ld.htm
 * Also looked at levenshtein.c in the PHP 4.0.6 distribution for
 * inspiration.
 *
 * metaphone()
 * -----------
 * Modified for PostgreSQL by Joe Conway.
 * Based on CPAN's "Text-Metaphone-1.96" by Michael G Schwern <schwern@pobox.com>
 * Code slightly modified for use as PostgreSQL function (palloc, elog, etc).
 * Metaphone was originally created by Lawrence Philips and presented in article
 * in "Computer Language" December 1990 issue.
 *
 * Permission to use, copy, modify, and distribute this software and its
 * documentation for any purpose, without fee, and without a written agreement
 * is hereby granted, provided that the above copyright notice and this
 * paragraph and the following two paragraphs appear in all copies.
 * 
 * IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY FOR
 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING
 * LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS
 * DOCUMENTATION, EVEN IF THE AUTHOR OR DISTRIBUTORS HAVE BEEN ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 * 
 * THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
 * ON AN "AS IS" BASIS, AND THE AUTHOR AND DISTRIBUTORS HAS NO OBLIGATIONS TO
 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 *
 */


Version 0.1 (3 August, 2001):
  Functions to calculate the degree to which two strings match in a "fuzzy" way
  Tested under Linux (Red Hat 6.2 and 7.0) and PostgreSQL 7.2devel

Release Notes:

  Version 0.1
    - initial release    

Installation:
  Place these files in a directory called 'fuzzystrmatch' under 'contrib' in the PostgreSQL source tree. Then run:

    make
    make install

  You can use fuzzystrmatch.sql to create the functions in your database of choice, e.g.

    psql -U postgres template1 < fuzzystrmatch.sql

  installs following functions into database template1:

     levenshtein() - calculates the levenshtein distance between two strings
     metaphone() - calculates the metaphone code of an input string

Documentation
==================================================================
Name

levenshtein -- calculates the levenshtein distance between two strings

Synopsis

levenshtein(text source, text target)

Inputs

  source
    any text string, 255 characters max, NOT NULL

  target
    any text string, 255 characters max, NOT NULL

Outputs

  Returns int

Example usage

  select levenshtein('GUMBO','GAMBOL');

==================================================================
Name

metaphone -- calculates the metaphone code of an input string

Synopsis

metaphone(text source, int max_output_length)

Inputs

  source
    any text string, 255 characters max, NOT NULL

  max_output_length
    maximum length of the output metaphone code; if longer, the output
    is truncated to this length

Outputs

  Returns text

Example usage

  select metaphone('GUMBO',4);

==================================================================
-- Joe Conway

Ich habe halt nur keinen contrib-Ordner?!
 
jamax schrieb:
Ich habe halt nur keinen contrib-Ordner?!

die Anleitung geht davon aus das Du die Sourcen von Postgres hast. Ob mit make;make install; ganz Postgres gemeint ist oder vielleicht in der Tat nur die Library kann man in der Tat nicht verstehen.
Tatsächlich wird aber zum compilieren die Source-Distribution ausdücklich vorausgesetzt. Ob auch andere Sourcen vorliegen müssen (Drittabhängigkeiten) wird sich dann ja zeigen.


diese Zeile:
psql -d template1 -U postgres -f fuzzystrmatch.sql

läßt mich vermuten das die Library nur innerhalb der Postrges-Sourcen kompiliert werden muß und dann nachträglich in jede bestehende Postgres 8.3.x Binärdistribution mit obigen SQL-Anweisungen integriert werden kann wenn die .so hinzugefügt wurde.

EDIT: Du brauchst die sog. Contrib.-Module! Ich habe die Levenshtein-Funktion bei meinem postgres auch mal gesucht und nciht gefunden. Allerdings habe ich ( gemäß des Readme von Dir) nach einer fuzzystrmatch.so und fuzzystrmatch.sql gesucht und beide gefunden. Ich verwende Postgres von http://www.macports.org/ ! Es wird Dich vermutlich ärgern denn das installiert ein BSD-Subsystem unter OS X um Unix-Pakete zugänglich zu haben. Damit bist Du wieder da wovor Du "weggelaufen" bist :)
Ich hab das aber auch mal so gemacht (weil mir das dauernde Beta-Gebastel auch zu doof war bei einigen Distributionen) und finde diese Kombination aus Apple-like OS X und BSD-UNIX wenn ich es benötige inzwischen sehr angenehm. Ich werde jetzt ersteinmal versuchen diese Funktionen bei meinem Postgres mitzuinstallieren, die sind ja wirklich sehr nützlich :)
 
Zuletzt bearbeitet:
Die Installation hat übrigens mit der Macports-Version auf Anhieb geklappt!

Durch einfaches Aufrufen von:

psql -U postgres template1 < /opt/local/share/postgresql83/contrib/fuzzystrmatch.sql

als root! Etwas merkwürdig ist nur warum die Funktionen nicht je DB-Server installiert werden sondern wirklich je Datenbank. Man muß also template1 durch die DB ersetzen in der man die Funktion dann auch benötigt. Jedenfalls funktioniert es damit wie gewünscht!
 
Also hab ich jetzt MacpPorts installiert. Nun werde ich meine Postgres-datenbank entfernen und dann #> port ... postgresql83 installieren?! Oder besser postgresql83-server? und dann meinst du, klappt alles? Oje!
 
So. Also erst einmal danke ich für de Hilfe. Ich habe meine alte PSQL-DB mittels Shellskript deinstalliert. Dann habe ich von postgresql.com die neueste Version installiert und mittels deiner anweisung die fuzzystrmatch.sql ausgeführt. Das alles hat funktioniert. Nun spiele ich gerade wieder meinen 30MB-Dump ein. Vielen Dank - auch für den MacPort-Hinweis. Ich werde mich mal damit beschäftigen. Schlecht klingt das ja nicht - nur übersichtlich siehts das über die Komandozeile auch nicht aus. ;)

Vielen Dank.
 
freut mich wenn es auch so geholfen hat :)


jamax schrieb:
Schlecht klingt das ja nicht - nur übersichtlich siehts das über die Komandozeile auch nicht aus.

Naja ist halt ein UNIX. Ich mag UNIXe, wohl auch weil die ersten Shells mir vor über 20 Jahren über den Weg liefen. Einmal daran gewöhnt kann man damit sehr schnell und effektiv Dinge tun die bei den GUI-Apps gar nicht oder nur schwer möglich sind. Über LINUX hab ich mich genauso geärgert wie Du. Mit OS X hab ich genau de Dualismus den ich haben mag. Ein komfortables OS, das ich aber jederzeit auch mit der Shell nutzen kann. Mit Macports kommt dann ein riesiger Distributionszweig hinzu. Ich meine für das port-Kommando gäbe es auch irgendwo ein frontend.
 
Zurück
Oben Unten