INDEXATION - SQL - REQUETES SPECIALES !! - Programmation
Marsh Posté le 19-03-2001 à 14:34:30
ben suppose que tu as une table "voitures" avec une colonne couleur.
tu fais :
select couleur,count(*) from voiture
group by couleur
t'obtiendras un truc du genre
bleu | 5
rouge | 7
vert | 3
tu as le nombre d'itérations.
bien sur il faudra une requête par colonne
Marsh Posté le 19-03-2001 à 14:47:17
bah ché po si c ce que je voulais vraiment faire!
en fait avec ta méthode, je trouve le nombre de "combinaisons de mots" et je veux chercher le nombre de mots, donc en passant par un index!
donc comment faire???
Marsh Posté le 19-03-2001 à 14:53:39
k666 a écrit a écrit : bah ché po si c ce que je voulais vraiment faire! en fait avec ta méthode, je trouve le nombre de "combinaisons de mots" et je veux chercher le nombre de mots, donc en passant par un index! donc comment faire??? |
si tu donnais un exemple, ca se serait plus facile de t'aider, parce que la je suis pas sur de comprendre ce que tu veux
Marsh Posté le 19-03-2001 à 14:59:13
bah en fait avec ta requête je sortirai un truc du genre
chocolat vert // 25
chocolat rouge // 13
chocolat rouge et vert // 10
chocolat // 8
et moi ske je veux c:
chocolat // 86
vert // 45
rouge // 33
tu vois la subtilité? bah justement je crois que je peux faire ça simplement avec un index, qui contient des "un seul mot" et pas des "combinaison de un ou plusieurs mots"
voilà quoi....
en fait le problème que j'ai c que j ai une base super bizarre, avec des trucs de ouf, et j aimerai bien savoir de quoi il s agit, voir les mots qui apparaissent le plus fréquemment, et non pas les "phrases qui apparaissent le plus souvent"......voilà
[edit]--Message édité par k666--[/edit]
Marsh Posté le 19-03-2001 à 15:13:54
ben si tes "phrases" sont dans un même champ, je vois pas comment
tu vas t'en sortir, ou alors utiliser une fonction SQL qui
sépare les mots d'un champ.
Marsh Posté le 19-03-2001 à 15:39:43
bah tu dois pouvoir t'en sortir avec un like '%chocolat%'
Marsh Posté le 19-03-2001 à 15:42:13
thegti a écrit a écrit : bah tu dois pouvoir t'en sortir avec un like '%chocolat%' |
mais comme ca, il doit faire une requête pour chaque mot rencontré
Marsh Posté le 19-03-2001 à 15:44:30
thegti a écrit a écrit : bah tu dois pouvoir t'en sortir avec un like '%chocolat%' |
bah oué, c ça le problème, faudra balancer du dictionnaire pour faire les requêtes, et même pire que du dictionnaire, faudra faire du combinatoire à l infini de charactères!!!!!!! c la FOLLLLLLLLLLIIIIIIIIIIIIIIEEEEEEEEEEEEEEEEEEEEEEEEee
d où bah, voiulà, comment profiter de cette saloperie d index
Marsh Posté le 19-03-2001 à 16:46:01
un index te servira à rien si tu "splittes" pas tes phrases.
Marsh Posté le 19-03-2001 à 16:50:00
Je réexplique le problème de K666 ( ou l'explique mieux)
Il existe sur la base (MS SQL7) un catalogue de texte intégral, sur une table. Le truc c'est qu'il voudrait si c'est faisable, ressortir les mots qui apparaissent le plus de fois.
Je ne sais pas non plus si c'est faisable, alors exprimés vous. En fait c'est pour la création de formulaires qui attaqueraient une base, on voudrait avoir cette info pour savoir les mots qui remonteraient le plus de résultats.
[edit]--Message édité par Lord II--[/edit]
Marsh Posté le 19-03-2001 à 16:55:56
>jupiler:
bah jcroyais que justement un index servait entre autres à splitter les phrases, pour faciliter les recherches dans du foultexte, et accélérer la réponse pour une recherche sur un mot donné dans un champ donné.......pas moyen?
Marsh Posté le 20-03-2001 à 14:42:16
Salut!
on a des grosses tables et on aimerait bien savoir keskelles contiennent,
en gros, j'aimerai savoir si ya moyten d avoir les mots qui apparaissent le plus souvent dans ces tables indexées....
en gros gros, d avoir:
mot // nb_apparitions
---------------------
chocolat // 30000 apparitions
orange // 15000 apparitions...
comment quon fait pour faire ça???? svp! c urgentissime !!!! merci
ps: j aimerai pas avoir à utiliser un dictionnaire et faire 1000000 de requêtes
Marsh Posté le 20-03-2001 à 17:47:11
impossible de faire ça avec des index en sql !!!
la requete c'est group by + like.
mais ça prendra jamais un index pour le faire.
un ch'tit prog en c qui lit toutes les données et pour p'tit algo me semble plus adapté et sera plus rapide.
Ou alors construire une table avec une liste de mots clés + un compteur d'apparition et ch'tit trigger sur ta table qui vient incrémenter/décrémenter lors d'insert/update/delete. prévoir une proc pour tout recalculer.
Marsh Posté le 20-03-2001 à 18:23:19
Je vous pas le rapport avec les indexs mais bon ...
(indexer le contenu d'une colonne chaine de caractères, je crois pas que ce soit possible ..., mais pourquoi pas ...)
Sinon pour ton problème, faut te démerde en Transact-SQL
- un curseur sur ta table
- une boucle sur la chaine de caractères de la colonne (découpage de la chaine, utilise les fonctions CHARINDEX, PATINDEX, SUBSTRING, ...)
- dans la boucle, tu update une table de compteurs avec les résultats trouvés
De toute facon, le SQL ne permet de passer de 1 dimension (1 colonne) à n dimensions (n lignes) comme tu veut le faire
D'ailleurs, ca me fait penser que Access le fait, avec ses requètes croisées, comment on fait ca en SQL standard ? ...
Enfin bon, voilà comment je vois ton problème
Marsh Posté le 20-03-2001 à 19:43:58
Pour info, les index BD et les index plein-texte n'ont pas grand chose à voir. Et je n'ai jamais vu de BD qui utilise systématiquement les index plein-texte pour indexer des colonnes de type STRING.
Pourquoi : parce que généralement, on utilise les index plein-texte quand on a des gros textes (genre, des documents entiers). Mais les colonnes de type string dans les BDs relationnelles sont rarement de grande taille (sinon, on n'utiliserait pas des STRINGs, mais des BLOBs).
Ceci dit, les index BDs sur des STRINGs permettent généralement de faire des LIKE "myString*", voire aussi, pour certaines, des LIKE "*myString" de façon pas trop inefficace.
Marsh Posté le 21-03-2001 à 10:15:09
biFace >>
avec des like faudra que je me tape plein de combinaisons différentes, or je ne sais pas ce que peut contenir la table (a priori) donc bah voià!
je pense que la meilleure méthode est celle de thegti, d'ajouter le mot dans une table s il n y est pas encore, et sil y est d incrémenter son compteur, par contre c chiant, vu qu il existe les index!!! pourkoi ya pas ce traitement qui est qd même de base? c dingue!
sinon, personne n'aurait un site oè l on puisse voir tout ce qui est faisable avec des index? qui explique la structure de ceux ci? bref, qui dise skon peut faire avec!!!!
merci
Marsh Posté le 21-03-2001 à 11:12:34
un index, ça doit globalement être géré de la façon suivante : à chaque insertion d'un valeur ( entier, chaine de caractère .. ) dans une valeur indexée, il la met dans l'index correspondant et dans l'ordre souhaité ( je passe la partie constitution des fichiers index parce que là c'est compliqué et chaque système a ses propres astuces pour optimiser ). donc un index est obligatoirement sur une colonne entière, tu ne peux pas faire ça sur une partie d'une chaine de caractère. donc tu es obligé de passer par une table externe que tu alimentes avec analysant et décomposant les chaines saisies. en utilisant le même principe que la constitution des index ( unique ), sans oublier d'en utiliser un pour la recherche sur les mots, sinon ça va ramer un max.
Marsh Posté le 21-03-2001 à 11:31:52
aille! je sais pas si on parle de "index" de la même façon..disons donc catalogue
c un espèce de dictionnaire, avec le mot rencontré, et au lieu de la définition du mot, bah les endroits où il a été trouvé ...
j'aimerai savoir sia moyen de traiter cet endroit où il a été trouvé ????? genre de compter combien d apparitions, dans quelles circonstances, etc.....
Marsh Posté le 21-03-2001 à 11:33:05
en gros parcourir le catalogue .......
Marsh Posté le 21-03-2001 à 12:35:47
Si tu veut sélectionner en plus de compter
bah je crois qu'il te faut un index plein-text dont parle BifaceMcLeOD
Mais moi aussi, j'ai jamais vu de BD qui font ca
Et ca doit bouffer un max de place car dans une chaine de taille x, il peut y avoir x/2 mots donc un index de taille x/2
A mon avis, les SGBDs ne font pas ca en standard à cause que les indexs sont de taille fixe et que les chaines de caractères rarement d'une part
Et d'autres part, définir les caractères de séparation des mots (espace, virgule, point-virgule, tabulation, espace+virgule, espace+espace+virgule)
A mon avis, ca sent bon la grosse usine à gaz !!
Marsh Posté le 21-03-2001 à 12:36:18
Si tu veut sélectionner en plus de compter
bah je crois qu'il te faut un index plein-text dont parle BifaceMcLeOD
Mais moi aussi, j'ai jamais vu de BD qui font ca
Et ca doit bouffer un max de place car dans une chaine de taille x, il peut y avoir x/2 mots donc un index de taille x/2
A mon avis, les SGBDs ne font pas ca en standard à cause que les indexs sont de taille fixe et que les chaines de caractères rarement d'une part
Et d'autres part, définir les caractères de séparation des mots (espace, virgule, point-virgule, tabulation, espace+virgule, espace+espace+virgule)
A mon avis, ca sent bon la grosse usine à gaz !!
Marsh Posté le 21-03-2001 à 14:43:15
bah ça a l air un peu chaud!
jcrois que je vais opter pour du c++ pour faire le tri....
maintenant, eske vous savez où je pourrais trouver un algorithme qui ordonne en ordre alphabétique toute une batteria géante de mots, et qui mette le nombre d apparitions?? ça doit exister ça, en déjà fait c clair!
si kelkun peut m éclairer? merci
Marsh Posté le 21-03-2001 à 14:59:47
ddr555 a écrit a écrit : quick sort RULEZZZZZZZZZZZZZZZZz |
jpensais exactement à ça! par contre tu sais pas où je peux en pécho un comme sui ke jveux?
Marsh Posté le 19-03-2001 à 11:48:22
Salut!
on a des grosses tables et on aimerait bien savoir keskelles contiennent,
en gros, j'aimerai savoir si ya moyten d avoir les mots qui apparaissent le plus souvent dans ces tables indexées....
en gros gros, d avoir:
mot // nb_apparitions
---------------------
chocolat // 30000 apparitions
orange // 15000 apparitions...
comment quon fait pour faire ça???? svp! c urgentissime !!!! merci
ps: j aimerai pas avoir à utiliser un dictionnaire et faire 1000000 de requêtes
[edit]--Message édité par k666--[/edit]