2012-05-25 22 views
12

Ich wurde angeworben, um bei einem Projekt zu helfen, und ich tauche wieder in PostgreSQL ein, nachdem ich mehrere Jahre nicht damit gearbeitet habe. Nebenbei bemerkt, habe ich noch nie zuvor Tsvector-Felder benutzt und stehe nun vor einem Bug, der auf ihnen basiert. Ich lese die Dokumentation auf dem Feldtyp und es ist Zweck, aber ich habe eine harte Zeit, die Dokumentation ausgrub, wie ‚einfach‘ unterscheidet sich von ‚Englisch‘ als der erste Parameter to_tsquery()"to_tsquery" auf tsvector ergibt unterschiedliche Ergebnisse bei der Verwendung von "einfach" und "Englisch"?

Beispiel

> SELECT to_tsvector('mortgag') @@ to_tsquery('simple', 'mortgage') 
?column? 
---------- 
f 
(1 row) 

> SELECT to_tsvector('mortgag') @@ to_tsquery('english', 'mortgage') 
?column? 
---------- 
t 
(1 row) 

Ich würde denken, sie sollten beide wahr, aber offensichtlich die erste nicht - warum?

Antwort

18

Das FTS verwendet dictionaries den Text zu normalisieren:

12,6. Wörterbücher

Wörterbücher verwendet Wörter zu beseitigen, die bei einer Suche (Stoppwörter) nicht in Betracht gezogen werden sollte, und zu Worte normalisieren, so dass verschiedene abgeleitete Formen des gleichen Wortes wird übereinstimmen. Ein erfolgreich normalisiertes Wort wird Lexem genannt.

So sind Wörterbücher verwendet, um Dinge zu werfen, die zu häufig oder bedeutungslos sind in einer Suche (Stoppwörter) zu prüfen und Stadt alles andere so zu normalisieren und Städte, zum Beispiel, wird übereinstimmen obwohl sie verschiedene Wörter sind.

uns irgend Ausgabe von ts_debug Werfen wir einen Blick und sehen, was mit den Wörterbüchern vor sich geht:

=> select * from ts_debug('english', 'mortgage'); 
    alias | description | token | dictionaries | dictionary | lexemes 
-----------+-----------------+----------+----------------+--------------+----------- 
asciiword | Word, all ASCII | mortgage | {english_stem} | english_stem | {mortgag} 

=> select * from ts_debug('simple', 'mortgage'); 
    alias | description | token | dictionaries | dictionary | lexemes 
-----------+-----------------+----------+--------------+------------+------------ 
asciiword | Word, all ASCII | mortgage | {simple}  | simple  | {mortgage} 

Beachten Sie, dass simple verwendet das simple Wörterbuch während english verwendet das english_stem Wörterbuch.

Die simple dictionary:

arbeitet durch die Eingabe-Token Umwandlung Fall zu senken und es gegen eine Datei von Stop-Wörter zu überprüfen. Wenn es in der Datei gefunden wird, wird ein leeres Array zurückgegeben, wodurch das Token verworfen wird. Wenn nicht, wird die untere Form des Wortes als normalisiertes Lexem zurückgegeben.

Das simple Wörterbuch löst nur Stoppwörter, Downcases, und das ist es. Wir können seine Einfachheit selbst sehen:

=> select to_tsquery('simple', 'Mortgage'), to_tsquery('simple', 'Mortgages'); 
to_tsquery | to_tsquery 
------------+------------- 
'mortgage' | 'mortgages' 

Das simple Wörterbuch ist zu einfach, um selbst einfache Plurale handhaben.

Also was ist das english_stem Wörterbuch über? Das Suffix "Stem" ist ein Give Away: Dieses Wörterbuch wendet einen Stemming-Algorithmus auf zu konvertierende Wörter an (zum Beispiel) city und Städte zu derselben Sache.Von der fine manual:

12.6.6. Snowball Dictionary

Die Snowball Wörterbuch Vorlage basiert auf einem Projekt von Martin Porter, Erfinder des populären Porter's Stemming-Algorithmus für die englische Sprache. [...] Jeder Algorithmus versteht es, gängige Varianten von Wörtern auf eine Basis oder einen Stamm in ihrer Sprache zu reduzieren.

Und unten, dass wir sehen das english_stem Wörterbuch:

CREATE TEXT SEARCH DICTIONARY english_stem (
    TEMPLATE = snowball, 
    Language = english, 
    StopWords = english 
); 

Also das english_stem Wörterbuch Wörter Stielen und wir können sehen, dass passieren:

=> select to_tsquery('english', 'Mortgage'), to_tsquery('english', 'Mortgages'); 
to_tsquery | to_tsquery 
------------+------------ 
'mortgag' | 'mortgag' 

Executive Summary: 'simple' impliziert einfach gesinnte wörtliche Übereinstimmung, 'english' gilt stemming (hoffentlich) produzieren besser zusammenpassen. Die Stemming-Turns Hypothek in Mortgag und das gibt Ihnen Ihr Spiel.

+0

Fantastisch! Genau das habe ich gesucht - ich muss noch etwas Zeit im Handbuch verbringen. Vielen Dank! – phatskat

+0

@mu ist zu kurz Haben Sie ein Problem mit Postgresql 9.6.1, wo nicht-lateinische Zeichen wie '你' in 'to_tsvector (Titel) @@ to_tsquery ('你')' konnte keine Zeichenfolge finden mit '你' in '你 好嗎'? – Growler

+0

@Growler Noch nicht, klingen wie ein gutes Thema für eine neue Frage. –