mirror of
https://github.com/bookwyrm-social/bookwyrm.git
synced 2024-11-27 03:51:08 +00:00
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:
parent
04c51a6598
commit
deb1b9943a
2 changed files with 10 additions and 6 deletions
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue