diff --git a/createdb.sql b/createdb.sql index f3ef2f8..262169f 100644 --- a/createdb.sql +++ b/createdb.sql @@ -84,6 +84,26 @@ $$ LANGUAGE plpgsql; CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE ON books FOR EACH ROW EXECUTE PROCEDURE books_trigger(); CREATE INDEX CONCURRENTLY books_idx ON books USING GIN (tsv); +CREATE FUNCTION to_tsquery_multilingual(text) RETURNS tsquery AS $$ +SELECT + to_tsquery('simple', $1) || + to_tsquery('danish', $1) || + to_tsquery('dutch', $1) || + to_tsquery('english', $1) || + to_tsquery('finnish', $1) || + to_tsquery('french', $1) || + to_tsquery('german', $1) || + to_tsquery('hungarian', $1) || + to_tsquery('italian', $1) || + to_tsquery('norwegian', $1) || + to_tsquery('portuguese', $1) || + to_tsquery('romanian', $1) || + to_tsquery('russian', $1) || + to_tsquery('spanish', $1) || + to_tsquery('swedish', $1) || + to_tsquery('turkish', $1) +$$ LANGUAGE sql IMMUTABLE; + CREATE TABLE news ( diff --git a/lib/database/books.go b/lib/database/books.go index c69938d..8f19406 100644 --- a/lib/database/books.go +++ b/lib/database/books.go @@ -70,9 +70,9 @@ func (db *pgDB) getBooks(active bool, query string, length int, start int) (book searchParams = append(searchParams, c.value) } if textQuery != "" { - rank = append(rank, "ts_rank(tsv, to_tsquery(?))") + rank = append(rank, "ts_rank(tsv, to_tsquery_multilingual(?))") rankParams = append(rankParams, textQuery) - searchCondition += " AND to_tsquery(?) @@ tsv" + searchCondition += " AND to_tsquery_multilingual(?) @@ tsv" searchParams = append(searchParams, textQuery) } @@ -206,8 +206,7 @@ func buildQuery(query string) (textQuery string, columnQuerys []columnq, trigram case "isbn": columnQuerys = append(columnQuerys, columnq{"isbn", value}) case "author": - // TODO how do we do trigram on arrays?? - trigramQuerys = append(trigramQuerys, columnq{"array_to_string(authors, ' ')", value}) + trigramQuerys = append(trigramQuerys, columnq{"text(authors)", value}) case "title": trigramQuerys = append(trigramQuerys, columnq{"title", value}) case "contributor": @@ -215,9 +214,9 @@ func buildQuery(query string) (textQuery string, columnQuerys []columnq, trigram case "publisher": trigramQuerys = append(trigramQuerys, columnq{"publisher", value}) case "subject": - trigramQuerys = append(trigramQuerys, columnq{"array_to_string(tags, ' ')", value}) + trigramQuerys = append(trigramQuerys, columnq{"text(tags)", value}) case "tag": - trigramQuerys = append(trigramQuerys, columnq{"array_to_string(tags, ' ')", value}) + trigramQuerys = append(trigramQuerys, columnq{"text(tags)", value}) default: if len(textQuery) != 0 { textQuery += " | "