Sto usando trigrammi per la ricerca full-text in Postgres come questo:Come eseguire una semplice riduzione della mappa in Postgres?
SELECT *
FROM "Users" users
WHERE 'search_text' % ANY(regexp_split_to_array(users.name,E'\\s+'))
Query sopra controlla se search_text
corrisponde a qualsiasi parola (split da whitespace
) in User.displayName
. Questo funziona, tuttavia, i risultati non sono ordinati in base al "punteggio" effettivo.
Il punteggio può essere calcolato dalla funzione similarity(text,text)
.
Il problema è che devo ordinare da loro la somma di tutte le somiglianze trovate per ogni parola in User.name
. Quindi, se il nome utente è "A B C"
quindi il suo punteggio dovrebbe essere:
similarity('search_text','A') + similarity('search_text','B') + similarity('search_text','C')
quindi ho bisogno di mappare il nome utente parole a punteggi e poi sum (ridurre) loro. Come posso farlo a Postgres?