Postgres не использует индекс trgm с Concat

Я создал триграммный индекс на полном имени, где full_name = first_name || ' ' || Last_name.

CREATE INDEX  "user_full_name_trgm"
ON "user" using gin (upper(first_name || ' ' || last_name) gin_trgm_ops);

Я использую django queryset для фильтрации по fullname.

queryset = queryset.annotate(full_name=Concat("first_name", Value(" "), "last_name"))
queryset = queryset.filter(full_name__istartswith=full_name)

который генерирует предложение WHERE как

WHERE (UPPER(CONCAT("user"."first_name", CONCAT(' ', "user"."last_name"))::text) LIKE UPPER('mike%')

Анализ explain показывает, что индекс не используется user_full_name_trgm. Однако когда я использую pipe для соединения строк, индекс используется.

WHERE (UPPER(first_name || ' ' || last_name) LIKE UPPER('mike%')

Как заставить запрос django использовать индекс? Могу ли я изменить query.annotate таким образом, чтобы он создавал sql запрос без Concat? Или могу ли я создать индекс таким образом, чтобы он использовался даже с concat?

Вернуться на верх