Uses simple dictionary as backup for english dictionary

Creates search vectors with stop words if the english version is empty,
and uses a SearchQuery OR with simple and english on the view side.
This commit is contained in:
Mouse Reeve 2021-06-24 10:56:27 -07:00
parent 04c51a6598
commit deb1b9943a
2 changed files with 10 additions and 6 deletions

View file

@ -2,7 +2,7 @@
from functools import reduce from functools import reduce
import operator import operator
from django.contrib.postgres.search import SearchRank from django.contrib.postgres.search import SearchRank, SearchQuery
from django.db.models import OuterRef, Subquery, F, Q from django.db.models import OuterRef, Subquery, F, Q
from bookwyrm import models from bookwyrm import models
@ -141,6 +141,7 @@ def search_identifiers(query, *filters):
def search_title_author(query, min_confidence, *filters): def search_title_author(query, min_confidence, *filters):
"""searches for title and author""" """searches for title and author"""
query = SearchQuery(query, config="simple") | SearchQuery(query, config="english")
results = ( results = (
models.Edition.objects.annotate(rank=SearchRank("search_vector", query)) models.Edition.objects.annotate(rank=SearchRank("search_vector", query))
.filter(*filters, search_vector=query, rank__gt=min_confidence) .filter(*filters, search_vector=query, rank__gt=min_confidence)

View file

@ -39,17 +39,20 @@ class Migration(migrations.Migration):
CREATE FUNCTION book_trigger() RETURNS trigger AS $$ CREATE FUNCTION book_trigger() RETURNS trigger AS $$
begin begin
new.search_vector := new.search_vector :=
setweight(to_tsvector('pg_catalog.english', coalesce(new.title, '')), 'A') || coalesce(
setweight(to_tsvector('pg_catalog.english', coalesce(new.subtitle, '')), 'B') || NULLIF(setweight(to_tsvector('english', coalesce(new.title, '')), 'A'), ''),
setweight(to_tsvector('pg_catalog.english', coalesce(new.series, '')), 'D') || setweight(to_tsvector('simple', coalesce(new.title, '')), 'A')
(SELECT setweight(to_tsvector('simple', coalesce(array_to_string(array_agg(bookwyrm_author.name), ' '), '')), 'C') ) ||
setweight(to_tsvector('english', coalesce(new.subtitle, '')), 'B') ||
(SELECT setweight(to_tsvector('simple', coalesce(array_to_string(array_agg(bookwyrm_author.name), ' '), '')), 'B')
FROM bookwyrm_book FROM bookwyrm_book
LEFT OUTER JOIN bookwyrm_book_authors LEFT OUTER JOIN bookwyrm_book_authors
ON bookwyrm_book.id = bookwyrm_book_authors.book_id ON bookwyrm_book.id = bookwyrm_book_authors.book_id
LEFT OUTER JOIN bookwyrm_author LEFT OUTER JOIN bookwyrm_author
ON bookwyrm_book_authors.author_id = bookwyrm_author.id ON bookwyrm_book_authors.author_id = bookwyrm_author.id
WHERE bookwyrm_book.id = new.id WHERE bookwyrm_book.id = new.id
); ) ||
setweight(to_tsvector('english', coalesce(new.series, '')), 'D');
return new; return new;
end end
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;