Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django PostgreSQL FTS_Django_Python 3.x_Postgresql_Full Text Search - Fatal编程技术网

Django PostgreSQL FTS

Django PostgreSQL FTS,django,python-3.x,postgresql,full-text-search,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(model

我正在尝试使用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()
类文档(models.Model):
name=models.Charfield(最大长度=1024,默认值=“”)
text=models.TextField()
类文档附件(models.Model):
属于=models.ForeignKey('Document',related\u name='attachments',在\u delete=models.CASCADE上)
name=models.Charfield(最大长度=1024,默认值=“”)
image=models.ImageField()
我想在字段
Document.name
Document.text
DocumentAttachment.name
上使用FTS。而且,为用户提供匹配字符串的标记(其中
model.field
)也很好

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

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

这是在模型上使用PostgreSQL在Django中执行的最简单的代码:

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')
有关在Django中与PostgreSQL一起使用的所有基本文档,您可以使用官方文档:“”

如果你想进一步深化,你可以阅读我写的一篇关于这个主题的文章: