Indexer : La boucle SPHINX - commentaires 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é<small class="fine d-inline"> </small>!</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<small class="fine d-inline"> </small>?</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<small class="fine d-inline"> </small>?</p> <p>@Tcharlss : tu est sur que ton 'id_objet' contient « mots »<small class="fine d-inline"> </small>? ca devrait pas être un numéro plutot<small class="fine d-inline"> </small>?</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<small class="fine d-inline"> </small>!</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<small class="fine d-inline"> </small>? Et il peut pas faire la comparaison du coup<small class="fine d-inline"> </small>?</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 «<small class="fine d-inline"> </small>hierarchie<small class="fine d-inline"> </small>» qui est en string → <code class="spip_code spip_code_inline" dir="ltr">[(#PROPERTIES|var_dump)]</code> :</p> <div class="precode"><pre class="spip_code spip_code_block" dir="ltr" style="text-align:left;"><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 class="spip_code spip_code_block" 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 class="spip_code spip_code_inline" dir="ltr">[(#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<small class="fine d-inline"> </small>? 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<small class="fine d-inline"> </small>? Et il peut pas faire la comparaison du coup<small class="fine d-inline"> </small>?</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<small class="fine d-inline"> </small>! 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 class="spip_code spip_code_inline" dir="ltr">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 class="spip_code spip_code_inline" dir="ltr">{filtermono}</code>. Soit la boucle :</p> <div class="precode"><pre class="spip_code spip_code_block language-spip" dir="ltr" style="text-align:left;" data-language="spip"><code><BOUCLE_test(SPHINX) {filtermono #ENV{id_objet}, properties.id_objet, #ENV{id_objet}} ></code></pre></div> <p>Quand il y a un <code class="spip_code spip_code_inline" dir="ltr">id_objet</code> dans l'environnement, ça ne marche pas.</p> <p>Requête SQL :</p> <div class="precode"><pre class="spip_code spip_code_block language-sql" dir="ltr" style="text-align:left;" data-language="sql"><code>SELECT *, (properties.id_objet=230) as mono_0 FROM truc WHERE (mono_0=1)</code></pre></div> <p>Erreur SQL :</p> <div class="precode"><pre class="spip_code spip_code_block language-sql" dir="ltr" style="text-align:left;" data-language="sql"><code>ERROR 1064 (42000): index truc: parse error: equal operation applied to part string operands</code></pre></div><hr class="spip"> <p>En revanche, avec le critère <code class="spip_code spip_code_inline" dir="ltr">{filtermultijson}</code>, ça fonctionne bien :</p> <div class="precode"><pre class="spip_code spip_code_block language-spip" dir="ltr" style="text-align:left;" data-language="spip"><code><BOUCLE_test(SPHINX) {filtermultijson #ENV{id_objet}, properties.id_objet, #LISTE{#ENV{id_objet}}} ></code></pre></div> <p>Requête SQL :</p> <div class="precode"><pre class="spip_code spip_code_block language-sql" dir="ltr" style="text-align:left;" data-language="sql"><code>SELECT *, (IN(properties.id_objet, 230)) as multi_0 FROM truc WHERE (multi_0=1)</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 class="spip_code spip_code_inline" dir="ltr">{par date}</code><br class="autobr"> * du plus ancien au plus récent : <code class="spip_code spip_code_inline" dir="ltr">{!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 class="spip_code spip_code_inline" dir="ltr">{pagination}</code>, la boucle ne retourne que 20 résultats, même avec l'option <code class="spip_code spip_code_inline" dir="ltr">max_matches</code>.</p> <p>Donc pour afficher <strong>tous</strong> les résultats il <strong>faut</strong> ajouter un truc du genre <code class="spip_code spip_code_inline" dir="ltr">{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 class="spip_code spip_code_inline" dir="ltr">{filtermultijson}</code> qui doit être optionnel, donc pris en compte uniquement s'il y a <code class="spip_code spip_code_inline" dir="ltr">rubriques</code> dans l'environnement :</p> <div class="precode"><pre class="spip_code spip_code_block language-spip" dir="ltr" style="text-align:left;" data-language="spip"><code><BOUCLE_truc(SPHINX) {filtermultijson #ENV{rubriques}, properties.rubriques.ids, #ENV{rubriques}} ></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<sup class="typo_exposants">re</sup> :</p> <div class="precode"><pre class="spip_code spip_code_block language-php" dir="ltr" style="text-align:left;" data-language="php"><code>$saisies = array( array( 'saisie' => 'masaisie', 'options' => array( 'nom' => 'test1', 'rubriques' => array(50), ), ), array( 'saisie' => 'masaisie', 'options' => array( 'nom' => 'test2', 'rubriques' => '', ), ), array( 'saisie' => 'masaisie', 'options' => array( 'nom' => 'test3', 'rubriques' => '', ), ), );</code></pre></div> <p>Et là surprise, la restriction par rubriques est appliquée dans les 3 boucles<small class="fine d-inline"> </small>!</p> <p>Dans la méthode <code class="spip_code spip_code_inline" dir="ltr">runQuery()</code>, j'ai fait un <code class="spip_code spip_code_inline" dir="ltr">var_dump($result['query']['query']);</code> 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 class="spip_code spip_code_inline" dir="ltr">SELECT</code> :</p> <ol class="spip"><li> requête 1 : <code class="spip_code spip_code_inline" dir="ltr">(IN(properties.rubriques.ids, 50))</code> <span style="color:#008000;">(ok)</span></li><li> requête 2 : <code class="spip_code spip_code_inline" dir="ltr">(IN(properties.rubriques.ids, 50))</code> <span style="color:#FF0000;">(pas ok)</span></li><li> requête 3 : <code class="spip_code spip_code_inline" dir="ltr">(IN(properties.rubriques.ids, 50))</code> <span style="color:#FF0000;">(pas ok)</span></li></ol> <p>En revanche quand je donne explictement des valeurs à <code class="spip_code spip_code_inline" dir="ltr">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 : <code class="spip_code spip_code_inline" dir="ltr">(IN(properties.rubriques.ids, 50))</code> <span style="color:#008000;">(ok)</span></li><li> requête 2 : <code class="spip_code spip_code_inline" dir="ltr">(IN(properties.rubriques.ids, 100))</code> <span style="color:#008000;">(ok)</span></li><li> requête 3 : <code class="spip_code spip_code_inline" dir="ltr">(IN(properties.rubriques.ids, 150))</code> <span style="color:#008000;">(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<sup class="typo_exposants">e</sup> saisie, j'obtiens ces requêtes :</p> <ol class="spip"><li> requête 1 : rien <span style="color:#008000;">(ok)</span></li><li> requête 2 : <code class="spip_code spip_code_inline" dir="ltr">(IN(properties.rubriques.ids, 100))</code> <span style="color:#008000;">(ok)</span></li><li> requête 3 : <code class="spip_code spip_code_inline" dir="ltr">(IN(properties.rubriques.ids, 100))</code> <span style="color:#FF0000;">(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>