Django PostgreSQL FTS

时间:2018-06-18 08:26:03

标签: django python-3.x postgresql full-text-search

我正在尝试使用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.nameDocument.textDocumentAttachment.name上使用FTS。而且,为用户提供匹配字符串的标记(以及其中model.field)会很棒。

数据库预计将达到10 000多个文档,因此,据我所知,使用索引是一种很好的做法。

你能给我一些提示,如何实现这个? 我是否必须使用“类元”方法或创建具有聚合文本字段的新模型? 我是否必须使用TrigramSimilarity,以及如何使用?

1 个答案:

答案 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

如果您想进一步加深,可以阅读我写的关于该主题的文章

Full-Text Search in Django with PostgreSQL