2016-05-16 23:19 GMT+12:00 Rafael Fialho <[email protected]>:

> Você pode desacentuar e minimizar o contéudo passado como parâmetro e
>>> manter o LIKE.
>>>
>>> `WHERE lower(functionDesacentua(col)) LIKE
>>> lower(functionDesacentua(texto)) || '%'`
>>>
>>>
>>
>> O meu problema aqui é que o LIKE é case-sensitive... ou seja.. estou
>> pesquisando por RYAN  SHOWER mas não sei se essas palavras estão em
>> maiúscula ou minúscula... portanto.. o LIKE me retorna 0 rows.
>>
>
> Bom dia!
> Pois é justamente pra isso que os dois "lower()" são utilizados, assim
> estarás convertendo o texto para lower case e o campo a ser pesquisado
> também, eliminando o trabalho do ilike, podendo utilizar like, pois a
> pesquisa funcionará mesmo sendo case sensitive.
> Pra isso, o índice também precisa ser criado com lower(col), ou qualquer
> outra transformação non-volatile que o campo sofra.
>
>
Certo. Obrigado, Rafael.

*Nova query: (O clientid está diferente apenas por motivos de WARM data)*

> SELECT DISTINCT title
>                 FROM public.ja_jobs WHERE lower(title) LIKE lower('RYAN
> SHOWER')
>                 AND clientid = 31239
>                 AND time_job > 1457826264
>                 order BY title
> limit 10;


*Index:*

> CREATE INDEX CONCURRENTLY  ON public.ja_jobs (clientid, lower(title)
> varchar_pattern_ops, time_job);



Desse modo está funcionando perfeitamente bem. E a query, de quase 3
segundos passou à ser executada em 300ms.

Entretanto, tive que deixar o DISTINCT. Mas isto não afetou a performance.


Obrigado.
Lucas
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a