Changeset 82558 in spip-zone


Ignore:
Timestamp:
May 18, 2014, 1:51:31 PM (5 years ago)
Author:
marcimat@…
Message:

Début d'une gestion de boucle (SPHINX).

  • création d'un itérateur spécifique et des critères associés.
  • gestion de : {select x} {recherche y} {par truc} {snippet content, mot} {facet auteurs, la requete} {index n} …
  • documentation associée

Pour verifier la migration, j'ai mis dans des squelettes séparés la liste des documents, facettes et metas.
Pour l'instant, sur la page sphinx, on a l'ancienne approche (par filtre créant la requête avec boucle DATA), et la nouvelle (par type de boucle spécifique). Les 2 appelent les mêmes inclusions et cela permet de voir les éventuelles différences (avec beaucoup de scroll cependant).

Reste à gérer, pour avoir le même comportement qu'avant les filtres auteurs, tags et date qui sont pour l'instant inconnus de la boucle (SPHINX), mais ça viendra.

Location:
_plugins_/indexer/trunk
Files:
7 added
4 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/indexer/trunk/content/sphinx.html

    r82545 r82558  
    2121
    2222
    23 [(#SET{sql, [(#ENV{source,spip}|sphinx_get_query_documents{#ENV*{recherche},#ENV*{tag},#ENV*{auteur},#ENV{annee},#GET{order}})]})]
    24 
    2523<B_filtres>
    2624<h4>Filtres:</h4>
     
    3230
    3331
     32<!--
     33        {filtre auteurs, properties.authors, #ENV*{auteur}}
     34-->
     35
     36<BOUCLE_recherche_sphinx(SPHINX)
     37        {recherche #ENV*{recherche}}
     38
     39
     40
     41        {facet auteurs, properties.authors ORDER BY COUNT(*) DESC}
     42        {facet tags, properties.tags ORDER BY COUNT(*) DESC}
     43        {facet date, YEAR(date) ORDER BY date DESC}
     44>
     45        <h1>Dans la boucle (SPHINX)</h1>
     46        <pre>#QUERY</pre>
     47
     48        [(#INCLURE{fond=liste/sphinx_documents,docs,meta,env})]
     49        [(#INCLURE{fond=liste/sphinx_facettes,facets,env})]
     50        [(#INCLURE{fond=liste/sphinx_metas,meta,env})]
     51
     52</BOUCLE_recherche_sphinx>
     53
     54<hr />
     55
     56
     57[(#SET{sql, [(#ENV{source,''}|sphinx_get_query_documents{#ENV*{recherche},#ENV*{tag},#ENV*{auteur},#ENV{annee},#GET{order}})]})]
    3458
    3559<BOUCLE_recherche(DATA) {source SphinxQL, #GET{sql}, #ENV{debut_documents}}>
    3660
    37         <B_documents>
    38                 <h2>Documents trouvés</h2>
    39                 <small>
    40                 [(#VALEUR{meta/total}|=={1000}|?{'+ de '}) ][(#VALEUR{meta/total}) ]résultats \([(#VALEUR{meta/time}|mult{1000})] ms\)
    41                 </small>
     61        <h1>Dans la boucle oldschool</h1>
     62        <pre>#QUERY</pre>
    4263
    43                 <div class='liste long resultats'>
    44                         [<div class="pagination">(#DEBUT_DOCUMENTS|?{#PAGINATION,#ANCRE_PAGINATION})</div>]
    45                         <ul class='liste-items'>
    46         <BOUCLE_documents(DATA){source tableau, #DOCS}{pagination 10}>
    47                                 [(#SET{properties,#PROPERTIES|json_decode})]
    48                                 <li class='item'>
    49                                         <article class='entry article hentry'>
    50                                                 <strong class='h3-like entry-title'>#SCORE <a href="#URI">#TITLE</a></strong>
    51                                                 <p class="publication">
    52                                                         [<time pubdate="pubdate" datetime="[(#DATE|date_iso)]">(#DATE|affdate_jourcourt)</time>][<span class="authors"><span class="sep">, </span> <:par_auteur:> (#GET{properties/authors}|implode{', '})</span>]
    53                                                 </p>
    54                                                 [<div class="introduction entry-content">(#SNIPPET|sinon{#SUMMARY})</div>]
    55                                         </article>
    56                                 </li>
    57         </BOUCLE_documents>
    58                         </ul>
    59                 </div>
    60         [<div class="pagination">(#PAGINATION)</div>]
    61         </B_documents>
    62 
    63 
    64 
    65         <B_facettes>
    66                 <h2>Facettes associées</h2>
    67                 <div class='row-fluid'>
    68         <BOUCLE_facettes(DATA){source tableau, #FACETS}>
    69                 <div class='span4'>
    70                         <h3>#CLE</h3>
    71                         <div class='liste'>
    72                                 <ul class='liste-items'>
    73                         <BOUCLE_liste_facettes(DATA){source tableau, #VALEUR}>
    74                                         <li class='item'>#CLE \(#VALEUR\)</li>
    75                         </BOUCLE_liste_facettes>
    76                                 </ul>
    77                         </div>
    78                 </div>
    79         </BOUCLE_facettes>
    80                 </div>
    81         </B_facettes>
    82 
    83 
    84         <B_meta>
    85                 <h2>Métas associées</h2>
    86                 <dl>
    87         <BOUCLE_meta(DATA){source tableau, #META}>
    88                         [<dt>(#CLE)</dt>]
    89                         [<dt><pre>(#VALEUR*|print_r{1})</pre></dt>]
    90         </BOUCLE_meta>
    91                 </dl>
    92         </B_meta>
    93 
     64        [(#INCLURE{fond=liste/sphinx_documents,docs,meta,env})]
     65        [(#INCLURE{fond=liste/sphinx_facettes,facets,env})]
     66        [(#INCLURE{fond=liste/sphinx_metas,meta,env})]
    9467
    9568</BOUCLE_recherche>
    9669
    9770
    98 <h2>Debug:</h2>
    99 <pre>#GET{sql}</pre>
    100 
  • _plugins_/indexer/trunk/indexer_fonctions.php

    r82479 r82558  
    11<?php
     2/*
     3// charger les fonctions pour le compilateur SPIP
     4// boucles (PMB:NOTICES) ...
     5include_spip('iterateur/sphinx');
     6*/
    27
    38function sphinx_get_array2query($query_description, $limit=''){
     
    1419function sphinx_get_query_documents($index, $recherche, $tag = '', $auteur = '', $annee='', $orderby = '') {
    1520    include_spip('inc/indexer');
     21
     22    if (!$index) $index = SPHINX_DEFAULT_INDEX;
     23
    1624    $sq = new \Sphinx\SphinxQLQuery();
    1725    $sq
    18         ->select('WEIGHT() AS score')
    1926        ->select('*')
    2027        ->select("SNIPPET(content, " . $sq->quote($recherche . ($tag ? " $tag" : '')) . ", 'limit=200') AS snippet")
     
    2229        ->facet("properties.authors ORDER BY COUNT(*) DESC")
    2330        ->facet("properties.tags ORDER BY COUNT(*) DESC")
    24         ->facet("YEAR(date) ORDER BY date DESC")
     31        ->facet("YEAR(date) as annee ORDER BY date DESC")
    2532        ;
    2633
    2734    if (strlen($recherche)) {
     35        $sq->select('WEIGHT() AS score');
    2836        $sq->where("MATCH(" . $sq->quote($recherche) . ")");
    2937    }
  • _plugins_/indexer/trunk/lib/Sphinx/SphinxQL.php

    r82545 r82558  
    2121        **/
    2222        public function connect() {
    23                 $this->sql = new \PDO("mysql:host=" . $this->host . ";port=" . $this->port, "", "");
     23                try {
     24                        $this->sql = new \PDO("mysql:host=" . $this->host . ";port=" . $this->port, "", "");
     25                } catch (\Exception $e) {
     26                        var_dump($e->getMessage());
     27                        return false;
     28                }
     29                return true;
    2430        }
    2531
     
    2935        public function query($query) {
    3036                if (!$this->sql) {
    31                         throw new Exception('Connecteur non exécuté');
     37                        return false;
    3238                }
    3339                return $this->sql->query($query);
     
    3945        public function prepare($query) {
    4046                if (!$this->sql) {
    41                         throw new Exception('Connecteur non exécuté');
     47                        return false;
    4248                }
    4349                return $this->sql->prepare($query);
     
    4955        **/
    5056        public function allfetsel($query) {
     57                if (!$this->sql) {
     58                        return false;
     59                }
     60
    5161                $liste = [
    5262                        'docs'   => [],
     
    6979                        $liste['docs']   = array_shift($reponses);
    7080                        $liste['facets'] = $this->parseFacets($reponses);
    71                         $liste['meta']   = $this->parseMeta($meta->fetchAll(\PDO::FETCH_ASSOC));
     81                        if ($meta) {
     82                                $liste['meta']   = $this->parseMeta($meta->fetchAll(\PDO::FETCH_ASSOC));
     83                        }
    7284                } elseif ($errs = $this->sql->errorInfo()) {
    7385                        var_dump($errs);
  • _plugins_/indexer/trunk/lib/Sphinx/SphinxQLQuery.php

    r82553 r82558  
    253253        if ($this->from)     $query[] = 'FROM '     . implode(', ', $this->from);
    254254        if ($this->where)    $query[] = 'WHERE ('   . implode(') AND (', $this->where) . ')';
    255         if ($this->groupby)  $query[] = 'GROUP BY ' . implode(',', $this->groupby);
     255        if ($this->groupby)  $query[] = 'GROUP BY ' . implode(', ', $this->groupby);
    256256        if ($this->orderby)  $query[] = 'ORDER BY ' . implode(', ', $this->orderby);
    257257        if ($this->limit)    $query[] = 'LIMIT '    . $this->limit;
Note: See TracChangeset for help on using the changeset viewer.