Как использовать SearchHeadline с SearchVector для нескольких полей
Мне нужен поиск, который ищет по нескольким полям и возвращает "заголовок", который выделяет совпадающие слова. Насколько я понимаю, SearchVector подходит для поиска по нескольким полям. Но все примеры SearchHeadline, которые я видел, используют только одно поле! Как лучше всего использовать SearchHeadline с несколькими полями? Например, это работает так:
return (
Author.objects
.annotate(search_vectors=SearchVector('name', 'location'), )
.filter(search_vectors=SearchQuery(search_string))
)
Легко. Значит, следующим шагом будет добавление SearchHeadline... Вот моя догадка, но она вызывает ошибку в PostgreSQL:
return (
Author.objects
.annotate(search_vectors=SearchVector('name', 'location'), )
.annotate(headline=SearchHeadline(
SearchVector('name', 'location'),
SearchQuery(search_string),
start_sel='<strong>', stop_sel='</strong>'))
.filter(search_vectors=SearchQuery(search_string))
)
Ошибка:
Traceback (most recent call last):
File "/vagrant/venv/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
psycopg2.errors.UndefinedFunction: function ts_headline(tsvector, tsquery, unknown) does not exist
LINE 1: ...app_author"."location", '')) AS "search_vectors", ts_headlin...
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
Разве SearchVector() не является допустимым выражением?
Использование Concat() делает свою работу, но это не позволяет мне использовать встроенные возможности индексации ts_vector. Это кажется мне халтурным решением.
return (
Author.objects
.annotate(search_vectors=SearchVector('name', 'location'), )
.annotate(headline=SearchHeadline(
Concat(F('name'), Value(' '), F('location')),
SearchQuery(search_string),
start_sel='<strong>', stop_sel='</strong>'))
.filter(search_vectors=SearchQuery(search_string))
)
Какой лучший способ сделать это?