|
Bom dia,
Gostaria de saber se o Tsearch tem como localizar um texto que comece com uma determinada palavra com se fosse o like 'POSTGRESQL 8.2%'. Porque se eu uso idxfts @@ to_tsquery('POSTGRESQL&8.2') retorna tb resultados como: POSTGRESQL 8.2 TUTORIAL SQL POSTGRESQL 8.2 INDICES POSTGRESQL 8.2 POSTGRESQL 8.2 SLONY Eu gostaria que retorna-se: POSTGRESQL 8.2 TUTORIAL POSTGRESQL 8.2 SLONY Uso o postgresql 8.2.7. |
|
Mateus, essa funcionalidade foi adicionada na versão 8.4
O Euler deu o seguinte exemplo de utilização: euler=# create table foo (a tsvector); CREATE TABLE euler=# insert into foo select 'euler taveira de oliveira'::tsvector from generate_series(1, 1000); INSERT 0 1000 euler=# insert into foo select 'jorge vilela'::tsvector from generate_series(1, 100); INSERT 0 100 euler=# create index fooi on foo using gin (a); CREATE INDEX euler=# select * from foo where a @@ 'vile:*' limit 5; a ------------------ 'jorge' 'vilela' 'jorge' 'vilela' 'jorge' 'vilela' 'jorge' 'vilela' 'jorge' 'vilela' (5 registros) euler=# explain analyze select * from foo where a @@ 'vile:*'; Aqui eu já estou utilizando a versão 8.4 (Justamente por esse motivo), porém, ainda tenho algumas dúvidas sobre o TSearch. Por exemplo:
O Euler apresentou o ":*" como coringa para término ou começo de string, mas eu não consigo utilizá-lo em ambos os casos. Veja:
select descricao from tag where to_tsvector(descricao) @@ to_tsquery('MONIT:*');
- monitor - para monitor lcd Porém:
select descricao from tag where to_tsvector(descricao) @@ to_tsquery('*TOR'); Não retorna nada '*:TOR' retorna erro de sintaxe... Alguém sabe dizer se é isso mesmo, se ele só possui implementação para o fim dos termos de busca ou eu estou fazendo errado? Jorge
2009/6/15 mateusgra <[hidden email]>
_______________________________________________ pgbr-geral mailing list [hidden email] https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral |
|
E o 8.2 não tem nada parecido com isso.
|
|
Ola turma.
Alguém leu algum artigo sobre desempenho na versão 8.4, das novidades, teste comparativos com a versão 8.3? Abraços. At. Leandro Müller Analista de Sistemas _______________________________________________ pgbr-geral mailing list [hidden email] https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral |
|
In reply to this post by Mateus Gra
mateusgra escreveu:
> Gostaria de saber se o Tsearch tem como localizar um texto que comece com > uma determinada palavra com se fosse o like 'POSTGRESQL 8.2%'. > Você _não_ entendeu o conceito de busca textual [1] (aka text _search_); quando se transforma um texto no tipo tsvector, este "perde" posicionamento e "ganha" peso (relevância) e proximidade. Assim, sem posicionamento é impossível fazer uma comparação com prefixo do texto. O uso do :* nos deixa comparar com o prefixo de *cada* lexema. O que você precisa é de expressões regulares [2]. Veja: euler=# create table bar (a text); CREATE TABLE euler=# insert into bar select 'euler taveira de oliveira' from generate_series(1, 10); INSERT 0 10 euler=# insert into bar select 'jorge vilela' from generate_series(1, 5000); INSERT 0 5000 euler=# create index bari on bar (a text_pattern_ops); CREATE INDEX euler=# select * from bar where a ~ '^euler'; a --------------------------- euler taveira de oliveira euler taveira de oliveira euler taveira de oliveira euler taveira de oliveira euler taveira de oliveira euler taveira de oliveira euler taveira de oliveira euler taveira de oliveira euler taveira de oliveira euler taveira de oliveira (10 rows) euler=# explain analyze select * from bar where a ~ '^euler'; QUERY PLAN --------------------------------------------------------------------------------------------------------------------- Bitmap Heap Scan on bar (cost=4.35..25.17 rows=10 width=13) (actual time=0.101..0.224 rows=10.00 loops=1.00) Filter: (a ~ '^euler'::text) -> Bitmap Index Scan on bari (cost=0.00..4.35 rows=10 width=0) (actual time=0.055..0.055 rows=10.00 loops=1.00) Index Cond: ((a ~>=~ 'euler'::text) AND (a ~<~ 'eules'::text)) Total runtime: 0.334 ms (5 rows) [1] http://www.postgresql.org/docs/8.4/static/textsearch.html [2] http://www.postgresql.org/docs/8.4/static/functions-matching.html#FUNCTIONS-POSIX-REGEXP -- Euler Taveira de Oliveira http://www.timbira.com/ _______________________________________________ pgbr-geral mailing list [hidden email] https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral |
|
In reply to this post by jorge vilela
Jorge Vilela escreveu:
> Aqui eu já estou utilizando a versão 8.4 (Justamente por esse motivo), Eu *não* aconselharia utilizar a 8.4 ainda. Podem vir a aparecer bugs que precisam mudar o formato dos arquivos de dados (é claro que essa possibilidade é baixa já que estamos lançando a RC1 mas...). > O Euler apresentou o ":*" como coringa para término ou começo de string, > mas eu não consigo utilizá-lo em ambos os casos. Veja: > Você *não* entendeu o que o :* faz [1]. O curinga :* permite fazer uma busca pelo prefixo mas *não* pelo sufixo (ainda). Afinal de contas, quem vai pesquisar no Google por 'tor' para obter 'monitor'? [1] http://www.postgresql.org/docs/8.4/static/datatype-textsearch.html#DATATYPE-TSQUERY -- Euler Taveira de Oliveira http://www.timbira.com/ _______________________________________________ pgbr-geral mailing list [hidden email] https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral |
|
In reply to this post by Leandro Muller
Leandro Müller escreveu:
[Pare de "sequestrar" os assuntos; se é um assunto _novo_ *não* clique em responder e apague o conteúdo da mensagem, ao invés disse crie uma mensagem nova. Isso _bagunça_ o histórico da lista.] > Alguém leu algum artigo sobre desempenho na versão 8.4, das novidades, teste > comparativos com a versão 8.3? > O único teste que vi sobre o desempenho do 8.4 foram [1][2]. Quanto as novidades, temos a palestra [3] do Robert no PGCon e a da Fernando Ike [4] (que acontecerá daqui 2 semanas no FISL). Temos uma matriz [5] que mostra a evolução das funcionalidades no PostgreSQL comparado com as versões anteriores. [1] http://www.kaltenbrunner.cc/blog/index.php?/archives/26-Benchmarking-8.4-Chapter-1Read-Only-workloads.html [2] http://www.pgcon.org/2009/schedule/events/124.en.html [3] http://www.pgcon.org/2009/schedule/events/179.en.html [4] http://fisl.softwarelivre.org/10/papers/pub/ [5] http://www.postgresql.org/about/featurematrix -- Euler Taveira de Oliveira http://www.timbira.com/ _______________________________________________ pgbr-geral mailing list [hidden email] https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral |
|
In reply to this post by Euler Taveira de Oliveira
E se eu quiser pesquisar que comece com Euler e termine com oliveira. Indice com _pattern_ops so aceita pesquisa no inicio do campo. E indice gist não aceita indice composto. Não consegui resolver esse problema ? Se puder dar um ideia. Euler Taveira de Oliveira-2 wrote: > > mateusgra escreveu: >> Gostaria de saber se o Tsearch tem como localizar um texto que comece com >> uma determinada palavra com se fosse o like 'POSTGRESQL 8.2%'. >> > Você _não_ entendeu o conceito de busca textual [1] (aka text _search_); > quando se transforma um texto no tipo tsvector, este "perde" > posicionamento e > "ganha" peso (relevância) e proximidade. Assim, sem posicionamento é > impossível fazer uma comparação com prefixo do texto. O uso do :* nos > deixa > comparar com o prefixo de *cada* lexema. > > O que você precisa é de expressões regulares [2]. Veja: > > euler=# create table bar (a text); > CREATE TABLE > euler=# insert into bar select 'euler taveira de oliveira' from > generate_series(1, 10); > INSERT 0 10 > euler=# insert into bar select 'jorge vilela' from generate_series(1, > 5000); > INSERT 0 5000 > euler=# create index bari on bar (a text_pattern_ops); > CREATE INDEX > euler=# select * from bar where a ~ '^euler'; > a > --------------------------- > euler taveira de oliveira > euler taveira de oliveira > euler taveira de oliveira > euler taveira de oliveira > euler taveira de oliveira > euler taveira de oliveira > euler taveira de oliveira > euler taveira de oliveira > euler taveira de oliveira > euler taveira de oliveira > (10 rows) > > euler=# explain analyze select * from bar where a ~ '^euler'; > QUERY PLAN > > --------------------------------------------------------------------------------------------------------------------- > Bitmap Heap Scan on bar (cost=4.35..25.17 rows=10 width=13) (actual > time=0.101..0.224 rows=10.00 loops=1.00) > Filter: (a ~ '^euler'::text) > -> Bitmap Index Scan on bari (cost=0.00..4.35 rows=10 width=0) > (actual > time=0.055..0.055 rows=10.00 loops=1.00) > Index Cond: ((a ~>=~ 'euler'::text) AND (a ~<~ 'eules'::text)) > Total runtime: 0.334 ms > (5 rows) > > > [1] http://www.postgresql.org/docs/8.4/static/textsearch.html > [2] > http://www.postgresql.org/docs/8.4/static/functions-matching.html#FUNCTIONS-POSIX-REGEXP > > > -- > Euler Taveira de Oliveira > http://www.timbira.com/ > _______________________________________________ > pgbr-geral mailing list > [hidden email] > https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral > > -- View this message in context: http://www.nabble.com/TSearch-palavar-Inicial-tp24035502p24042073.html Sent from the PostgreSQL - Brasil mailing list archive at Nabble.com. _______________________________________________ pgbr-geral mailing list [hidden email] https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral |
|
In reply to this post by Euler Taveira de Oliveira
Até agora está bem estável o 8.4... Muito bons os links sugeridos pelo Euler, vou dar uma estudada.
Obrigado 2009/6/15 mateusgra <[hidden email]>
_______________________________________________ pgbr-geral mailing list [hidden email] https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral |
|
In reply to this post by Euler Taveira de Oliveira
E se eu quiser pesquisar que comece com Euler e termine com oliveira. Indice com _pattern_ops so aceita pesquisa no inicio do campo. E indice gist não aceita indice composto. Não consegui resolver esse problema ? Se puder dar um ideia. Euler Taveira de Oliveira-2 wrote: > > mateusgra escreveu: >> Gostaria de saber se o Tsearch tem como localizar um texto que comece com >> uma determinada palavra com se fosse o like 'POSTGRESQL 8.2%'. >> > Você _não_ entendeu o conceito de busca textual [1] (aka text _search_); > quando se transforma um texto no tipo tsvector, este "perde" > posicionamento e > "ganha" peso (relevância) e proximidade. Assim, sem posicionamento é > impossível fazer uma comparação com prefixo do texto. O uso do :* nos > deixa > comparar com o prefixo de *cada* lexema. > > O que você precisa é de expressões regulares [2]. Veja: > > euler=# create table bar (a text); > CREATE TABLE > euler=# insert into bar select 'euler taveira de oliveira' from > generate_series(1, 10); > INSERT 0 10 > euler=# insert into bar select 'jorge vilela' from generate_series(1, > 5000); > INSERT 0 5000 > euler=# create index bari on bar (a text_pattern_ops); > CREATE INDEX > euler=# select * from bar where a ~ '^euler'; > a > --------------------------- > euler taveira de oliveira > euler taveira de oliveira > euler taveira de oliveira > euler taveira de oliveira > euler taveira de oliveira > euler taveira de oliveira > euler taveira de oliveira > euler taveira de oliveira > euler taveira de oliveira > euler taveira de oliveira > (10 rows) > > euler=# explain analyze select * from bar where a ~ '^euler'; > QUERY PLAN > > --------------------------------------------------------------------------------------------------------------------- > Bitmap Heap Scan on bar (cost=4.35..25.17 rows=10 width=13) (actual > time=0.101..0.224 rows=10.00 loops=1.00) > Filter: (a ~ '^euler'::text) > -> Bitmap Index Scan on bari (cost=0.00..4.35 rows=10 width=0) > (actual > time=0.055..0.055 rows=10.00 loops=1.00) > Index Cond: ((a ~>=~ 'euler'::text) AND (a ~<~ 'eules'::text)) > Total runtime: 0.334 ms > (5 rows) > > > [1] http://www.postgresql.org/docs/8.4/static/textsearch.html > [2] > http://www.postgresql.org/docs/8.4/static/functions-matching.html#FUNCTIONS-POSIX-REGEXP > > > -- > Euler Taveira de Oliveira > http://www.timbira.com/ > _______________________________________________ > pgbr-geral mailing list > [hidden email] > https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral > > -- View this message in context: http://www.nabble.com/TSearch-palavar-Inicial-tp24035502p24042097.html Sent from the PostgreSQL - Brasil mailing list archive at Nabble.com. _______________________________________________ pgbr-geral mailing list [hidden email] https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral |
|
In reply to this post by Euler Taveira de Oliveira
mateusgra escreveu:
> E se eu quiser pesquisar que comece com Euler e termine com oliveira. > Indice com _pattern_ops so aceita pesquisa no inicio do campo. A documentação é o seu melhor amigo. Você testou o que mandei? É claro que ele usa o índice; só não vai utilizar se você fizer uma pesquisa com sufixo. euler=# select * from bar where a ~ '^euler.*oliveira'; a --------------------------- euler taveira de oliveira euler taveira de oliveira euler taveira de oliveira euler taveira de oliveira euler taveira de oliveira euler taveira de oliveira euler taveira de oliveira euler taveira de oliveira euler taveira de oliveira euler taveira de oliveira (10 rows) euler=# explain analyze select * from bar where a ~ '^euler.*oliveira'; QUERY PLAN --------------------------------------------------------------------------------------------------------------------- Bitmap Heap Scan on bar (cost=4.35..25.17 rows=10 width=13) (actual time=0.123..0.448 rows=10.00 loops=1.00) Filter: (a ~ '^euler.*oliveira'::text) -> Bitmap Index Scan on bari (cost=0.00..4.35 rows=10 width=0) (actual time=0.054..0.054 rows=10.00 loops=1.00) Index Cond: ((a ~>=~ 'euler'::text) AND (a ~<~ 'eules'::text)) Total runtime: 0.562 ms (5 rows) > E indice gist não aceita indice composto. > Quem falou em índice GiST? É um B-Tree mesmo. > Não consegui resolver esse problema ? > Faltou ler as referências que enviei. :( Se você não conhece o poder das funcionalidades do PostgreSQL fica difícil você saber se algo se encaixa na sua solução. -- Euler Taveira de Oliveira http://www.timbira.com/ _______________________________________________ pgbr-geral mailing list [hidden email] https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral |
|
O que vc disse esta correto. So que agora estou com outro problema esta muito lento.
A tabela tem 200 Milhoes de registros desses 200 tem 50 milhoes com descrição parecida para cada 1 registro pode ter 70 mil registros que podem ser retornados mesmo com limit 10 esta muito lento para determinadas descrições: Exemplo: Se tiver 70 mil variações de Euler Taveira demora bastante para lista os 10 primeiros.
|
|
mateusgra escreveu:
> Se tiver 70 mil variações de Euler Taveira demora bastante para lista os > 10 primeiros. > Qual o EXPLAIN ANALYZE da consulta? -- Euler Taveira de Oliveira http://www.timbira.com/ _______________________________________________ pgbr-geral mailing list [hidden email] https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral |
|
explain analyze select * from bar where a ~ '^MARIA DAS.*GRACAS' LIMIT 10;
QUERY PLAN ------------------------------------------------------------------------------------------------------------------------------------ Limit (cost=0.00..22.86 rows=1 width=62) (actual time=115.751..468760.019 rows=10 loops=1) -> Index Scan using bari on bar (cost=0.00..22.86 rows=1 width=62) (actual time=115.739..468759.911 rows=10 loops=1) Index Cond: (((a)::text ~>=~ 'MARIA DAS'::character varying) AND ((a)::text ~<~ 'MARIA DAT'::character varying)) Filter: ((a)::text ~ '^MARIA DAS.*GRACAS'::text) Total runtime: 468760.159 ms (5 rows)
|
|
mateusgra escreveu:
> explain analyze select * from bar where a ~ '^MARIA DAS.*GRACAS' LIMIT 10; > QUERY PLAN > ------------------------------------------------------------------------------------------------------------------------------------ > Limit (cost=0.00..22.86 rows=1 width=62) (actual time=115.751..468760.019 > rows=10 loops=1) > -> Index Scan using bari on bar (cost=0.00..22.86 rows=1 width=62) > (actual time=115.739..468759.911 rows=10 loops=1) > Index Cond: (((a)::text ~>=~ 'MARIA DAS'::character varying) AND > ((a)::text ~<~ 'MARIA DAT'::character varying)) > Filter: ((a)::text ~ '^MARIA DAS.*GRACAS'::text) > Total runtime: 468760.159 ms > (5 rows) > excessivo de processamento no Limit. Qual o tamanho desta tabela _bar_ e do índice _bari_? Qual a versão do PostgreSQL e SO? Qual o tamanho do seu _shared buffers_? Esse índice foi criado recentemente? Se não foi, um REINDEX diminui o tempo de processamento? -- Euler Taveira de Oliveira http://www.timbira.com/ _______________________________________________ pgbr-geral mailing list [hidden email] https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral |
|
Postgresql 8.2.7, FreeBSD 7.1
tabela bar = 14GB Indice bari = 7264 MB shared_buffers =512MB O indice foi cirado Hj as 08:00
|
|
mateusgra escreveu:
> Postgresql 8.2.7, FreeBSD 7.1 ^^^^^^^ Sugiro atualizar para 8.2.13; vários bugs foram corrigidos e, você não precisa mexer nos dados, ou seja, é necessário apenas atualizar os binários. > tabela bar = 14GB > Indice bari = 7264 MB > shared_buffers =512MB ^^^^^^^ Aha. Por que o valor do _shared buffers_ está tão baixo? Quanto de memória tem disponível? É um servidor dedicado ao PostgreSQL? -- Euler Taveira de Oliveira http://www.timbira.com/ _______________________________________________ pgbr-geral mailing list [hidden email] https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral |
|
Acho que, talvez não seja a unica justificativa, mas você com 14GB em uma só tabela, mais 7GB de índice em apenas 512mb de shared_buffers... Talvez seja esse o problema, o acesso ao disco é constante não é?
2009/6/17 Euler Taveira de Oliveira <[hidden email]> mateusgra escreveu: _______________________________________________ pgbr-geral mailing list [hidden email] https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral |
|
In reply to this post by Euler Taveira de Oliveira
Pelo que li na documentação o ideal é usar 1/3 da ram para o shared_buffers. É um servidor dedicado ao postgresql e tem 4GB de ram com 200 conexoes simultaneas.
|
|
mateusgra escreveu:
> Pelo que li na documentação o ideal é usar 1/3 da ram para o shared_buffers. > É um servidor dedicado ao postgresql e tem 4GB de ram com 200 conexoes > simultaneas. > Não tem isso de ideal (é uma maneira "didática" que usamos para aconselhar usuários com menos experiência ;). Eu não conheço a sua aplicação, mas utilizar apenas 8% da memória para _shared buffers_ (quando se tem consultas que utilizam mais do que isso -- 7GB só um índice!), *não* é o ideal. Meu chute inicial seria pelo menos 768 MB ou mesmo 1GB. Mas para ser mais preciso é necessário saber mais sobre o seu ambiente tais como tamanho dos objetos e frequência de uso deles (aka pg_stat*). E mais, dependendo do tamanho da sua base e se o uso desse índice for algo frequente, eu recomendo que compre mais memória para a máquina. -- Euler Taveira de Oliveira http://www.timbira.com/ _______________________________________________ pgbr-geral mailing list [hidden email] https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral |
| Powered by Nabble | Edit this page |
