Indexer : La boucle SPHINX - comments Indexer : La boucle SPHINX 2017-01-23T09:12:25Z https://contrib.spip.net/Indexer-La-boucle-SPHINX#comment490713 2017-01-23T09:12:25Z <p>@maieul : oui en local j'ai la version 2.2.9. Donc c'est résolu dans les versions postérieures, ticket fermé !</p> Indexer : La boucle SPHINX 2017-01-22T20:07:18Z https://contrib.spip.net/Indexer-La-boucle-SPHINX#comment490709 2017-01-22T20:07:18Z <p>Ok donc ça a l'air d'être côté Sphinx en fait</p> Indexer : La boucle SPHINX 2017-01-22T18:20:46Z https://contrib.spip.net/Indexer-La-boucle-SPHINX#comment490706 2017-01-22T18:20:46Z <p>@Tcharlss: qu'elle est ta version de SPHINX?</p> <p>La version locale que j'ai est 2.2.11 -> cela marche.<br class='autobr' /> La version distante est 2.2.9 -> cela ne marche pas.</p> <p>Et le ticket <a href="http://sphinxsearch.com/bugs/view.php?id=2375" class='spip_url spip_out auto' rel='nofollow external'>http://sphinxsearch.com/bugs/view.php?id=2375</a> dit que le problème a été résolue en 2.2.11.</p> Indexer : La boucle SPHINX 2017-01-22T18:10:08Z https://contrib.spip.net/Indexer-La-boucle-SPHINX#comment490705 2017-01-22T18:10:08Z <p>@Rastapopoulos: si le pb était un mélange int/string, comment ce ferait-il que la second requête Tcharlss, avec un IN, fonctionne?</p> <p>@Tcharlss : tu est sur que ton 'id_objet' contient “mots”? ca devrait pas être un numéro plutot?</p> Indexer : La boucle SPHINX 2017-01-22T16:39:55Z https://contrib.spip.net/Indexer-La-boucle-SPHINX#comment490701 2017-01-22T16:39:55Z <p>Ah mais je raconte n'importe quoi, tu as raison, ça marche bien.<br class='autobr' /> J'avais mal vérifié, désolé pour le bruit !</p> Indexer : La boucle SPHINX 2017-01-22T16:30:36Z https://contrib.spip.net/Indexer-La-boucle-SPHINX#comment490700 2017-01-22T16:30:36Z <blockquote class="spip"> <p>Moi j'ai l'impression que c'est parce que dans votre base il y a des valeurs en string, ou un mélange de valeurs string et int, non ? Et il peut pas faire la comparaison du coup ?</p> </blockquote> <p>En effet pour moi il y a un mélange de int et de string.<br class='autobr' /> C'est l'objet «hierarchie» qui est en string &rarr; <code>[(#PROPERTIES|var_dump)]</code> :</p> <div class='precode'><pre dir='ltr' style='text-align: left;'class=""><code>array (size=4) 'objet' => string 'hierarchie' (length=10) 'id_objet' => string 'mots' (length=4)</code></pre></div> Indexer : La boucle SPHINX 2017-01-22T16:13:19Z https://contrib.spip.net/Indexer-La-boucle-SPHINX#comment490699 2017-01-22T16:13:19Z <p>la requete (qui marche en local mais pas sur mon site distant):</p> <div class='precode'><pre dir='ltr' style='text-align: left;'><code>SELECT *, WEIGHT() AS score, (properties.objet='article') as mono_0, (properties.parents.ids[0]=1) as mono_1, SNIPPET(content, 'rigolo', 'limit=200','html_strip_mode=strip') AS snippet FROM spip WHERE (mono_0=1) AND (mono_1=1) AND (MATCH('rigolo')) LIMIT 0,10</code></pre></div> Indexer : La boucle SPHINX 2017-01-22T16:12:07Z https://contrib.spip.net/Indexer-La-boucle-SPHINX#comment490698 2017-01-22T16:12:07Z <p>non, j'ai bien vérifié ces points : la requete interroge un int, et j'ai en base un int (en tout cas, <code>[(#PROPERTIES|var_dump)]</code> me montre un int.</p> Indexer : La boucle SPHINX 2017-01-22T16:08:19Z https://contrib.spip.net/Indexer-La-boucle-SPHINX#comment490697 2017-01-22T16:08:19Z <p>Euh, comment ça se fait ? Parce que justement timestamp, c'est pareil : les dates les plus vieilles ont un nombre plus petit, donc si on classe par ordre croissant “par date”, ça fait bien du plus vieux au plus récent à priori.</p> Indexer : La boucle SPHINX 2017-01-22T16:01:26Z https://contrib.spip.net/Indexer-La-boucle-SPHINX#comment490696 2017-01-22T16:01:26Z <p>Moi j'ai l'impression que c'est parce que dans votre base il y a des valeurs en string, ou un mélange de valeurs string et int, non ? Et il peut pas faire la comparaison du coup ?</p> Indexer : La boucle SPHINX 2017-01-22T15:52:38Z https://contrib.spip.net/Indexer-La-boucle-SPHINX#comment490695 2017-01-22T15:52:38Z <p>Merci ! J'ai exactement le même problème (avec id_rubrique).</p> <p>Mais le truc bizarre est que cela ne le fait que sur le serveur distant, pas sur le site local, où ma requete fonctionne parfaitement.</p> <p>Ca dépend peut être de la version de SPHINX, et dans ce cas ce serait un bug de SPHINX.</p> <p>Je vais tester avec <code>filtermultijson</code> dès que possible.</p> Indexer : La boucle SPHINX 2017-01-22T15:45:29Z https://contrib.spip.net/Indexer-La-boucle-SPHINX#comment490694 2017-01-22T15:45:29Z <p>Hop, dans ma lancée, un autre bug rencontré avec le critère <code>{filtermono}</code>. Soit la boucle :</p> <div class='precode'><pre dir='ltr' style='text-align: left;'class="spip"><code><span class="re11"><BOUCLE_test</span><span class="re12">(SPHINX)</span> <span class="re13"> <span class="re41">{filtermono <span class="re1">#ENV</span><span class="re40">{id_objet}</span>, properties.id_objet, <span class="re1">#ENV</span><span class="re40">{id_objet}</span>}</span></span> <span class="re10">></span></code></pre></div> <p>Quand il y a un <code>id_objet</code> dans l'environnement, ça ne marche pas.</p> <p>Requête SQL :</p> <div class='precode'><pre dir='ltr' style='text-align: left;'class="sql"><code><span class="kw1">SELECT</span> <span class="sy0">*,</span> <span class="br0">&#40;</span>properties<span class="sy0">.</span>id_objet<span class="sy0">=</span><span class="nu0">230</span><span class="br0">&#41;</span> <span class="kw1">AS</span> mono_0 <span class="kw1">FROM</span> truc <span class="kw1">WHERE</span> <span class="br0">&#40;</span>mono_0<span class="sy0">=</span><span class="nu0">1</span><span class="br0">&#41;</span></code></pre></div> <p>Erreur SQL :</p> <div class="coloration_code cadre"><div class="spip_sql cadre" data-clipboard-text="ERROR 1064 (42000): index truc: parse error: equal operation applied to part string operands"><div class="sql"><ol><li class="li1"><div class="de1">ERROR <span class="nu0">1064</span> <span class="br0">&#40;</span><span class="nu0">42000</span><span class="br0">&#41;</span>: <span class="kw1">INDEX</span> truc: parse error: equal operation applied <span class="kw1">TO</span> part string operands</div></li> </ol></div></div></div><hr class="spip" /> <p>En revanche, avec le critère <code>{filtermultijson}</code>, ça fonctionne bien :</p> <div class='precode'><pre dir='ltr' style='text-align: left;'class="spip"><code><span class="re11"><BOUCLE_test</span><span class="re12">(SPHINX)</span> <span class="re13"> <span class="re41">{filtermultijson <span class="re1">#ENV</span><span class="re40">{id_objet}</span>, properties.id_objet, <span class="re1">#LISTE</span><span class="re40">{<span class="re1">#ENV</span>{id_objet}}</span>}</span></span> <span class="re10">></span></code></pre></div> <p>Requête SQL :</p> <div class='precode'><pre dir='ltr' style='text-align: left;'class="sql"><code><span class="kw1">SELECT</span> <span class="sy0">*,</span> <span class="br0">&#40;</span><span class="kw1">IN</span><span class="br0">&#40;</span>properties<span class="sy0">.</span>id_objet<span class="sy0">,</span> <span class="nu0">230</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="kw1">AS</span> multi_0 <span class="kw1">FROM</span> truc <span class="kw1">WHERE</span> <span class="br0">&#40;</span>multi_0<span class="sy0">=</span><span class="nu0">1</span><span class="br0">&#41;</span></code></pre></div> Indexer : La boucle SPHINX 2017-01-22T15:29:48Z https://contrib.spip.net/Indexer-La-boucle-SPHINX#comment490693 2017-01-22T15:29:48Z <p>Un petit détail qui pourrait être mentionné dans la doc : les dates sont au format timestamp, donc pour trier sur ce critère il faut faire à l'inverse des boucles “traditionnelles” :</p> <p>* du plus récent au plus ancien : <code>{par date}</code><br class='autobr' /> * du plus ancien au plus récent : <code>{!par date}</code></p> Indexer : La boucle SPHINX 2017-01-22T14:35:41Z https://contrib.spip.net/Indexer-La-boucle-SPHINX#comment490692 2017-01-22T14:35:41Z <p>Un truc un peu surprenant qui devrait être mentionné dans la doc : sans le critère <code>{pagination}</code>, la boucle ne retourne que 20 résultats, même avec l'option <code>max_matches</code>.</p> <p>Donc pour afficher <strong>tous</strong> les résultats il <strong>faut</strong> ajouter un truc du genre <code>{pagination 999999}</code></p> Indexer : La boucle SPHINX 2017-01-19T11:44:38Z https://contrib.spip.net/Indexer-La-boucle-SPHINX#comment490622 2017-01-19T11:44:38Z <p>Bonjour,</p> <p>Je rencontre un drôle de problème, comme si des critères de la boucle étaient mis en cache.</p> <p>J'ai donc une saisie personnalisée utilisée dans un formulaire, elle contient une boucle SPHINX avec un critère <code>{filtermultijson}</code> qui doit être optionnel, donc pris en compte uniquement s'il y a <code>rubriques</code> dans l'environnement :</p> <div class='precode'><pre dir='ltr' style='text-align: left;'class="spip"><code><span class="re11"><BOUCLE_truc</span><span class="re12">(SPHINX)</span> <span class="re13"> <span class="re41">{filtermultijson <span class="re1">#ENV</span><span class="re40">{rubriques}</span>, properties.rubriques.ids, <span class="re1">#ENV</span><span class="re40">{rubriques}</span>}</span></span> <span class="re10">></span></code></pre></div> <p>Cette saisie est inclue plusieurs fois dans mon formulaire, et je ne veux une restriction par rubriques que dans la 1ère :</p> <div class='precode'><pre dir='ltr' style='text-align: left;'class="php"><code><span class="re0">$saisies</span> <span class="sy0">=</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span> <span class="st_h">'saisie'</span> <span class="sy0">=></span> <span class="st_h">'masaisie'</span><span class="sy0">,</span> <span class="st_h">'options'</span> <span class="sy0">=></span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span> <span class="st_h">'nom'</span> <span class="sy0">=></span> <span class="st_h">'test1'</span><span class="sy0">,</span> <span class="st_h">'rubriques'</span> <span class="sy0">=></span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="nu0">50</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="br0">&#41;</span><span class="sy0">,</span> <span class="br0">&#41;</span><span class="sy0">,</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span> <span class="st_h">'saisie'</span> <span class="sy0">=></span> <span class="st_h">'masaisie'</span><span class="sy0">,</span> <span class="st_h">'options'</span> <span class="sy0">=></span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span> <span class="st_h">'nom'</span> <span class="sy0">=></span> <span class="st_h">'test2'</span><span class="sy0">,</span> <span class="st_h">'rubriques'</span> <span class="sy0">=></span> <span class="st_h">''</span><span class="sy0">,</span> <span class="br0">&#41;</span><span class="sy0">,</span> <span class="br0">&#41;</span><span class="sy0">,</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span> <span class="st_h">'saisie'</span> <span class="sy0">=></span> <span class="st_h">'masaisie'</span><span class="sy0">,</span> <span class="st_h">'options'</span> <span class="sy0">=></span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span> <span class="st_h">'nom'</span> <span class="sy0">=></span> <span class="st_h">'test3'</span><span class="sy0">,</span> <span class="st_h">'rubriques'</span> <span class="sy0">=></span> <span class="st_h">''</span><span class="sy0">,</span> <span class="br0">&#41;</span><span class="sy0">,</span> <span class="br0">&#41;</span><span class="sy0">,</span> <span class="br0">&#41;</span><span class="sy0">;</span></code></pre></div> <p>Et là surprise, la restriction par rubriques est appliquée dans les 3 boucles !</p> <p>Dans la méthode <code>runQuery()</code>, j'ai fait un <span class="coloration_code code"><code class="spip_php code" data-clipboard-text="var_dump($result['query']['query']);"><a href="http://www.php.net/var_dump"><span class="kw3">var_dump</span></a><span class="br0">&#40;</span><span class="re0">$result</span><span class="br0">&#91;</span><span class="st_h">'query'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'query'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span></code></span> pour voir ce qu'il se passait.<br class='autobr' /> Et effectivement, dans les 3 requêtes on retouve la même valeur dans le <code>SELECT</code> :</p> <ol class="spip"><li> requête 1 : <span class="coloration_code code"><code class="spip_sql code" data-clipboard-text="(IN(properties.rubriques.ids, 50))"><span class="br0">&#40;</span><span class="kw1">IN</span><span class="br0">&#40;</span>properties<span class="sy0">.</span>rubriques<span class="sy0">.</span>ids<span class="sy0">,</span> <span class="nu0">50</span><span class="br0">&#41;</span><span class="br0">&#41;</span></code></span> <span style="color:green">(ok)</span></li><li> requête 2 : <span class="coloration_code code"><code class="spip_sql code" data-clipboard-text="(IN(properties.rubriques.ids, 50))"><span class="br0">&#40;</span><span class="kw1">IN</span><span class="br0">&#40;</span>properties<span class="sy0">.</span>rubriques<span class="sy0">.</span>ids<span class="sy0">,</span> <span class="nu0">50</span><span class="br0">&#41;</span><span class="br0">&#41;</span></code></span> <span style="color:red">(pas ok)</span></li><li> requête 3 : <span class="coloration_code code"><code class="spip_sql code" data-clipboard-text="(IN(properties.rubriques.ids, 50))"><span class="br0">&#40;</span><span class="kw1">IN</span><span class="br0">&#40;</span>properties<span class="sy0">.</span>rubriques<span class="sy0">.</span>ids<span class="sy0">,</span> <span class="nu0">50</span><span class="br0">&#41;</span><span class="br0">&#41;</span></code></span> <span style="color:red">(pas ok)</span></li></ol> <p>En revanche quand je donne explictement des valeurs à <code>rubriques</code> pour chaque saisie, elles sont correctement prises en compte. Par exemple en donnant respectivement 50, 100 et 150 :</p> <ol class="spip"><li> requête 1 : <span class="coloration_code code"><code class="spip_sql code" data-clipboard-text="(IN(properties.rubriques.ids, 50))"><span class="br0">&#40;</span><span class="kw1">IN</span><span class="br0">&#40;</span>properties<span class="sy0">.</span>rubriques<span class="sy0">.</span>ids<span class="sy0">,</span> <span class="nu0">50</span><span class="br0">&#41;</span><span class="br0">&#41;</span></code></span> <span style="color:green">(ok)</span></li><li> requête 2 : <span class="coloration_code code"><code class="spip_sql code" data-clipboard-text="(IN(properties.rubriques.ids, 100))"><span class="br0">&#40;</span><span class="kw1">IN</span><span class="br0">&#40;</span>properties<span class="sy0">.</span>rubriques<span class="sy0">.</span>ids<span class="sy0">,</span> <span class="nu0">100</span><span class="br0">&#41;</span><span class="br0">&#41;</span></code></span> <span style="color:green">(ok)</span></li><li> requête 3 : <span class="coloration_code code"><code class="spip_sql code" data-clipboard-text="(IN(properties.rubriques.ids, 150))"><span class="br0">&#40;</span><span class="kw1">IN</span><span class="br0">&#40;</span>properties<span class="sy0">.</span>rubriques<span class="sy0">.</span>ids<span class="sy0">,</span> <span class="nu0">150</span><span class="br0">&#41;</span><span class="br0">&#41;</span></code></span> <span style="color:green">(ok)</span></li></ol> <p>Donc on dirait que ça prend automatiquement une valeur si la boucle est utilisée plusieurs fois, et qu'il n'y a pas de valeur donnée explicitement.</p> <p>Enfin, si je ne donne une valeur 100 qu'à la 2ème saisie, j'obtiens ces requêtes :</p> <ol class="spip"><li> requête 1 : rien <span style="color:green">(ok)</span></li><li> requête 2 : <span class="coloration_code code"><code class="spip_sql code" data-clipboard-text="(IN(properties.rubriques.ids, 100))"><span class="br0">&#40;</span><span class="kw1">IN</span><span class="br0">&#40;</span>properties<span class="sy0">.</span>rubriques<span class="sy0">.</span>ids<span class="sy0">,</span> <span class="nu0">100</span><span class="br0">&#41;</span><span class="br0">&#41;</span></code></span> <span style="color:green">(ok)</span></li><li> requête 3 : <span class="coloration_code code"><code class="spip_sql code" data-clipboard-text="(IN(properties.rubriques.ids, 100))"><span class="br0">&#40;</span><span class="kw1">IN</span><span class="br0">&#40;</span>properties<span class="sy0">.</span>rubriques<span class="sy0">.</span>ids<span class="sy0">,</span> <span class="nu0">100</span><span class="br0">&#41;</span><span class="br0">&#41;</span></code></span> <span style="color:red">(pas ok)</span></li></ol> <p>Donc ça semble ne remplir la valeur que s'il y en a une <strong>dans la boucle précédente</strong>.</p> <p>Pour finir, si je fais des copies des squelettes de ma saisie avec des noms différents, là ça fonctionne correctement.<br class='autobr' /> Bref, on dirait qu'il y a un espèce de cache quelque part qui entre en jeu.</p>