PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 Re : Général » Full text search et index GIN non utilisé » 27/04/2010 16:10:29

la valeur par defaut est 1!!!

J'ai lu dans ce post la petite subtilité : http://groups.google.com/group/pgsql.pe … 8c5f742a5b

Mais je n'ai pas trouvé plus d'explication !

#2 Re : Général » Full text search et index GIN non utilisé » 27/04/2010 15:32:46

J'ai lu qu'il était possible d'utiliser l'index en modifiant une information sue la fonction : 'ts_match_vq'.

J'ai executé : alter function ts_match_vq(tsvector,tsquery) cost 1000 ;

avant :

explain analyse select iddocument from documenttext where ftsdocument @@ to_tsquery('french_simple','patient') ;
"Seq Scan on documenttext  (cost=0.00..36388.93 rows=85948 width=8) (actual time=137.234..6004.683 rows=85948 loops=1)"
"  Filter: (ftsdocument @@ '''patient'''::tsquery)"
"Total runtime: 6072.820 ms"

après :

alter function ts_match_vq(tsvector,tsquery) cost 1000 ;
explain analyse select iddocument from documenttext where ftsdocument @@ to_tsquery('french_simple','patient') ;
"Bitmap Heap Scan on documenttext  (cost=95322.41..345663.89 rows=85948 width=8) (actual time=24.316..135.363 rows=85948 loops=1)"
"  Recheck Cond: (ftsdocument @@ '''patient'''::tsquery)"
"  ->  Bitmap Index Scan on idx_gin  (cost=0.00..95300.92 rows=85948 width=0) (actual time=19.261..19.261 rows=85948 loops=1)"
"        Index Cond: (ftsdocument @@ '''patient'''::tsquery)"
"Total runtime: 193.150 ms"

L'index est utilisé et les temps sont plus que bon!!!!! 193 ms pour presque 90000 lignes wink

Cependant est-ce une bonne idée de modifié le cout de la fonction? Peut-il y a voir des disfonctionnement de Postgres?

#3 Re : Général » Full text search et index GIN non utilisé » 22/04/2010 14:08:58

Je comprends bien mais je fais comment alors pour les mots qui sont présents dans beaucoup de lignes?

#5 Re : Général » Full text search et index GIN non utilisé » 22/04/2010 09:19:11

J'ai fait la modification de la valeur mais j'ai exactement le même problème pour 'maint' ou 'patient', j'ai toujours des temps importants. Cela a quand même modifier certaines choses.
Maintenant pour 'mai' :

"Bitmap Heap Scan on documenttext  (cost=3791.57..10360.00 rows=4934 width=8) (actual time=2.149..44.116 rows=4934 loops=1)"
"  Output: iddocument"
"  Recheck Cond: (test @@ '''mai'''::tsquery)"
"  ->  Bitmap Index Scan on idx_gin  (cost=0.00..3790.34 rows=4934 width=0) (actual time=1.451..1.451 rows=4934 loops=1)"
"        Index Cond: (test @@ '''mai'''::tsquery)"
"Total runtime: 47.743 ms"

Il donne bien les bons résultats. Cependant pour 'main' :

"Bitmap Heap Scan on documenttext  (cost=3.34..5.35 rows=1 width=8) (actual time=0.476..7.855 rows=854 loops=1)"
"  Output: iddocument"
"  Recheck Cond: (test @@ '''main'''::tsquery)"
"  ->  Bitmap Index Scan on idx_gin  (cost=0.00..3.34 rows=1 width=0) (actual time=0.333..0.333 rows=854 loops=1)"
"        Index Cond: (test @@ '''main'''::tsquery)"
"Total runtime: 8.537 ms"

Il donne 1 lignes alors qu'il y en a 845!!!!!

#6 Re : Général » Full text search et index GIN non utilisé » 21/04/2010 15:36:36

Documentation officielle de postgres 8.4 : http://www.postgresql.org/docs/8.4/inte … trols.html

...
Also, * can be attached to a lexeme to specify prefix matching:

SELECT to_tsquery('supern:*A & star:A*B');
        to_tsquery       
--------------------------
'supern':*A & 'star':*AB
Such a lexeme will match any word in a tsvector that begins with the given string.
...

#7 Re : Général » Full text search et index GIN non utilisé » 21/04/2010 15:22:58

Ah pourtant dans la doc on peut faire des recherche avec * pour faire des recherche sur un motif !!

Sinon quelle est la syntaxe correcte?

#8 Re : Général » Full text search et index GIN non utilisé » 21/04/2010 15:07:40

Effectivement j'ai un total de 150000 lignes de texte ce qui représente environ 200 Mo de données.

Cependant lorsque je recherche un autre mot qui commence par 'mai' (forcement plus de résultat de maint) :

"Bitmap Heap Scan on documenttext  (cost=5.28..15.29 rows=5 width=8) (actual time=128.926..597.742 rows=50942 loops=1)"
"  Output: iddocument"
"  Recheck Cond: (test @@ '''mai'':*'::tsquery)"
"  ->  Bitmap Index Scan on idx_gin  (cost=0.00..5.28 rows=5 width=0) (actual time=125.037..125.037 rows=48397 loops=1)"
"        Index Cond: (test @@ '''mai'':*'::tsquery)"
"Total runtime: 634.291 ms"

Si j'ai bien compris, il pense qu'il y a 5 lignes alors qu'en réalité il y en 50942!

Comment je pourrait faire pour que la recherche se fasse plus rapidement. La taille des données est amené a évoluer fortement environ 200 documents texte par mois au minimun. Je ne peut me permettre d'avoir des temps qui vont sans cesse augmenter. Avez-vous des pistes ou des conseils pour par exemple 500 000 lignes et environ 1Go de données texte.

#9 Re : Général » Full text search et index GIN non utilisé » 21/04/2010 14:51:14

J'ai changer le paramètre à 2 et j'obtiens ceci :

"Seq Scan on documenttext  (cost=0.00..36900.00 rows=23517 width=8) (actual time=0.322..2692.242 rows=30226 loops=1)"
"  Output: iddocument"
"  Filter: (test @@ '''maint'''::tsquery)"
"Total runtime: 2717.811 ms"

avec le paramètre a 4:

"Seq Scan on documenttext  (cost=0.00..36900.00 rows=23517 width=8) (actual time=0.461..2729.602 rows=30226 loops=1)"
"  Output: iddocument"
"  Filter: (test @@ '''maint'''::tsquery)"
"Total runtime: 2755.302 ms"

je ne vois pas de différence! Je trouve quand même bizarre que sur ce mot ci, il n'utilise pas l'index pour effectuer la recherche!

#10 Re : Général » Full text search et index GIN non utilisé » 21/04/2010 12:00:55

Voici l'explain analyse de la requête :

"Seq Scan on documenttext  (cost=0.00..36900.00 rows=23517 width=8) (actual time=75.995..51585.983 rows=38924 loops=1)"
"  Output: iddocument"
"  Filter: (test @@ '''maint'':*'::tsquery)"
"Total runtime: 51622.895 ms"

En désactivant les parcours séquentiel:

"Bitmap Heap Scan on documenttext  (cost=33132.49..66468.72 rows=23517 width=8) (actual time=27.244..1903.225 rows=38924 loops=1)"
"  Output: iddocument"
"  Recheck Cond: (test @@ '''maint'':*'::tsquery)"
"  ->  Bitmap Index Scan on idx_gin  (cost=0.00..33126.61 rows=23517 width=0) (actual time=24.038..24.038 rows=38924 loops=1)"
"        Index Cond: (test @@ '''maint'':*'::tsquery)"
"Total runtime: 1933.457 ms"

En modifiant cette variables va t-il y a voir des perturbation pour d'autre requêtes? si la seule modification me permet d'avoir tout le temps de bon résultat et sans perturbé le reste je dis oui!

Sinon aucune explication sur ce problème?

#11 Général » Full text search et index GIN non utilisé » 21/04/2010 11:13:52

Reya
Réponses : 20

Boujour a tous,

je commence à me documenter et faire des test sur FTS. J'ai suivi les recommandations sur le site de postgres. Tout fonctionne très bien mais je rencontre une chose étrange.

Je me suis rendu compte que certaines recherches prenaient énormément de temps et d'autre étaient presque instantanées.

En utilisant un explain sur la requête je vois que l'index n'est pas utilisé sur certains mots ( donc je comprends les temps très long).
Par exemple :

select iddocument from documenttext where test @@ 'maint:*'

me donne en explain

"Seq Scan on documenttext  (cost=0.00..36903.93 rows=23484 width=8)"
"  Output: iddocument"
"  Filter: (test @@ '''maint'':*'::tsquery)"

alors que la même recherche avec 'main:*' ou 'mainte:*' donne :

"Bitmap Heap Scan on documenttext  (cost=10.28..30.16 rows=5 width=8)"
"  Output: iddocument"
"  Recheck Cond: (test @@ '''mainte'':*'::tsquery)"
"  ->  Bitmap Index Scan on idx_gin  (cost=0.00..10.27 rows=5 width=0)"
"        Index Cond: (test @@ '''mainte'':*'::tsquery)"

Ce que ne ne comprends vraiment pas c'est pourquoi sur certains mots l'index n'est pas utilisé? Il y a d'autres mots comme 'patient', 'q',... qui n'utilise pas l'index!!

Quelqu'un a-t-il la réponse et ce phénomène??

Pied de page des forums

Propulsé par FluxBB