2009-09-30 4 views
24

Ich benutze die PostgreSQL-Volltextsuche für ein Projekt, bei dem traditionelle Stoppwörter ('a', 'the', 'if' usw.) indiziert und durchsucht werden sollen, was nicht das Standardverhalten ist. Zum Beispiel möchte ich, dass meine Benutzer Ergebnisse für die Abfrage finden, die "sein oder nicht sein" sollen.Kann ich Stoppwörter programmgesteuert mit der PostgreSQL-Volltextsuche konfigurieren?

Die documentation zeigt an, dass ich dies erreichen konnte, indem ich ein leeres Stoppwörterbuch in $SHAREDIR/tsearch_data/english.stop (zum Beispiel) erstelle, aber das wird die Bereitstellung komplizieren; Ich möchte in der Lage sein, PostgreSQL Stop-Word-Handhabung mit SQL zu konfigurieren. Ist das möglich? Wenn ja, können Sie eine Beispiel-SQL-Anweisung bereitstellen?

Antwort

34

Wie pro Ihren Kommentar zu der vorherigen Antwort, Sie können Wörter zwischen der Verwendung von keine Stoppwörter und einfach wechseln alle stoppen. Sie können diese acheive mit einer benutzerdefinierten Suche Konfiguration:

(1) Sie können ohne Verwendung der Stoppwörter-Datei, zum Beispiel eines Benutzerwörterbuch erstellen:

CREATE TEXT SEARCH DICTIONARY english_stem_nostop (
    Template = snowball 
    , Language = english 
); 

Hinweis, in der ich oben links aus dem StopWords Parameter.

(2) Dann eine neue Konfiguration erstellen Sie Ihr neues Wörterbuch verwenden:

CREATE TEXT SEARCH CONFIGURATION public.english_nostop (COPY = pg_catalog.english); 
ALTER TEXT SEARCH CONFIGURATION public.english_nostop 
    ALTER MAPPING FOR asciiword, asciihword, hword_asciipart, hword, hword_part, word WITH english_stem_nostop; 

(3) Wenn dann die Config Sie verwenden möchten die Suche angeben (alternativ Sie jedes Mal default_text_search_config Option ändern können), zB:

SELECT 
    title 
FROM 
    articles 
WHERE 
    to_tsvector('english_nostop', COALESCE(title,'') || ' ' || COALESCE(body,'')) 
    @@ to_tsquery('english_nostop', 'how & to'); 

Sie können nur 'english' in der obigen SQL geben Sie die normale Konfiguration verwendet werden.

Hinweis, in diesem Beispiel, dass die Standardkonfiguration verwendet, wird in Mitteilungen führen, weil es nur Worte stoppen ist.


Beachten Sie die folgenden, aber:

  • Wenn Sie Indizes verwenden, werden Sie zwei müssen - eine für jede Konfiguration. (siehe diese Dokumente: tsearch tables und triggers).
  • Überprüfen Sie, welche Parser-Token diese Zuordnung gemäß Schritt 2 oben verwenden möchten (siehe Parsers).
+0

Danke, catchdave - das ist, was ich gesucht habe. – tomd

2

Nein, die Stoppwörter sind nur über diese Datei konfigurierbar. Sie können eine serverseitige Funktion haben, die die Datei ändert, aber dafür muss die Datei vom Benutzer postgres service geschrieben werden, was Sie wahrscheinlich nicht wollen.

+1

OK, danke. Um es klar zu sagen: Es ist nicht möglich, PostgreSQL mitzuteilen, dass es keine * stopwords-Datei verwenden soll. – tomd

Verwandte Themen