#28852: Search in admin can't use index when several fields are in `search_fields` ------------------------------------------------+------------------------ Reporter: Jonathan Sundqvist | Owner: nobody Type: Cleanup/optimization | Status: new Component: contrib.admin | Version: master Severity: Normal | Keywords: search Triage Stage: Unreviewed | Has patch: 0 Needs documentation: 0 | Needs tests: 0 Patch needs improvement: 0 | Easy pickings: 0 UI/UX: 0 | ------------------------------------------------+------------------------ There are a couple of issues with the current implementation of search. If you have several fields like the following example.
{{{ class MyAdmin(model.ModelAdmin): search_fields = ['=field_1', '@field_2'] }}} You'll never be able to use any of the indexes that may exist on those fields, and if you were to remove `field_1` you would still not be able to use any index on the full text search index for `field_2`. If you have two or more fields in search fields you'll end up with a where statement that uses OR, and the index won't be used. In the case of a full text index you need to define the index with the appropriate config for the ts_vector. (See https://www.postgresql.org/docs/current/static /textsearch-tables.html#TEXTSEARCH-TABLES-INDEX). The current implementation uses `__search` (https://github.com/django/django/blob/master/django/contrib/admin/options.py#L945) which ignores a specific config. So the index won't be used during the query. To accomodate a config for a full text search I would suggest using `@english@field_2`. Then you could split on '@' and use a SearchVector and SearchQuery with the config `english`. To make it possible to use index when several fields are defined in `search_fields`, instead of using OR. Make several querysets and do a union on all them. That way it will execute the query using the index. -- Ticket URL: <https://code.djangoproject.com/ticket/28852> Django <https://code.djangoproject.com/> The Web framework for perfectionists with deadlines. -- You received this message because you are subscribed to the Google Groups "Django updates" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-updates+unsubscr...@googlegroups.com. To post to this group, send email to django-updates@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/django-updates/053.4ed4a49c9b7c607ab016f63d584ede76%40djangoproject.com. For more options, visit https://groups.google.com/d/optout.