2015-08-13 11 views
10

Die AbfragePostgres stamm

SELECT to_tsvector('recreation') @@ to_tsquery('recreatio:*');

false zurück Spiele werfen, obwohl 'Recreati' ist ein Präfix von 'Erholung'. Dies scheint zu geschehen, weil "Erholung" als sein Stamm gespeichert wird, "retreat". Zum Beispiel, wenn wir den Algorithmus ergibt absichtlich brechen durch

SELECT to_tsvector('recreation1') @@ to_tsquery('recreatio:*');

die Abfrage wahr läuft.

Gibt es eine Möglichkeit, die erste Abfrage übereinstimmen zu lassen?

+1

interessanten Punkt. Die Interaktion von Wildcard-Matches und Stemming kann problematisch sein. Anders als das "einfache" Wörterbuch zu verwenden (und dann zu verlieren, wenn du es willst), bin ich mir nicht sicher, ob es hier eine gute Lösung gibt. –

Antwort

1

nicht sicher, ob diese Antwort nützlich ist das Alter der Frage gegeben, aber:

Bezüglich ergeben

Es scheint, Sie haben recht:

select ts_lexize('english_stem','recreation'); 

Ausgänge

ts_lexize 
----------- 
{recreat} 
(1 row) 

und die documentation sagt

Auch * kann auf eine lexeme angebracht werden Abgleich von Präfixen angeben:

SELECT to_tsquery('supern:*A & star:A*B');

Eine solche lexeme passt auf jedes Wort in einem tsvector, die mit dem angegebenen String beginnt.

So scheint es, gibt es keine Möglichkeit, ursprüngliche Abfrage übereinstimmen.

Eine Lösung, die auf eine teilweise Übereinstimmung

One zu suchen teilweise Übereinstimmungen der Stiele und der Abfrage Rückfall könnte, zum Beispiel Verwendung pg_trgm extension:

SELECT (to_tsvector('recreation creation') @@ to_tsquery('recreatio:*')) or 
    'recreatio:*' % any (
    select trim(both '''' from regexp_split_to_table(strip(to_tsvector('recreation creation'))::text, ' ')) 
); 

(. Vielleicht der Arrays Stielen in einem eleganteren Weg gebildet werden)