jmn*_*jmn 7 django postgresql full-text-search django-rest-framework
如何使用PostgreSQL全文搜索在Django 1.11中创建搜索结果页面,其中搜索的术语会突出显示?
即使django不支持postgresql的ts_headline功能.您可以手动将其作为函数应用于QuerySet以进行注释.
我们需要额外的功能来使用django ORM.以下是ts_headline的示例.[此示例函数的original_source链接在此处 ]
标题功能样本:
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)
Run Code Online (Sandbox Code Playgroud)
使用上面的函数,您可以在QuerySet上使用它来进行注释
class Video(Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
title = models.CharField(max_length=128, verbose_name="Title")
Run Code Online (Sandbox Code Playgroud)
过滤对象
Video.objects.filter(filter_query)
Run Code Online (Sandbox Code Playgroud)
filter_query是一个Q()over title filter_query = Q(title__contains = term)
带标题数据的注释
Video.objects.filter(filter_query).annotate(title_highlight=Headline(F('title'), text_search_query))
Run Code Online (Sandbox Code Playgroud)
ts_headline直接从文档而不是从ts_vector获取输入,因此我们必须传递有关它应该访问哪个字段以及它应该在其上执行哪些SearchQuery的信息.
text_Search_query是与filter_query相同的输入的SearchQuery对象text_search_query = SearchQuery(term)
现在注释之后,这个查询集在所有名为title_highlight的对象中都包含一个额外的字段,它包含你想要的结果:
these <b>loans</b> not being repaired
从注释字段中获取值
使用values_listQuerySet,您可以从这些带注释的字段中获取值.
最终代码:
Video.objects.filter(filter_query).annotate(title_highlight=Headline(F('title'), text_search_query)).values_from('title','title_highlight')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1013 次 |
| 最近记录: |