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?