我正在尝试使用Django 2.0和PostgreSQL 9.6构建一个网站,其主要思想是使用户能够通过许多领域的全文搜索(FTS)工具搜索存储的文档。
例如,我有这样的模型:
class Document(models.Model):
name = models.Charfield(max_length=1024, default='<Empty>')
text = models.TextField()
class DocumentAttachment(models.Model):
belong_to = models.ForeignKey('Document', related_name='attachments', on_delete=models.CASCADE)
name = models.Charfield(max_length=1024, default='<Empty>')
image = models.ImageField()
我想在字段Document.name
,Document.text
,DocumentAttachment.name
上使用FTS。而且,为用户提供匹配字符串的标记(以及其中model.field
)会很棒。
数据库预计将达到10 000多个文档,因此,据我所知,使用索引是一种很好的做法。
你能给我一些提示,如何实现这个? 我是否必须使用“类元”方法或创建具有聚合文本字段的新模型? 我是否必须使用TrigramSimilarity,以及如何使用?
答案 0 :(得分:1)
这是在模型上使用PostgreSQL在Django中执行full-text search时最简单的代码:
from django.contrib.postgres.aggregates import StringAgg
from django.contrib.postgres.search import SearchVector
Document.objects.annotate(
search=(
SearchVector('name') +
SearchVector('text') +
SearchVector(StringAgg('attachments__name', delimiter=' ', distinct=True))
)
).filter(search='Test')
对于在PostgreSQL和Django中使用full-text search的所有基本文档,您可以使用官方文档:“ Full text search” >
如果您想进一步加深,可以阅读我写的关于该主题的文章: