使用 PostgreSQL 跨多种不同模型进行 Django 全文搜索
Django full text search with PostgreSQL, across multiple different models
我需要跨多个不同模型执行 FTS。我想在搜索结果中获得任何模型类型。
我想按排名对结果进行排序,以获得最相关的结果。我可以 运行 一个一个地搜索,但不确定如何合并结果,尤其是保持排名相关性。
这是模型,它是 Making queries 手册页中的示例。
class Blog(models.Model):
name = models.CharField(max_length=100)
tagline = models.TextField()
class Author(models.Model):
name = models.CharField(max_length=200)
email = models.EmailField()
class Entry(models.Model):
blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
headline = models.CharField(max_length=255)
body_text = models.TextField()
pub_date = models.DateField()
mod_date = models.DateField()
authors = models.ManyToManyField(Author)
number_of_comments = models.IntegerField()
number_of_pingbacks = models.IntegerField()
rating = models.IntegerField()
您可以像这样将多个查询集合并为一个。
from itertools import chain
blogs = Blog.objects.filter(...)
authors = Author.objects.filter(...)
entries = Entry.objects.search(...)
chain = chain(blog_results, lesson_results, profile_results)
qs = sorted(chain, key=lambda instance: instance.pk, reverse=True)
我需要跨多个不同模型执行 FTS。我想在搜索结果中获得任何模型类型。
我想按排名对结果进行排序,以获得最相关的结果。我可以 运行 一个一个地搜索,但不确定如何合并结果,尤其是保持排名相关性。
这是模型,它是 Making queries 手册页中的示例。
class Blog(models.Model):
name = models.CharField(max_length=100)
tagline = models.TextField()
class Author(models.Model):
name = models.CharField(max_length=200)
email = models.EmailField()
class Entry(models.Model):
blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
headline = models.CharField(max_length=255)
body_text = models.TextField()
pub_date = models.DateField()
mod_date = models.DateField()
authors = models.ManyToManyField(Author)
number_of_comments = models.IntegerField()
number_of_pingbacks = models.IntegerField()
rating = models.IntegerField()
您可以像这样将多个查询集合并为一个。
from itertools import chain
blogs = Blog.objects.filter(...)
authors = Author.objects.filter(...)
entries = Entry.objects.search(...)
chain = chain(blog_results, lesson_results, profile_results)
qs = sorted(chain, key=lambda instance: instance.pk, reverse=True)