如何在Django 1.11中使用PostgreSQL全文搜索创建一个搜索结果页面,使得搜索的词语被高亮显示?
如何在Django 1.11中使用PostgreSQL全文搜索创建一个搜索结果页面,使得搜索的词语被高亮显示?
尽管Django不支持来自PostgreSQL的ts_headline功能,但您可以将其手动应用于QuerySet
上作为一个Function
进行注释:
我们需要额外的函数来操作Django ORM。这是一个使用ts_headline的示例代码。[此示例函数的原始来源链接在这里]
ts_headline函数示例:
from django.db import models
from django.contrib.postgres.search import Value, Func
class Headline(Func):
function = 'ts_headline'
def __init__(self, field, query, config=None, options=None, **extra):
expressions = [field, query]
if config:
expressions.insert(0, Value(config))
if options:
expressions.append(Value(options))
extra.setdefault('output_field', models.TextField())
super().__init__(*expressions, **extra)
使用上述函数,您可以在QuerySet上使用它进行注释。
class Video(Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
title = models.CharField(max_length=128, verbose_name="Title")
对象筛选
Video.objects.filter(filter_query)
filter_query是在标题上的Q()查询 filter_query = Q(title__contains=term)
使用标题数据进行注释
Video.objects.filter(filter_query).annotate(title_highlight=Headline(F('title'), text_search_query))
ts_headline 直接从文档中获取输入而不是从 ts_vector 中获取,所以我们必须传递关于它应该访问哪个字段以及应该在其中执行什么 SearchQuery 的信息。
text_Search_query 是具有与 filter_query 相同输入的 SearchQuery 对象 text_search_query = SearchQuery(term)
现在在注释之后,这个 queryset 将在所有对象中包含一个名为 title_highlight 的额外字段,其中将包含您想要的结果,如:
these <b>loans</b> not being repaired
从注释字段中获取值
使用 QuerySet 上的 values_list
可以获取这些注释字段的值。
最终代码:
Video.objects.filter(filter_query).annotate(title_highlight=Headline(F('title'), text_search_query)).values_from('title','title_highlight')
Headline(F('title'), text_search_query, options='HighlightAll=TRUE')
。 - Flimmfrom django.contrib.postgres.search import SearchHeadline
导入。 - xaxSearchHeadline
的类。你可以在 Github 上看到 其他类似的代码。