2015-08-13 12 views
10

La queryPostgres derivanti buttare fuori partite

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

restituisce false, anche se 'riposo e' è un prefisso di 'ricreazione'. Questo sembra accadere perché la "ricreazione" è memorizzata come radice, "ricrea". Per esempio, se abbiamo volutamente rompere l'algoritmo derivante eseguendo

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

la query restituisce true.

C'è un modo per far coincidere la prima query?

+1

punto interessante. L'interazione tra le corrispondenze con caratteri jolly e la derivazione può essere problematica. Altro che usare il dizionario '' semplice' '(e poi perdere la derivazione quando lo vuoi) non sono sicuro che ci sia una buona soluzione qui. –

risposta

1

Non sono sicuro se questa risposta è utile data l'età della questione, ma:

Per quanto riguarda derivante

sembra hai ragione:

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

uscite

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

e documentation dice

Inoltre, * può essere collegato a un lessema per specificare corrispondenza prefisso:

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

Tale lessema corrisponderà qualsiasi parola in una tsvector che inizia con la stringa data.

Quindi sembra che non ci sia modo di fare corrispondere la query originale.

Una soluzione basata sulla corrispondenza parziale

Si potrebbe, ripiegate sulla ricerca per parole parziali degli steli e la query, per esempio utilizzando pg_trgm estensione:

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, ' ')) 
); 

(. Forse la matrice di steli può essere formato in un modo più elegante)