Opened 5 years ago

Closed 5 years ago

#31340 closed New feature (fixed)

Improve expression support for __search lookup and SearchQuery

Reported by: Baptiste Mispelon Owned by: Baptiste Mispelon
Component: contrib.postgres Version: dev
Severity: Normal Keywords:
Cc: Triage Stage: Ready for checkin
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

(not sure whether to categorize this as a bug or a new feature)

I've been trying to implement some kind of reverse full text search where I store keywords in the database and I want to query models whose keywords would match a given piece of text.

Here's a simplified model of what I'm working with:

class SavedSearch(models.Model):
    keywords = models.TextField()

    def __str__(self):
        return self.keywords

I've managed to achieve what I want in the case of the default search configuration using annotation and wrapping things with Value or Cast:

# This works
search_query = Cast('keywords', output_field=SearchQueryField())
search_vector = SearchVector(Value("lorem ipsum ...", output_field=TextField()))
qs = SavedSearch.objects.annotate(search=search_vector).filter(search=search_query)

But if I want to use a custom search configuration, things don't work anymore:

# This doesn't work (can't adapt type 'F')
search_query = SearchQuery(F('keywords'), config='english', search_type='plain')
search_vector = SearchVector(Value("lorem ipsum ...", output_field=TextField()))
qs = SavedSearch.objects.annotate(search=search_vector).filter(search=search_query)

I'm not very familiar with the inner workings of Lookup objects but I did some digging and I think I came up with a fix which involved fixing two separate issues:

1) SearchQuery doesn't currently support anyting other than plain values (str). Fixing this required changing both resolve_expression() and as_sql().
2) the __search lookup doesn't support things like F objects because of it assumes that any value with a resolve_expression method must be a SearchQuery object.

Change History (6)

comment:1 by Baptiste Mispelon, 5 years ago

comment:2 by Simon Charette, 5 years ago

Triage Stage: UnreviewedAccepted

comment:3 by Mariusz Felisiak, 5 years ago

Owner: set to Baptiste Mispelon
Status: newassigned

comment:4 by Mariusz Felisiak <felisiak.mariusz@…>, 5 years ago

In dd704c6:

Refs #31340 -- Simplified SearchQuery by making it subclass Func.

comment:5 by Mariusz Felisiak, 5 years ago

Triage Stage: AcceptedReady for checkin
Version: 3.0master

comment:6 by Mariusz Felisiak <felisiak.mariusz@…>, 5 years ago

Resolution: fixed
Status: assignedclosed

In 3baf92cf:

Fixed #31340 -- Allowed query expressions in SearchQuery.value and search lookup.

Note: See TracTickets for help on using tickets.
Back to Top