samedi 31 décembre 2011
Sphinx : Tri par titre en multi index ...
Dans la rubrique Mysql
Puisque sphinx ne connaît que des valeurs scalaires pour faire un tri alphabétique, il faut transformer les chaînes de caractères en nombre.
sql_attr_str2ordinal sert à ça.
Sauf que .... ce qu'on stocke c'est un n° d'ordre dans l'index, c'est pas une représentation numérique de la chaîne.
Le nom est bien 2ordinal et pas 2num
Pour confirmation cet extrait de la doc :
9.1.20. sql_attr_str2ordinal (...) When indexing ordinals, string values are fetched from database, temporarily stored, sorted, and then replaced by their respective ordinal numbers in the array of sorted strings. So, the ordinal number is an integer such that sorting by it produces the same result as if lexicographically sorting by original strings. by string values lexicographically.
Donc pour les recherches sur plusieurs indexs ça coince.
En effet si ma chaîne est 3eme dans un index, ca ne veut pas dire qu'elle serait avant celle qui est 3ème, 5ème,100ème dans l'autre index.
Bref en multi index, ça foire.
C'est un problème facile à repérer parce que vos résultats arrivent en petites séries de blocs triés. Comme un 45T dont l'aiguille saute 
C'est bien dommage parce qu'une manière d’accélérer vos indexations et vos recherches c'est de découper les indexs en "portions".
Que faire quand on veut profiter des avantages de ce découpage et des possibilités de trier alphabétiquement ?
Solution depuis Sphinx 1.10
Allez Louya, on a un nouveau type de champs. coûteux mais efficace. sql_field_string
En créant un attribut de ce type, et en l'utilisant dans "sort" sur vos chunk... ca marche.
Et en bonus, vous pouvez en récupérer le contenu. C'est-à-dire que si l'info vous suffit , vous ne devez plus aller la rechercher dans votre source.
Solution avant Sphinx 1.10
Transformez vous même la chaîne en nombre 
Si vous utilisez une source Mysql, j'ai une solution. Bof bof pour ca. Utiliser la fonction HEX de mysql.
J'ai expliqué cela il y a quelque temps : StrToNum en Mysql ou comment convertir une chaine en nombre ?
Reste encore 2 autres problèmes à régler mais ça sera pour une autre fois.
- avant de trier il faut "TRIM" tous les espaces blancs. Et ca, Mysql ne le fait pas aussi bien que php. En effet mysql ne retire que les ASCII 32.
- pour trier il faut une bonne collation. Et ca je n'ai pas encore trouvé comment faire en sorte que sphinx s'en sorte aussi bien que Mysql
le "œ" est-il bien entre "n" et "p" ?


-
-![[T]](http://static.technorati.com/pix/icn-talkbubble.gif)

Perso je préfère les en extraire et les garder dans un dossier image-fun.
Pour aider,
1





