source: spip-zone/_plugins_/indexer/trunk/inc/indexer.php @ 92400

Last change on this file since 92400 was 92400, checked in by rastapopoulos@…, 4 years ago

On ajoute une commande spip-cli pour lancer l'indexation complète. Attention : pour l'instant c'est vraiment juste à l'arrache en appelant la classe faite par Marcimat qui est conçue uniquement pour la lancer en mode web HTML. Donc il faudrait le refaire en mieux, avec une barre de progression spip-cli, etc. Mais bon déjà ça permet de le lancer en shell et ça indexe bien tout…

File size: 4.0 KB
Line 
1<?php
2
3if (!defined('_ECRIRE_INC_VERSION')) return;
4
5// Constantes pour connexion à Sphinx
6defined('SPHINX_SERVER_HOST')   || define('SPHINX_SERVER_HOST', '127.0.0.1');
7defined('SPHINX_SERVER_PORT')   || define('SPHINX_SERVER_PORT', 9306);
8defined('SPHINX_DEFAULT_INDEX') || define('SPHINX_DEFAULT_INDEX', 'spip');
9
10// Charge les classes possibles de l'indexer
11if (!class_exists('Composer\\Autoload\\ClassLoader')) {
12        require_once _DIR_PLUGIN_INDEXER . 'lib/Composer/Autoload/ClassLoader.php';
13}
14
15$loader = new \Composer\Autoload\ClassLoader();
16
17// register classes with namespaces
18$loader->add('Indexer', _DIR_PLUGIN_INDEXER . 'lib');
19$loader->add('Sphinx',  _DIR_PLUGIN_INDEXER . 'lib');
20$loader->addPsr4('Spip\\Indexer\\Sources\\',  _DIR_PLUGIN_INDEXER . 'Sources');
21
22$loader->register();
23
24/**
25 * Renvoyer un indexeur configuré avec un (et peut-être un jour plusieurs) lieu de stockage des choses à indexer
26 *
27 * Par défaut renvoie l'indexeur avec le stockage Sphinx intégré en interne et les paramètres des define()
28 *
29 * @pipeline_appel indexer_indexer
30 * @return Retourne un objet Indexer, ayant été configuré avec la méthode registerStorage()
31 */
32function indexer_indexer(){
33        static $indexer = null;
34       
35        if (is_null($indexer)){
36                // On crée un indexeur
37                $indexer = new Indexer\Indexer();
38       
39                // On tente de le configurer avec Sphinx et les define()
40                try {
41                        $indexer->registerStorage(
42                                new Indexer\Storage\Sphinx(
43                                        new Sphinx\SphinxQL\SphinxQL(SPHINX_SERVER_HOST, SPHINX_SERVER_PORT),
44                                        SPHINX_DEFAULT_INDEX
45                                )
46                        );
47                } catch( \Exception $e ) {
48                        if (!$message = $e->getMessage()) {
49                                $message = _L('Erreur inconnue');
50                        }
51                        die("<p class='erreur'>$message</p>");
52                }
53               
54                // On le fait passer dans un pipeline
55                $indexer = pipeline('indexer_indexer', $indexer);
56        }
57       
58        return $indexer;
59}
60
61/**
62 * Renvoyer les sources de données disponibles dans le site
63 *
64 * Un pipeline "indexer_sources" est appelée avec la liste par défaut, permettant de retirer ou d'ajouter des sources.
65 *
66 * @pipeline_appel indexer_sources
67 * @return Sources Retourne un objet Sources listant les sources enregistrées avec la méthode register()
68 */
69function indexer_sources(){
70        static $sources = null;
71       
72        if (is_null($sources)){
73                include_spip('base/objets');
74                include_spip('inc/config');
75               
76                // On crée la liste des sources
77                $sources = new Indexer\Sources\Sources();
78               
79                // On ajoute chaque objet configuré aux sources à indexer
80                // Par défaut on enregistre les articles s'il n'y a rien
81                foreach (lire_config('indexer/sources_objets', array('spip_articles')) as $table) {
82                        if ($table) {
83                                $sources->register(
84                                        table_objet($table),
85                                        new Spip\Indexer\Sources\SpipDocuments(objet_type($table))
86                                );
87                        }
88                }
89               
90                // On passe les sources dans un pipeline
91                $sources = pipeline('indexer_sources', $sources);
92        }
93       
94        return $sources;
95}
96
97/**
98 * Indexer une partie des documents d'une source.
99 *
100 * Cette fonction est utilisable facilement pour programmer un job.
101 *
102 * @param string $alias_de_sources Alias donné à la source enregistrée dans les Sources du site
103 * @param mixed $start Début des documents à indexer
104 * @param mixed $end Fin des documents à indexer
105 * @return void
106 */
107function indexer_job_indexer_source($alias_de_sources, $start, $end){
108        // On va chercher l'indexeur du SPIP
109        $indexer = indexer_indexer();
110        // On va chercher les sources du SPIP
111        $sources = indexer_sources();
112        // On récupère celle demandée en paramètre
113        $source = $sources->getSource($alias_de_sources);
114        // On va chercher les documents à indexer
115        $documents = $source->getDocuments($start, $end);
116        // Et on le remplace (ou ajoute) dans l'indexation
117        $res = $indexer->replaceDocuments($documents);
118
119        // en cas d'erreur, on se reprogramme pour une autre fois
120        if (!$res) {
121                job_queue_add(
122                        'indexer_job_indexer_source',
123                        "Replan indexation $alias_de_sources $start $end",
124                        array($alias_de_sources, $start, $end, uniqid()),
125                        'inc/indexer',
126                        false, // duplication possible car ce job-ci n'est pas encore nettoyé
127                        time() + 15*60, // attendre 15 minutes
128                        -10 // priorite basse
129                );
130        }
131}
Note: See TracBrowser for help on using the repository browser.