Changeset 94438 in spip-zone


Ignore:
Timestamp:
Jan 4, 2016, 9:43:15 PM (5 years ago)
Author:
rastapopoulos@…
Message:

Une première étape pour pouvoir supprimer des contenus de l'indexation pour d'autres raisons que les histoires de statuts ignorés prévues par défaut. On ajoute donc un système de drapeau "to_delete" dans les objets Document, qu'on peut mettre à "true" pour activer la suppression.

Dans le fichier qui exécute les requêtes on n'a donc plus du tout de tests "en dur", on a uniquement le test du drapeau. Ce dernier peut être levé quand bon nous semble, dans la Source (SpipDocuments? pour les statuts) ou dans le pipeline "indexer_document" par exemple.

Au passage, dans SpipDocuments?, on ne fait plein de calculs pour tous les champs (et les jointures) QUE si c'est pas déjà à supprimer (pour le statut donc). Ce qui évite de faire mouliner le serveur pour des trucs qui seront de toute façon à supprimer.

Location:
_plugins_/indexer/trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/indexer/trunk/Sources/SpipDocuments.php

    r92775 r94438  
    100100                $doc['properties']['id_objet'] = $id;
    101101               
    102                 // Pour la source du site : config explicite sinon l'URL du site
    103                 $doc['properties']['source'] = lire_config('indexer/source', lire_config('adresse_site'));
    104                
    105                 // Pour le titre (TODO : mieux détecter, mais la déclaration de l'API est faite pour une requête SQL)
    106                 if (isset($contenu['titre'])) {
    107                         $doc['title'] = supprimer_numero($contenu['titre']);
    108                 }
    109                 elseif (isset($contenu['nom'])) {
    110                         $doc['title'] = supprimer_numero($contenu['nom']);
    111                 }
    112                 elseif (isset($contenu['nom_site'])) {
    113                         $doc['title'] = supprimer_numero($contenu['nom_site']);
    114                 }
     102                // S'il y a un statut et qu'il fait partie des statuts à ignorer
     103                // on programme ce contenu pour être supprimé de l'indexation
     104                if (
     105                        isset($this->objet)
     106                        and $statuts_ignores = lire_config('indexer/'. ($this->objet) .'/statuts_ignores')
     107                        and isset($contenu['statut'])
     108                        and in_array($contenu['statut'], $statuts_ignores)
     109                ) {
     110                        $doc['to_delete'] = true;
     111                }
     112                // Et du coup on ne fait la suite que si ce n'est pas le cas
     113                // ce qui devrait accélerer un peu les perfs
    115114                else {
    116                         $doc['title'] = '';
    117                 }
    118                
    119                 // Pour le contenu principal, on va chercher la liste des champs fulltext déclarés
    120                 if ($rechercher_champs = array_keys(objet_info($this->objet, 'rechercher_champs'))) {
    121                         $doc['content'] = '';
    122                        
    123                         foreach ($rechercher_champs as $champ) {
    124                                 // On ne remet pas le titre
    125                                 if ($champ != 'titre' and isset($contenu[$champ]) and $contenu[$champ]) {
    126                                         $doc['content'] .= "\n\n".$contenu[$champ];
     115                        // Pour la source du site : config explicite sinon l'URL du site
     116                        $doc['properties']['source'] = lire_config('indexer/source', lire_config('adresse_site'));
     117                       
     118                        // Pour le titre (TODO : mieux détecter, mais la déclaration de l'API est faite pour une requête SQL)
     119                        if (isset($contenu['titre'])) {
     120                                $doc['title'] = supprimer_numero($contenu['titre']);
     121                        }
     122                        elseif (isset($contenu['nom'])) {
     123                                $doc['title'] = supprimer_numero($contenu['nom']);
     124                        }
     125                        elseif (isset($contenu['nom_site'])) {
     126                                $doc['title'] = supprimer_numero($contenu['nom_site']);
     127                        }
     128                        else {
     129                                $doc['title'] = '';
     130                        }
     131                       
     132                        // Pour le contenu principal, on va chercher la liste des champs fulltext déclarés
     133                        if ($rechercher_champs = array_keys(objet_info($this->objet, 'rechercher_champs'))) {
     134                                $doc['content'] = '';
     135                               
     136                                foreach ($rechercher_champs as $champ) {
     137                                        // On ne remet pas le titre
     138                                        if ($champ != 'titre' and isset($contenu[$champ]) and $contenu[$champ]) {
     139                                                $doc['content'] .= "\n\n".$contenu[$champ];
     140                                        }
    127141                                }
    128142                        }
    129                 }
    130                 // Sinon on détecte les cas courants
    131                 elseif (isset($contenu['texte'])) {
    132                         $doc['content'] = $contenu['texte'];
    133                 }
    134                 elseif (isset($contenu['descriptif'])) {
    135                         $doc['content'] = $contenu['descriptif'];
    136                 }
    137                 elseif (isset($contenu['bio'])) {
    138                         $doc['content'] = $contenu['bio'];
    139                 }
    140                 else {
    141                         $doc['content'] = '';
    142                 }
    143                
    144                 // Pour le résumé, on utilise le filtre d'intro de SPIP
    145                 // = descriptif s'il existe sinon le contenu principal précédent coupé
    146                 $descriptif = isset($contenu['descriptif']) ? $contenu['descriptif'] : ''; // on s'assure que le descriptif soit bien une chaine
    147                 if ($fonction_introduction = chercher_filtre('introduction')) {
    148                         $doc['summary'] = $fonction_introduction($descriptif, $doc['content'], 400, '');
    149                 }
    150                
    151                 // Pour la date
    152                 // S'il y a un champ de date de rédaction et qu'il est utilisé, on prend en priorité à celle de publication
    153                 if (isset($contenu['date_redac']) and substr($contenu['date_redac'],0,4) != '0000') {
    154                         $doc['date'] = $contenu['date_redac'];
    155                 }
    156                 // Sinon on utilise la date de publication déclarée par l'API
    157                 elseif ($champ_date = objet_info($this->objet, 'date')) {
    158                         $doc['date'] = $contenu[$champ_date];
    159                 }
    160                 // Sinon le champ "date" tout simplement
    161                 elseif (isset($contenu['date'])) {
    162                         $doc['date'] = $contenu['date'];
    163                 }
    164                 else {
    165                         $doc['date'] = '0000-00-00 00:00:00';
    166                 }
    167                
    168                 // Et la mise-à-jour si elle existe
    169                 if (isset($contenu['date_modif']) and substr($contenu['date_modif'],0,4) != '0000') {
    170                         $doc['properties']['maj'] = $contenu['date_modif'];
    171                 }
    172                 elseif (isset($contenu['maj']) and $contenu['maj']) {
    173                         $doc['properties']['maj'] = $contenu['maj'];
    174                 }
    175                 else {
    176                         $doc['properties']['maj'] = '0000-00-00 00:00:00';
    177                 }
    178                
    179                 // S'il y a une langue
    180                 if (isset($contenu['lang'])) {
    181                         $doc['properties']['lang'] = $contenu['lang'];
    182                 }
    183                
    184                 // S'il y a un statut
    185                 if (isset($contenu['statut'])) {
    186                         $doc['properties']['statut'] = $contenu['statut'];
    187                 }
    188                
    189                 // On garde en mémoire le parent si on trouve quelque chose
    190                 if (isset($contenu['id_parent'])) {
    191                         $doc['properties']['id_parent'] = intval($contenu['id_parent']);
    192                         $doc['properties']['objet_parent'] = $this->objet;
    193                 }
    194                 elseif (isset($contenu['id_rubrique'])) {
    195                         $doc['properties']['id_rubrique'] = intval($contenu['id_rubrique']);
    196                         $doc['properties']['id_parent'] = intval($contenu['id_rubrique']);
    197                         $doc['properties']['objet_parent'] = 'rubrique';
    198                 }
    199                 // Pour les événements au moins
    200                 elseif (isset($contenu['id_article'])) {
    201                         $doc['properties']['id_article'] = intval($contenu['id_article']);
    202                         $doc['properties']['id_parent'] = intval($contenu['id_article']);
    203                         $doc['properties']['objet_parent'] = 'article';
    204                 }
    205                
    206                 // Et ensuite on tente de trouver une hiérarchie de rubriques
    207                 if (
    208                         $this->objet == 'rubrique' and $id_rubrique_enfant = $id
    209                         or isset($doc['properties']['id_rubrique']) and $id_rubrique_enfant = $doc['properties']['id_rubrique']
    210                         or isset($doc['properties']['id_article']) and $id_rubrique_enfant = intval(sql_getfetsel('id_rubrique', 'spip_articles', 'id_article ='.$doc['properties']['id_article']))
    211                 ) {
    212                         // Là normalement on a maintenant la rubrique la plus basse
    213                         $doc['properties']['parents']['ids'] = array();
    214                         $doc['properties']['parents']['titres'] = array();
    215                         $doc['properties']['parents']['ids_hierarchie'] = array();
    216                         $doc['properties']['parents']['titres_hierarchie'] = array();
    217                         while ($f = sql_fetsel(
    218                                 'id_parent, titre',
    219                                 'spip_rubriques',
    220                                 'id_rubrique = '.$id_rubrique_enfant
    221                         )){
    222                                 $titre_actuel = supprimer_numero($f['titre']);
    223                                 $id_parent = intval($f['id_parent']);
     143                        // Sinon on détecte les cas courants
     144                        elseif (isset($contenu['texte'])) {
     145                                $doc['content'] = $contenu['texte'];
     146                        }
     147                        elseif (isset($contenu['descriptif'])) {
     148                                $doc['content'] = $contenu['descriptif'];
     149                        }
     150                        elseif (isset($contenu['bio'])) {
     151                                $doc['content'] = $contenu['bio'];
     152                        }
     153                        else {
     154                                $doc['content'] = '';
     155                        }
     156                       
     157                        // Pour le résumé, on utilise le filtre d'intro de SPIP
     158                        // = descriptif s'il existe sinon le contenu principal précédent coupé
     159                        $descriptif = isset($contenu['descriptif']) ? $contenu['descriptif'] : ''; // on s'assure que le descriptif soit bien une chaine
     160                        if ($fonction_introduction = chercher_filtre('introduction')) {
     161                                $doc['summary'] = $fonction_introduction($descriptif, $doc['content'], 400, '');
     162                        }
     163                       
     164                        // Pour la date
     165                        // S'il y a un champ de date de rédaction et qu'il est utilisé, on prend en priorité à celle de publication
     166                        if (isset($contenu['date_redac']) and substr($contenu['date_redac'],0,4) != '0000') {
     167                                $doc['date'] = $contenu['date_redac'];
     168                        }
     169                        // Sinon on utilise la date de publication déclarée par l'API
     170                        elseif ($champ_date = objet_info($this->objet, 'date')) {
     171                                $doc['date'] = $contenu[$champ_date];
     172                        }
     173                        // Sinon le champ "date" tout simplement
     174                        elseif (isset($contenu['date'])) {
     175                                $doc['date'] = $contenu['date'];
     176                        }
     177                        else {
     178                                $doc['date'] = '0000-00-00 00:00:00';
     179                        }
     180                       
     181                        // Et la mise-à-jour si elle existe
     182                        if (isset($contenu['date_modif']) and substr($contenu['date_modif'],0,4) != '0000') {
     183                                $doc['properties']['maj'] = $contenu['date_modif'];
     184                        }
     185                        elseif (isset($contenu['maj']) and $contenu['maj']) {
     186                                $doc['properties']['maj'] = $contenu['maj'];
     187                        }
     188                        else {
     189                                $doc['properties']['maj'] = '0000-00-00 00:00:00';
     190                        }
     191                       
     192                        // S'il y a une langue
     193                        if (isset($contenu['lang'])) {
     194                                $doc['properties']['lang'] = $contenu['lang'];
     195                        }
     196                       
     197                        // S'il y a un statut
     198                        if (isset($contenu['statut'])) {
     199                                $doc['properties']['statut'] = $contenu['statut'];
     200                        }
     201                       
     202                        // On garde en mémoire le parent si on trouve quelque chose
     203                        if (isset($contenu['id_parent'])) {
     204                                $doc['properties']['id_parent'] = intval($contenu['id_parent']);
     205                                $doc['properties']['objet_parent'] = $this->objet;
     206                        }
     207                        elseif (isset($contenu['id_rubrique'])) {
     208                                $doc['properties']['id_rubrique'] = intval($contenu['id_rubrique']);
     209                                $doc['properties']['id_parent'] = intval($contenu['id_rubrique']);
     210                                $doc['properties']['objet_parent'] = 'rubrique';
     211                        }
     212                        // Pour les événements au moins
     213                        elseif (isset($contenu['id_article'])) {
     214                                $doc['properties']['id_article'] = intval($contenu['id_article']);
     215                                $doc['properties']['id_parent'] = intval($contenu['id_article']);
     216                                $doc['properties']['objet_parent'] = 'article';
     217                        }
     218                       
     219                        // Et ensuite on tente de trouver une hiérarchie de rubriques
     220                        if (
     221                                $this->objet == 'rubrique' and $id_rubrique_enfant = $id
     222                                or isset($doc['properties']['id_rubrique']) and $id_rubrique_enfant = $doc['properties']['id_rubrique']
     223                                or isset($doc['properties']['id_article']) and $id_rubrique_enfant = intval(sql_getfetsel('id_rubrique', 'spip_articles', 'id_article ='.$doc['properties']['id_article']))
     224                        ) {
     225                                // Là normalement on a maintenant la rubrique la plus basse
     226                                $doc['properties']['parents']['ids'] = array();
     227                                $doc['properties']['parents']['titres'] = array();
     228                                $doc['properties']['parents']['ids_hierarchie'] = array();
     229                                $doc['properties']['parents']['titres_hierarchie'] = array();
     230                                while ($f = sql_fetsel(
     231                                        'id_parent, titre',
     232                                        'spip_rubriques',
     233                                        'id_rubrique = '.$id_rubrique_enfant
     234                                )){
     235                                        $titre_actuel = supprimer_numero($f['titre']);
     236                                        $id_parent = intval($f['id_parent']);
     237                                       
     238                                        // On ajoute ce parent suivant au début du tableau
     239                                        array_unshift($doc['properties']['parents']['ids'], $id_rubrique_enfant);
     240                                        $doc['properties']['parents']['titres'] = array_merge(array($id_rubrique_enfant=>$titre_actuel), $doc['properties']['parents']['titres']);
     241                                       
     242                                        // On passe au parent suivant
     243                                        $id_rubrique_enfant = $id_parent;
     244                                }
     245                                // C'est seulement une fois qu'on a tous les titres qu'on peut réussir à construire les bons hashs
     246                                foreach ($doc['properties']['parents']['titres'] as $titre) {
     247                                        $id_hierarchie = indexer_id_hierarchie($doc['properties']['parents']['titres_hierarchie'], $titre);
     248                                        $doc['properties']['parents']['ids_hierarchie'][] = $id_hierarchie;
     249                                        $doc['properties']['parents']['titres_hierarchie'][$id_hierarchie] = $titre;
     250                                }
    224251                               
    225                                 // On ajoute ce parent suivant au début du tableau
    226                                 array_unshift($doc['properties']['parents']['ids'], $id_rubrique_enfant);
    227                                 $doc['properties']['parents']['titres'] = array_merge(array($id_rubrique_enfant=>$titre_actuel), $doc['properties']['parents']['titres']);
    228                                
    229                                 // On passe au parent suivant
    230                                 $id_rubrique_enfant = $id_parent;
    231                         }
    232                         // C'est seulement une fois qu'on a tous les titres qu'on peut réussir à construire les bons hashs
    233                         foreach ($doc['properties']['parents']['titres'] as $titre) {
    234                                 $id_hierarchie = indexer_id_hierarchie($doc['properties']['parents']['titres_hierarchie'], $titre);
    235                                 $doc['properties']['parents']['ids_hierarchie'][] = $id_hierarchie;
    236                                 $doc['properties']['parents']['titres_hierarchie'][$id_hierarchie] = $titre;
    237                         }
    238                        
    239                         // On ajoute la branche dans le fulltext
    240                         $doc['content'] .= "\n\n".join(' | ', $doc['properties']['parents']['titres']);
    241                 }
    242                
    243                 // On cherche les jointures pour cet objet
    244                 // Pour chaque, on va déléguer à une fonction dédiée pour plus de lisibilité, et en plus ça permet d'être surchargeable
    245                 foreach (indexer_lister_jointures($this->objet) as $jointure) {
    246                         if (
    247                                 lire_config('indexer/'.$this->objet.'/jointure_'.$jointure.'/activer') // indexer/article/jointure_auteurs/activer=oui
    248                                 and $jointure_fonction = charger_fonction( // indexer_jointure_auteurs()
    249                                         'jointure_'.$jointure,
    250                                         'indexer',
    251                                         true
    252                                 )
    253                         ) {
    254                                 $doc = $jointure_fonction($this->objet, $id, $doc);
    255                         }
    256                 }
    257                
    258                 // Transformation UTF-8
    259                 include_spip('inc/charsets');
    260                 $doc['title'] = unicode_to_utf_8(html2unicode($doc['title']));
    261                 $doc['content'] = unicode_to_utf_8(html2unicode($doc['content']));
    262                 $doc['summary'] = unicode_to_utf_8(html2unicode($doc['summary']));
     252                                // On ajoute la branche dans le fulltext
     253                                $doc['content'] .= "\n\n".join(' | ', $doc['properties']['parents']['titres']);
     254                        }
     255                       
     256                        // On cherche les jointures pour cet objet
     257                        // Pour chaque, on va déléguer à une fonction dédiée pour plus de lisibilité, et en plus ça permet d'être surchargeable
     258                        foreach (indexer_lister_jointures($this->objet) as $jointure) {
     259                                if (
     260                                        lire_config('indexer/'.$this->objet.'/jointure_'.$jointure.'/activer') // indexer/article/jointure_auteurs/activer=oui
     261                                        and $jointure_fonction = charger_fonction( // indexer_jointure_auteurs()
     262                                                'jointure_'.$jointure,
     263                                                'indexer',
     264                                                true
     265                                        )
     266                                ) {
     267                                        $doc = $jointure_fonction($this->objet, $id, $doc);
     268                                }
     269                        }
     270                       
     271                        // Transformation UTF-8
     272                        include_spip('inc/charsets');
     273                        $doc['title'] = unicode_to_utf_8(html2unicode($doc['title']));
     274                        $doc['content'] = unicode_to_utf_8(html2unicode($doc['content']));
     275                        $doc['summary'] = unicode_to_utf_8(html2unicode($doc['summary']));
     276                }
    263277               
    264278                // On crée le Document avec les infos
  • _plugins_/indexer/trunk/lib/Indexer/Sources/Document.php

    r92135 r94438  
    1212        public $uri = '';
    1313        public $properties = array();
     14        public $to_delete = false;
    1415
    1516        public function __construct($data) {
  • _plugins_/indexer/trunk/lib/Indexer/Storage/Sphinx.php

    r92963 r94438  
    3131                        // On vérifie qu'il y a bien un Document
    3232                        if ($document and $document instanceof \Indexer\Sources\Document) {
    33 
    34                                 // effacer les documents ayant un statut ignore
    35                                 if (
    36                                         isset($document->properties['objet'])
    37                                         and $statuts_ignores = lire_config('indexer/'. ($document->properties['objet']) .'/statuts_ignores')
    38                                         and isset($document->properties['statut'])
    39                                         and in_array($document->properties['statut'], $statuts_ignores)
    40                                 ) {
     33                                // Effacer les documents ayant un drapeau "to_delete"
     34                                if ($document->to_delete === true) {
    4135                                        $q = "DELETE FROM $this->indexName WHERE id=".$document->id;
    42                                 }
    43                                 else {
     36                                } else {
    4437                                        $data = $this->reformatDocument($document);
    4538                                        $data = array_map(array($this->sphinxql, 'escape_string'), $data);
    4639                                        $q = $query . "('" . implode("', '", $data) . "')";
    4740                                }
    48 
    49 spip_log($q, 'indexer');
    50 
     41                               
    5142                                if (!$this->sphinxql->query($q)) {
    5243                                        spip_log($this->sphinxql->errors(), 'indexer');
    5344                                        spip_log($q, 'indexer');
     45                                       
    5446                                        return false;
    5547                                }
     
    9183        public function reformatDocument(Document $document) {
    9284                return array(
    93                         "id"         => $document->id,
    94                         "title"      => $document->title,
    95                         "summary"    => $document->summary,
    96                         "content"    => $document->content,
    97                         "date"       => strtotime($document->date),
     85                        "id"              => $document->id,
     86                        "title"           => $document->title,
     87                        "summary"         => $document->summary,
     88                        "content"         => $document->content,
     89                        "date"            => strtotime($document->date),
    9890                        "date_indexation" => intval($document->date_indexation),
    99                         "uri"        => $document->uri,
    100                         "properties" => json_encode($document->properties),
    101                         "signature"  => $this->signer($document),
     91                        "uri"             => $document->uri,
     92                        "properties"      => json_encode($document->properties),
     93                        "signature"       => $this->signer($document),
    10294                );
    10395        }
  • _plugins_/indexer/trunk/paquet.xml

    r94426 r94438  
    22        prefix="indexer"
    33        categorie="navigation"
    4         version="2.6.0"
     4        version="2.7.0"
    55        etat="test"
    66        compatibilite="[3.0.0;3.1.*]"
Note: See TracChangeset for help on using the changeset viewer.