MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

acelerando pesquisas de texto curinga


O planejador de consultas do PostgreSQL é inteligente, mas não uma IA. Para fazê-lo, use um índice em uma expressão use a exatamente a mesma forma de expressão na consulta.

Com um índice como este:
CREATE INDEX t_a_lower_idx ON t (lower(substring(a, 1, 4)));

Ou mais simples no PostgreSQL 9.1:
CREATE INDEX t_a_lower_idx ON t (lower(left(a, 4)));

Use esta consulta:
SELECT * FROM t WHERE lower(left(a, 4)) = 'abcd';

Que é 100% funcionalmente equivalente a:
SELECT * FROM t WHERE lower(a) LIKE 'abcd%'

Ou:
SELECT * FROM t WHERE a ILIKE 'abcd%'

Mas não :
SELECT * FROM t WHERE a LIKE 'abcd%'

Esta é uma consulta funcionalmente diferente e você precisa de um diferente índice:
CREATE INDEX t_a_idx ON t (substring(a, 1, 4));

Ou mais simples com o PostgreSQL 9.1:
CREATE INDEX t_a_idx ON t (left(a, 4));

E use esta consulta:
SELECT * FROM t WHERE left(a, 4) = 'abcd';

Termos de pesquisa ancorados à esquerda de comprimento variável


Insensível a maiúsculas e minúsculas. Índice:

Editar :Quase esqueci:se você executar seu banco de dados com qualquer outra localidade que não seja o padrão 'C', você precisa especifique a classe do operador explicitamente - text_pattern_ops no meu exemplo:
CREATE INDEX t_a_lower_idx
ON t (lower(left(a, <insert_max_length>)) text_pattern_ops);

Consulta:
SELECT * FROM t WHERE lower(left(a, <insert_max_length>)) ~~ 'abcdef%';

Pode utilizar o índice e é quase tão rápido quanto a variante com comprimento fixo.

Você pode estar interessado nesta postagem no dba.SE com mais detalhes sobre correspondência de padrões , especialmente a última parte sobre os operadores ~>=~ e ~<~ .