source: spip-zone/_plugins_/_stable_/yagloo/inc/prepare_recherche.php @ 26527

Last change on this file since 26527 was 26527, checked in by fil@…, 11 years ago

passer la key

File size: 7.0 KB
Line 
1<?php
2
3
4@define('_DELAI_CACHE_RECHERCHES',600);
5
6// Preparer les listes id_article IN (...) pour les parties WHERE
7// et points =  des requetes du moteur de recherche
8function inc_prepare_recherche($recherche, $table='articles', $cond=false, $serveur='') {
9        static $cache = array();
10
11        // Liste des services de recherche connus
12        $services = array('boss', 'google');
13
14        // Si on n'est pas configure, revenir a la recherche normale
15        if (!$config = lire_config('yagloo')
16        OR !in_array($config['service'], $services)) {
17                include_once _DIR_RESTREINT.'inc/prepare_recherche.php';
18                return inc_prepare_recherche_dist($recherche, $table, $cond, $serveur);
19        }
20
21        // si recherche n'est pas dans le contexte, on va prendre en globals
22        // ca permet de faire des inclure simple.
23        $recherche = trim($recherche);
24        if (!strlen($recherche) AND isset($GLOBALS['recherche']))
25                $recherche = trim($GLOBALS['recherche']);
26
27        // traiter le cas {recherche?}
28        if ($cond AND !strlen($recherche))
29                return array("''" /* as points */, /* where */ '1');
30
31        // si on n'a pas encore traite les donnees
32        if (!isset($cache[$recherche])) {
33
34                spip_timer('recherche '.$config['service']);
35
36                // Ici il faut indiquer toutes les tables potentiellement {recherche}
37                $liste_index_tables = array(
38                        'articles' => 'id_article',
39                        'auteurs' => 'id_auteur',
40                        'breves' => 'id_breve',
41                        'mots' => 'id_mot',
42                        'rubriques' => 'id_rubrique'
43                );
44
45                // tester/nettoyer le cache de cette recherche
46                $hashes = array();
47                foreach ($liste_index_tables as $type => $_id) {
48                        $table_abreg = $type;
49                        $hash = substr(md5($recherche . $table_abreg),0,16);
50                        $cache[$recherche][$table_abreg] = array("resultats.points as points","recherche='$hash'");
51                        $hashes[] = $hash;
52                }
53
54                if (!$row = sql_fetsel('UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(maj) AS fraicheur','spip_resultats',
55                sql_in('recherche', $hashes),'','fraicheur DESC','0,1','',$serveur)
56                OR $row['fraicheur'] > _DELAI_CACHE_RECHERCHES) {
57
58                        $tab_couples = array();
59
60
61                        $domains = preg_replace(',^https?://,', '', $GLOBALS['meta']['adresse_site']);
62
63                        $yagloo = 'Yagloo_recherche_'.$config['service'];
64                        $key = $config[$config['service'].'key'];
65                        $results = $yagloo($recherche, $domains, $key);
66
67                        $urls = array();
68                        $preg = ',^http://'.preg_quote($domains).'(/.+?)(\.html)?$,S';
69                        foreach($results as $i => $url) {
70                                if (preg_match($preg, $url, $regs)
71                                AND !isset($urls[$regs[1]])) {
72                                        $urls[$regs[1]] = 1.8*count($results)-$i;
73                                }
74                        }
75
76                        // rechercher le contexte correspondant
77                        spip_connect();
78                        if (!$f = generer_url_entite())
79                                $f = 'recuperer_parametres_url';
80
81                        $save = $GLOBALS['contexte'];
82                        $points = array();
83                        foreach($urls as $url => $score) {
84                                $f($fond, $url);
85                                foreach ($liste_index_tables as $type => $_id) {
86                                        if (isset($GLOBALS['contexte'][$_id])) {
87                                                $id = $GLOBALS['contexte'][$_id];
88                                                $points[$type][$id] = $score;
89                                        }
90                                }
91                        }
92
93                        /* modification des points pour les articles selon leur age */
94                        if (is_array($points['articles'])) {
95                                $s = sql_select('id_article,date_redac', 'spip_articles',
96                                        sql_in('id_article', array_keys($points['articles'])));
97                                while ($t = sql_fetch($s)) {
98                                        $points['articles'][$t['id_article']] *= (strtotime($t['date_redac']) - strtotime('1990-01')) / 100000000;
99                                }
100                        }
101
102
103                        foreach ($points as $type => $scores) {
104                                $ttable = 'spip_'.$type;
105                                $table_abreg = $type;
106                                $hash = substr(md5($recherche . $table_abreg),0,16);
107
108                                if (!count($scores)) {
109                                        $cache[$recherche][$ttable] = array("''", '0');
110                                } else {
111                                        foreach ($scores as $id => $score)
112                                                $tab_couples[] = array(
113                                                        'recherche' => $hash,
114                                                        'id' => $id,
115                                                        'points' => $score
116                                                );
117                                }
118                        }
119
120                        // Aucune reponse : le noter
121                        if (!count($tab_couples))
122                                $tab_couples[] = array(
123                                        'recherche' => $hashes[0],
124                                        'id' => 0,
125                                        'points' => 0
126                                );
127
128
129                        // supprimer les anciens resultats de cette recherche
130                        // et les resultats trop vieux avec une marge
131                        sql_delete('spip_resultats',
132                        '(maj<DATE_SUB(NOW(), INTERVAL '.(_DELAI_CACHE_RECHERCHES+100)." SECOND)) OR ". sql_in('recherche', $hashes),
133                        $serveur);
134
135                        // Inserer les reponses
136                        sql_insertq_multi('spip_resultats', $tab_couples, array(),$serveur);
137
138                        spip_log("recherche ".$config['service']." ($recherche) ".spip_timer("recherche ".$config['service']), 'indexation');
139                }
140        }
141
142        if ($val = $cache[$recherche][$table])
143                return $val;
144        return array("0 as points", '0=1');
145}
146
147function Yagloo_boss_decode($r) {
148        if ($r = json_decode($r)
149        AND $r = $r->ysearchresponse
150        AND $r->totalhits > 0
151        AND $r->responsecode == 200) {
152                foreach($r->resultset_web AS $item) {
153                        $results[] = $item->url;
154                };
155                return array($r->totalhits, $results);
156        }
157        return array(0,array());
158}
159function Yagloo_google_decode($r) {
160        if ($r = json_decode($r)
161        AND $r->responseStatus == 200
162        AND $r = $r->responseData
163        AND $r->cursor->estimatedResultCount > 0
164        ) {
165                foreach($r->results AS $item) {
166                        $results[] = $item->url;
167                };
168                return array($r->cursor->estimatedResultCount, $results);
169        }
170        return array(0,array());
171}
172
173function Yagloo_recherche_api($urlapi, $page, $maxpages, $json_decode) {
174        list($total, $results) = $json_decode(recuperer_page($urlapi));
175
176        if ($total > count($results)) {
177                $ping = min($maxpages, ceil(($total - count($results)) / $page));
178                $urls = array();
179                for ($i=1; $i<= $ping; $i++)
180                        $urls[] = $urlapi . '&start=' . ($i * $page);
181
182                foreach(Yagloo_recuperer_pages($urls) as $r) {
183                        list(,$z) = $json_decode($r);
184                        $results = array_merge($results, $z);
185                }
186        }
187
188        return $results;
189}
190
191function Yagloo_recherche_boss($recherche, $domains='', $key='') {
192        $api = 'http://boss.yahooapis.com/ysearch/web/v1/';
193        $page = 50;
194        $urlapi = $api . urlencode($recherche) . '?appid=' . $key
195                . '&format=json&sites=' . urlencode($domains) . '&count=' . $page;
196
197        return Yagloo_recherche_api($urlapi, $page, 14, 'Yagloo_boss_decode');
198}
199
200function Yagloo_recherche_google($recherche, $domains='', $key='') {
201        $api = 'http://ajax.googleapis.com/ajax/services/search/web?v=1.0&rsz=large';
202        $urlapi = $api . '&q=site:' . urlencode($domains) . '+' . urlencode($recherche);
203        if ($key)
204                $urlapi .= '&key='.urlencode($key);
205        if (strlen($GLOBALS['spip_lang']))
206                $urlapi .= '&hl=' . $GLOBALS['spip_lang'];
207
208        return Yagloo_recherche_api($urlapi, 8, 8, 'Yagloo_google_decode');
209}
210
211// Charge plusieurs URLs en parallele
212function Yagloo_recuperer_pages($urls = array()) {
213        $ch = $res = array();
214        $mh = curl_multi_init();
215
216        foreach($urls as $url) {
217                $ch[$url] = curl_init();
218                curl_setopt($ch[$url], CURLOPT_URL, $url);
219                curl_setopt($ch[$url], CURLOPT_HEADER, 0);
220                curl_setopt($ch[$url], CURLOPT_RETURNTRANSFER, true);
221                curl_setopt($ch[$url], CURLOPT_REFERER,
222                $GLOBALS['meta']['adresse_site'].'/');
223                curl_setopt($ch[$url], CURLOPT_USERAGENT,
224                "SPIP-".$GLOBALS['spip_version_affichee']." (http://www.spip.net/)");
225                curl_multi_add_handle($mh, $ch[$url]);
226                spip_log('Recuperer '.$url);
227        }
228 
229        $running=null;
230        do {
231                curl_multi_exec($mh,$running);
232        } while ($running > 0);
233
234        foreach($ch as $url => $c) {
235                $res[$url] = curl_multi_getcontent($c);
236                curl_multi_remove_handle($mh, $c);
237        }
238        curl_multi_close($mh);
239
240        return $res;
241}
242
Note: See TracBrowser for help on using the repository browser.