Google自定义搜索 - 查询数据库/ API?

时间:2015-02-11 13:31:03

标签: php xml json rest google-search-api

我们对在我们的项目中使用Google自定义搜索/ Google感兴趣,主要是因为它在共轭和&amp ;;纠正拼写错误的单词。

我们知道它可以用JSON或XML返回数据,我们对此很好。但找到问题的答案:

我们可以使用这种结合和错误修正并搜索我们自己的数据库/ api吗?

如果您输入drnks with no alcohol,它会自动更正为drinks with no alcohol,然后像这样搜索我们的数据库:

http://example.com?search=drinks&alcohol=0,它可以这样回复:

{
    "coke": {
        "alcohol": 0,
        "calories": 300,
        "taste": "awesome"
    },
    "pepsi": {
        "alcohol": 0,
        "calories": 300,
        "taste": "meh"
    }
}

然后它会以某种形式返回这两个结果。

使用付费版本的解决方案很好。

如果可以这样做,你能给我一个简单的例子吗?

1 个答案:

答案 0 :(得分:1)

Google为其自定义搜索提供REST API,您可以从服务器查询它以确定是否有更好的搜索字词拼写,然后使用它来查询您的内部数据库。

在我的代码中,我使用的是Guzzle,这是一个REST客户端库,可以避免使用cURL的丑陋和冗长的代码,但如果你真的需要,可以随意使用cURL。

// Composer's autoloader to load the REST client library
require "vendor/autoload.php";

$api_key = "..."; // Google API key, looks like random text
$search_engine = "..."; // search engine ID, looks like "<numbers>:<text>"
$query = "drnks with no alcohol"; // the original search query

// REST client object with some defaults
// avoids specifying them each time we make a request
$client = new GuzzleHttp\Client(["base_url" => "https://www.googleapis.com", "defaults" => ["query" => ["key" => $api_key, "cx" => $search_engine, "fields" => "spelling(correctedQuery)"]]]);

try {
    // the actual request, with the search query
    $resp = $client->get("/customsearch/v1", ["query" => ["q" => $query]])->json();

    // whether Google suggests an alternative spelling
    if (isset($resp["spelling"]["correctedQuery"])) {
        $correctedQuery = $resp["spelling"]["correctedQuery"];
        // now use that corrected spelling to query your internal DB
        // or do anything else really, the query is yours now
        echo $correctedQuery;
    } else {
        // Google doesn't have any corrections, use the original query then
        echo "No corrections found";
    }
} catch (GuzzleHttp\Exception\TransferException $e) {
    // Something bad happened, log the exception but act as if
    // nothing is wrong and process the user's original query
    echo "Something bad happened";
}

以下是获取API密钥的instructions部分,可以从control panel获取自定义搜索引擎ID。

如果你仔细观察,你可以看到我已经指定fields查询参数来请求partial response仅包含最终的拼写建议,以便(希望)获得更好的性能,因为我们不需要响应中的任何其他内容(但如果您确实需要完整的响应,请随时更改/删除它。)

请注意,Google对您数据库中的内容一无所知,因此拼写更正只会基于Google对您网站的公开数据,我认为没有办法让Google了解您的内部数据库,不管怎样,这不是一个好主意。

最后,确保优雅地处理速率限制和API失败,仍然让用户可以使用他们的原始查询进行搜索(只是表现得没有发生错误,只记录错误以供日后查看)。