opierając się na this answer Chcę wiedzieć, jaki jest najlepszy sposób na wykorzystanie PostgreSQL wbudowanego wyszukiwania pełnotekstowego jest, jeśli chcę sortować według rangi, i limitu tylko dopasowanych zapytań .Najlepszy sposób na wykorzystanie PostgreSQL przeszukiwanie pełnego tekstu Ranking
Załóżmy bardzo prosty stół.
CREATE TABLE pictures {
id SERIAL PRIMARY KEY,
title varchar(300),
...
}
lub coś innego. Teraz chcę przeszukać pole title
. Najpierw tworzę indeks:
CREATE INDEX pictures_title ON pictures USING gin(to_tsvector('english', title));
Teraz chcę wyszukać 'small dog'
. To działa:
SELECT pictures.id, ts_rank_cd(to_tsvector('english', pictures.title), 'small dog') AS score
FROM pictures
ORDER BY score DESC
Ale to, co naprawdę chcę to:
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
Lub alternatywnie ten (który nie działa - nie można używać score
w klauzuli 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
Jaki jest najlepszy sposób na zrobienie tego? Moje pytania to wiele razy:
- Jeśli używam wersji z wielokrotnym
to_tsvector(...)
to nazwać, że dwa razy, czy jest wystarczająco inteligentny, aby buforować wyniki jakoś? - Czy istnieje sposób, aby to zrobić bez powtarzania wywołań funkcji
to_ts...
? - Czy istnieje sposób użycia
score
w klauzuliWHERE
w ogóle? - Jeśli tak, to czy lepiej jest filtrować przez
score > 0
lub użyć funkcji@@
?
Ta odpowiedź ignoruje co seemse być najważniejsza część pytania: "zaszeregowanie" – steviejay