1
0
mirror of https://github.com/php/web-php.git synced 2026-03-23 23:02:13 +01:00

Switching search backend from Yahoo to Bing.

and to head off the inevitable bitching about this, it
is because the Yahoo BOSS v1 API we are using is going
away on July 20 and Yahoo was not willing to give us
free access to the new v2 API. It would end up costing
us about $600/year at our current usage pattern.
The new Google REST API would cost us about $7500/year.
The Bing API is free.
This commit is contained in:
Rasmus Lerdorf
2011-07-14 05:24:48 +00:00
parent ee468d1349
commit 9fd1bae95f
3 changed files with 38 additions and 30 deletions

BIN
images/bing.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@@ -71,9 +71,10 @@ $end_result = $s + $res['ResultSet']['totalResultsReturned'] - ($s<2 || $res['Re
$results_count = ($res['ResultSet']['totalResultsAvailable'] < 100 ? $res['ResultSet']['totalResultsAvailable'] : 'more than 100');
$disp_start_result = $start_result + 1;
$disp_end_result = $end_result + 1;
echo <<<EOB
<h2>Showing results $start_result to $end_result of $results_count</h2>
<h2>Showing results $disp_start_result to $disp_end_result of $results_count</h2>
<ul id="search-results">
EOB;
$pos = $res['ResultSet']['firstResultPosition'];
@@ -131,9 +132,8 @@ EOB;
}
echo <<<EOB
</ul>
<span style="margin-left: 3em; margin-top: 1em; float: left;"><a href="http://developer.yahoo.net/about">
<img src="http://l.yimg.com/a/i/us/nt/bdg/websrv_120_1.gif" border="0">
</a></span>
<span style="margin-left: 3em; margin-top: 1em; float: left; font-family: Verdana, Tahoma, Helvetica, Arial;
font-size: 11px; color:#555;">Results by <img src="/images/bing.png"/></span>
<div id="results_nav"><h4>Results Page:</h4>
<ul id="results_nav_list">
EOB;

58
ws.php
View File

@@ -1,17 +1,18 @@
<?php
if(!$conf=apc_fetch('ws_config')) {
include '/local/Web/ws.conf';
apc_store('ws_config',$conf);
include 'include/languages.inc';
if(!$conf=apc_fetch('ws2_config')) {
include '/local/Web/ws2.conf';
apc_store('ws2_config',$conf);
}
$raw = filter_input(INPUT_GET, 'q', FILTER_UNSAFE_RAW);
$q = urlencode($raw);
$r = isset($_REQUEST['results']) ? (int)$_REQUEST['results'] : 10;
$s = isset($_REQUEST['start']) ? (int)$_REQUEST['start'] : 1;
$l = isset($_REQUEST['lang']) ? htmlspecialchars($_REQUEST['lang']) : 'en';
$m = isset($_REQUEST['mirror']) ? htmlspecialchars($_REQUEST['mirror']) : '';
$l = isset($_REQUEST['lang']) ? htmlspecialchars($_REQUEST['lang'], ENT_QUOTES) : 'en';
$m = isset($_REQUEST['mirror']) ? htmlspecialchars($_REQUEST['mirror'], ENT_QUOTES) : '';
$sites = array( 'all'=>'php.net',
'local'=>'www.php.net',
'manual'=>'www.php.net',
'manual'=>"www.php.net/manual/$l",
'news'=>'news.php.net',
'bugs'=>'bugs.php.net',
'pear'=>'pear.php.net',
@@ -19,41 +20,48 @@ $sites = array( 'all'=>'php.net',
'talks'=>'talks.php.net',
);
$market = 'en-us';
if(!empty($LANGUAGES_MAP[$l])) $market = $LANGUAGES_MAP[$l];
if(isset($sites[$_REQUEST['profile']])) {
$scope = $_REQUEST['profile'];
$scope = htmlspecialchars($_REQUEST['profile'], ENT_QUOTES);
// If they are doing a manual search in a language we don't have a translation for, default to English
if($scope == 'manual' && empty($ACTIVE_ONLINE_LANGUAGES[$l])) {
$sites['manual'] = "www.php.net/manual/en";
}
} else {
$scope = 'all';
$scope = 'all';
}
$request = "{$conf['svc']}$q?appid={$conf['appid']}&start=$s&count=$r&sites={$sites[$scope]}&lang=$l&format=json";
$request = "{$conf['svc']}?appid={$conf['appid']}&query=$q%20site:{$sites[$scope]}&version=2.2&Sources=Web&web.offset=$s&web.count=$r&market=$market";
$data = @file_get_contents($request);
list($version,$status_code,$msg) = explode(' ',$http_response_header[0], 3);
if($status_code==200) echo ws_boss_massage($data);
if($status_code==200) echo ws_bing_massage($data);
else echo serialize($http_response_header[0]);
function ws_boss_massage($data) {
function ws_bing_massage($data) {
$results = json_decode($data, true);
$rsp = $results['ysearchresponse'];
$set = $rsp['resultset_web'];
$rsp = $results['SearchResponse']['Web'];
$set = $rsp['Results'];
$massaged = array(
'ResultSet' => array(
'totalResultsAvailable' => $rsp['totalhits'],
'totalResultsReturned' => $rsp['count'],
'firstResultPosition' => $rsp['start'],
'totalResultsAvailable' => $rsp['Total'],
'totalResultsReturned' => count($set),
'firstResultPosition' => $rsp['Offset'],
'Result' => array(),
),
);
foreach ($set as $result) {
$massaged['ResultSet']['Result'][] = array(
'Title' => $result['title'],
'Summary' => $result['abstract'],
'Url' => $result['url'],
'ClickUrl' => $result['clickurl'],
'MimeType' => NULL, // Not returned from BOSS
'ModificationDate' => strtotime($result['date']),
'Cache' => NULL, // Not returned from BOSS
'Title' => $result['Title'],
'Summary' => $result['Description'],
'Url' => $result['Url'],
'ClickUrl' => $result['Url'],
'MimeType' => NULL, // Not returned by Bing
'ModificationDate' => strtotime($result['DateTime']),
'Cache' => $result['CacheUrl']
);
}
@@ -64,8 +72,8 @@ $dbh = new PDO('mysql:host=localhost;dbname=ws', $conf['db_user'], $conf['db_pw'
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true));
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try {
$stmt = $dbh->prepare("INSERT INTO log (query,profile,mirror) VALUES (:query,:profile,:mirror)");
$stmt->execute(array(':query'=>$raw,':profile'=>$scope,':mirror'=>$m));
$stmt = $dbh->prepare("INSERT INTO log (query,profile,mirror,lang) VALUES (:query,:profile,:mirror,:lang)");
$stmt->execute(array(':query'=>$raw,':profile'=>$scope,':mirror'=>$m,':lang'=>$l));
} catch (PDOException $e) {
}