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

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

Tout comme pour indexer_sources(), on déporte la récupération d'un indexeur valide dans une fonction indexer_indexer() utilisable plusieurs fois.

On s'insère dans le pipeline "post_edition", et dès qu'il y a une modif sur un objet, on cherche si on a une ou plusieurs de nos sources enregistrées qui correspondent à l'objet en cours d'édition.

Si c'est le cas, on appelle l'indexeur et on lui donne à remplacer (ou ajouter) le document issu de la source en question (ou des sources).

Sans rien toucher, le mécanisme teste avec l'alias donné à la source ("articles", "fiches", etc) MAIS si on veut un truc plus bizarre, ou surtout si on a plusieurs sources différentes travaillant sur le même type d'objet, alors la classe de source peut implémenter une méthode getObjet() qui doit retourner "patate" (par exemple).

Testé aussi sur un objet non-spip, pour l'instant ça marche.

Là on réindexe le doc directement dans le pipeline, et ça ne me parait pas lent. Si on trouve que ça gêne, on pourra déporter l'indexation dans un job. Mais pour l'instant ça m'a l'air d'aller.

File size: 2.4 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
11require_once _DIR_PLUGIN_INDEXER . 'lib/Composer/Autoload/ClassLoader.php';
12
13$loader = new \Composer\Autoload\ClassLoader();
14
15// register classes with namespaces
16$loader->add('Indexer', _DIR_PLUGIN_INDEXER . 'lib');
17$loader->add('Sphinx',  _DIR_PLUGIN_INDEXER . 'lib');
18$loader->addPsr4('Spip\\Indexer\\Sources\\',  _DIR_PLUGIN_INDEXER . 'Sources');
19
20$loader->register();
21
22/**
23 * Renvoyer un indexeur configuré avec un (et peut-être un jour plusieurs) lieu de stockage des choses à indexer
24 *
25 * Par défaut renvoie l'indexeur avec le stockage Sphinx intégré en interne et les paramètres des define()
26 *
27 * @pipeline_appel indexer_indexer
28 * @return Retourne un objet Indexer, ayant été configuré avec la méthode registerStorage()
29 */
30function indexer_indexer(){
31        static $indexer = null;
32       
33        if (is_null($indexer)){
34                // On crée un indexeur
35                $indexer = new Indexer\Indexer();
36       
37                // On tente de le configurer avec Sphinx et les define()
38                try {
39                        $indexer->registerStorage(
40                            new Indexer\Storage\Sphinx(
41                                new Sphinx\SphinxQL\SphinxQL(SPHINX_SERVER_HOST, SPHINX_SERVER_PORT), SPHINX_DEFAULT_INDEX)
42                        );
43                } catch( \Exception $e ) {
44                        if (!$message = $e->getMessage())
45                            $message = _L('Erreur inconnue');
46                        die("<p class='erreur'>$message</p>");
47                }
48               
49                // On le fait passer dans un pipeline
50                $indexer = pipeline('indexer_indexer', $indexer);
51        }
52       
53        return $indexer;
54}
55
56/**
57 * Renvoyer les sources de données disponibles dans le site
58 *
59 * Un pipeline "indexer_sources" est appelée avec la liste par défaut, permettant de retirer ou d'ajouter des sources.
60 *
61 * @pipeline_appel indexer_sources
62 * @return Sources Retourne un objet Sources listant les sources enregistrées avec la méthode register()
63 */
64function indexer_sources(){
65        static $sources = null;
66       
67        if (is_null($sources)){
68                // On crée la liste des sources
69                $sources = new Indexer\Sources\Sources();
70                // Par défaut on enregistre les articles du SPIP
71                $sources->register('articles', new Spip\Indexer\Sources\Articles());
72                // On passe les sources dans un pipeline
73                $sources = pipeline('indexer_sources', $sources);
74        }
75       
76        return $sources;
77}
Note: See TracBrowser for help on using the repository browser.