A seguito di this answer voglio sapere qual è il modo migliore per utilizzare di PostgreSQL incorporato ricerca a testo integrale è se voglio ordinare per rango, e limite alla query solo corrispondenti .modo migliore per utilizzare PostgreSQL ricerca a testo integrale classifica
Assumiamo una tabella molto semplice.
CREATE TABLE pictures {
id SERIAL PRIMARY KEY,
title varchar(300),
...
}
o qualsiasi altra cosa. Ora voglio cercare nel campo title
. Per prima cosa creare un indice:
CREATE INDEX pictures_title ON pictures USING gin(to_tsvector('english', title));
Ora voglio cercare 'small dog'
. Questo funziona:
SELECT pictures.id, ts_rank_cd(to_tsvector('english', pictures.title), 'small dog') AS score
FROM pictures
ORDER BY score DESC
Ma quello che voglio veramente è questo:
SELECT pictures.id, ts_rank_cd(to_tsvector('english', pictures.title), to_tsquery('small dog')) AS score
FROM pictures WHERE to_tsvector('english', pictures.title) @@ to_tsquery('small dog')
ORDER BY score DESC
Oppure, in alternativa questo (che non funziona - non può utilizzare score
nella clausola WHERE
):
SELECT pictures.id, ts_rank_cd(to_tsvector('english', pictures.title), to_tsquery('small dog')) AS score
FROM pictures WHERE score > 0
ORDER BY score DESC
Qual è il modo migliore per farlo? Le mie domande sono numerosi:
- Se uso la versione con ripetuti
to_tsvector(...)
intende chiamare che per due volte, o è abbastanza intelligente per mettere in cache i risultati in qualche modo? - C'è un modo per farlo senza ripetere le chiamate di funzione
to_ts...
? - C'è un modo per utilizzare
score
nella clausolaWHERE
? - In caso affermativo, sarebbe meglio filtrare per
score > 0
o utilizzare la cosa@@
?
Questa risposta ignora ciò che seemse di essere la parte più importante della questione: "classifica" – steviejay