Make search vector building more robust

This commit is contained in:
Stefan Wehrmeyer 2022-03-21 19:19:13 +01:00
parent 07d5903da7
commit fc8dc8de6d

View file

@ -112,10 +112,14 @@ class GovernmentPlanManager(models.Manager):
def search(self, query, qs=None): def search(self, query, qs=None):
if not qs: if not qs:
qs = self.get_queryset() qs = self.get_queryset()
query = query.strip()
if not query: if not query:
return qs return qs
search_queries = [] search_queries = []
for q in query.split(): for q in query.split():
q = q.strip()
if not q:
continue
if WORD_RE.match(q): if WORD_RE.match(q):
sq = SearchQuery( sq = SearchQuery(
"{}:*".format(q), search_type="raw", config=self.SEARCH_LANG "{}:*".format(q), search_type="raw", config=self.SEARCH_LANG
@ -124,7 +128,10 @@ class GovernmentPlanManager(models.Manager):
sq = SearchQuery(q, search_type="plain", config=self.SEARCH_LANG) sq = SearchQuery(q, search_type="plain", config=self.SEARCH_LANG)
search_queries.append(sq) search_queries.append(sq)
if not search_queries:
return qs
search_query = functools.reduce(lambda a, b: a & b, search_queries) search_query = functools.reduce(lambda a, b: a & b, search_queries)
search_vector = self.get_search_vector() search_vector = self.get_search_vector()
qs = ( qs = (
qs.annotate(rank=SearchRank(search_vector, search_query)) qs.annotate(rank=SearchRank(search_vector, search_query))