סקירה כללית
ה-Freebase Search API מספק גישה לנתוני Freebase בהתאם לשאילתת טקסט חופשי. תוצאות השאילתה מסודרות ועם ציון רלוונטיות מספרי.
מפתחים יכולים להחיל מסננים כדי להגביל את תוצאות החיפוש לסוגים מסוימים של נתונים. לקבלת מידע נוסף על היצירה של שאילתות חיפוש מפורטות, ניתן לעיין באוסף הפתרונות.
דוגמאות למוצרים שבהם מפתחים רוצים להשתמש ב-Search API:
- ישויות בהצעה אוטומטית (למשל ווידג'ט Freebase Offer)
- קבלת רשימה מדורגת של הישויות הבולטות ביותר שקיבלו שם נתון.
- חיפוש ישויות באמצעות Search Metaschema.
בדוגמאות הקוד הבאות, בכמה שפות נתמכות, מוסבר איך לבצע חיפוש של מוזיקאי שתואם לטקסט "Cee Lo Green". מגבלה נוספת היא שהן יצרו משהו בשם "The Lill Killer" (הגברת קילר).
Python
import json import urllib api_key = open(".api_key").read() query = 'blue bottle' service_url = 'https://www.googleapis.com/freebase/v1/search' params = { 'query': query, 'key': api_key } url = service_url + '?' + urllib.urlencode(params) response = json.loads(urllib.urlopen(url).read()) for result in response['result']: print(result['name'] + ' (' + str(result['score']) + ')')
Ruby
require 'rubygems' require 'cgi' require 'httparty' require 'json' require 'addressable/uri' API_KEY = open(".freebase_api_key").read() url = Addressable::URI.parse('https://www.googleapis.com/freebase/v1/search') url.query_values = { 'query' => 'Blue Bottle', 'key'=> API_KEY } response = HTTParty.get(url, :format => :json) response['result'].each { |topic| puts topic['name'] }בדוגמה הזו נעשה שימוש בספריות Httparty ו-Addressable.
Java
package com.freebase.samples; import com.google.api.client.http.GenericUrl; import com.google.api.client.http.HttpRequest; import com.google.api.client.http.HttpRequestFactory; import com.google.api.client.http.HttpResponse; import com.google.api.client.http.HttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.jayway.jsonpath.JsonPath; import java.io.FileInputStream; import java.util.Properties; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; public class SearchExample { public static Properties properties = new Properties(); public static void main(String[] args) { try { properties.load(new FileInputStream("freebase.properties")); HttpTransport httpTransport = new NetHttpTransport(); HttpRequestFactory requestFactory = httpTransport.createRequestFactory(); JSONParser parser = new JSONParser(); GenericUrl url = new GenericUrl("https://www.googleapis.com/freebase/v1/search"); url.put("query", "Cee Lo Green"); url.put("filter", "(all type:/music/artist created:\"The Lady Killer\")"); url.put("limit", "10"); url.put("indent", "true"); url.put("key", properties.get("API_KEY")); HttpRequest request = requestFactory.buildGetRequest(url); HttpResponse httpResponse = request.execute(); JSONObject response = (JSONObject)parser.parse(httpResponse.parseAsString()); JSONArray results = (JSONArray)response.get("result"); for (Object result : results) { System.out.println(JsonPath.read(result,"$.name").toString()); } } catch (Exception ex) { ex.printStackTrace(); } } }
JavaScript
<!DOCTYPE html> <html> <head> <script src="https://www.gstatic.com/external_hosted/jquery2.min.js"></script> </head> <body><aside class="warning"><strong>Warning: </strong>The Freebase API will be retired on June 30, 2015.</aside> <script> var service_url = 'https://www.googleapis.com/freebase/v1/search'; var params = { 'query': 'Cee Lo Green', 'filter': '(all type:/music/artist created:"The Lady Killer")', 'limit': 10, 'indent': true }; $.getJSON(service_url + '?callback=?', params).done(function(response) { $.each(response.result, function(i, result) { $('<div>', {text:result['name']}).appendTo(document.body); }); }); </script> </body> </html>בדוגמה הזו נעשה שימוש בספרייה של jQuery.
PHP
<!DOCTYPE html> <html> <body> <?php include('.freebase-api-key'); $service_url = 'https://www.googleapis.com/freebase/v1/search'; $params = array( 'query' => 'Blue Bottle', 'key' => $freebase_api_key ); $url = $service_url . '?' . http_build_query($params); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $response = json_decode(curl_exec($ch), true); curl_close($ch); foreach($response['result'] as $result) { echo $result['name'] . '<br/>'; } ?> </body> </html>
אפשר גם להיכנס לדף ספריות לקוח כדי לבדוק אם השפה המועדפת עליך נתמכת.
חיפוש API של חיפוש
בנוסף, מומלץ לעיין במסמכים הבאים:
- במסמכי העזר לחיפוש מוסבר איך משתמשים ב-API.
- לקבלת מידע נוסף על היצירה של שאילתות חיפוש מפורטות, ניתן לעיין באוסף הפתרונות.
- לקבלת מידע על אופן הקשר בין ישויות ונכסים, יש לעיין במסמך Metaschema.
שיקולי אבטחה
ה-API של החיפוש מוסיף לאינדקס ומחפש תוכן של משתמשים שנשמר בתרשים Freebase. המשמעות היא שלא ניתן להשתמש בתוכן באופן ישיר בדף אינטרנט בלי לצאת ממנו בבטחה.
מידע נוסף זמין בקטע תחילת העבודה: אבטחה.
סינון מתקדם
ה-API של החיפוש תומך במספר גדול של אילוצי מסננים כדי לכוון את החיפוש טוב יותר לישויות הנכונות.
לדוגמה, באמצעות אילוץ מסנן "type" , אנחנו יכולים להציג רשימה של האנשים הבולטים ביותר ב-Freebase.
filter=(any type:/people/person)
אילוצי סינון מקבלים מגוון קלט:
- מזהים שניתן לקרוא על ידי אנשים של ישויות או משתמשים בסכימה, לדוגמה:
/people/person
עקב אילוץ של סוג/film
עקב מגבלה של דומיין
- MIDS מסוג Freebase, לדוגמה:
/m/01g317
עבור אותה מגבלה מסוג/people/person
/m/010s
עבור אילוץ הדומיין/film
שלמעלה
- שמות ישויות, לדוגמה:
"person"
למגבלה של פחות/people/person
"film"
עקב אילוץ של/film
דומיין פחות מדויק
אילוצי סינון ניתן לסווג לכמה קטגוריות. לקבלת פרטים נוספים, ניתן לעיין באוסף הפתרונות של חיפוש Google.
ניתן לשלב את מגבלות האילוץ באופן חופשי ולבצע אותן ישירות ב-SearchRequest
. פרמטרים חוזרים של אילוץ מסנן משולבים בשאילתת OR. פרמטרים שונים של אילוץ מסנן או קבוצות משולבים בשאילתת AND.
למשל:
כדי לחפש "אנשים או ערים בשם Gore", נסה:
query=gore &filter=(any type:/people/person type:/location/citytown)
אפשר לשנות את התנהגות השילוב הזו ולשלוט טוב יותר עם פרמטר המסנן, שמספק ממשק עשיר יותר לשילוב אילוצים. זהו ביטוי s, שעשוי להיות שרירותי, שבו האופרטור הוא אחד מהבאים:
any
, באופן הגיוני ORall
, מבחינה לוגיתnot
should
. אפשר להשתמש בו רק ברמה העליונה, והמשמעות שלו היא שהאילוץ הוא אופציונלי. במהלך הניקוד, התאמות שלא תואמות למגבלות אופציונליות יתחלקו בחצי עבור כל אילוץ אופציונלי שהן לא יתאימו.
למשל:
כדי להתאים לסוג /people/person
או לדומיין /film
, יש לנסות:
query=gore &filter=(any type:/people/person domain:/film)