Search code examples
djangopostgresqlfull-text-search

Django full text search with PostgreSQL, across multiple different models


I need to perform FTS across multiple different models. I want to get any model type in search result.

I would like to sort results by rank, to get most relevant result. I can run search one by one, but not sure how can I combine results, especially preserving rank relevancy.

Here are models, its an example from Making queries manual page.

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()

Solution

  • You can combine your multiple querysets into one with something like this.

    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)