Обзор поиска

  1. Обзор
  2. Соображения безопасности
  3. Расширенная фильтрация

Обзор

API поиска Freebase предоставляет доступ к данным Freebase по произвольному текстовому запросу. Результаты запроса упорядочены и имеют числовую оценку релевантности.

Разработчики могут применять фильтры, чтобы ограничить результаты поиска определёнными типами данных. Подробнее о построении подробных поисковых запросов см. в книге «Поиск» .

Вот несколько примеров того, как разработчики могут использовать API поиска:

  • Автоматически предлагающие сущности (например, Freebase Suggest Widget )
  • Получение ранжированного списка наиболее примечательных объектов с заданным названием.
  • Поиск сущностей с использованием Search Metaschema .

Следующие примеры кода на нескольких поддерживаемых языках показывают, как выполнить поиск исполнителя, соответствующего тексту «Cee Lo Green». Дополнительным ограничением является то, что они создали некий «The Lady Killer».

Питон

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']) + ')')

Руби

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 .

Ява

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 поиска индексирует и ищет пользовательский контент, хранящийся в графе Freebase. Это означает, что вы не сможете напрямую использовать контент на веб-странице, предварительно безопасно его экранировав.

Более подробную информацию см. в разделе Начало работы: Безопасность .

Расширенная фильтрация

API поиска поддерживает большое количество ограничений фильтров, что позволяет точнее нацеливать поиск на нужные объекты.

Например, используя ограничение фильтра «тип», мы можем отобразить список самых известных людей в Freebase.

filter=(any type:/people/person)

Ограничения фильтра принимают различные входные данные:

  • Человекочитаемые идентификаторы для сущностей схемы или пользователей, например:
    • /people/person для ограничения типа
    • /film для ограничения домена
  • Freebase MID, например:
    • /m/01g317 для того же ограничения типа /people/person
    • /m/010s для указанного выше ограничения домена /film
  • Имена сущностей, например:
    • "person" для менее точного ограничения типа /people/person
    • "film" для менее точного ограничения домена /film

Ограничения фильтра можно разделить на несколько категорий. Подробнее см. в книге «Поиск» .

Ограничения фильтра можно свободно комбинировать и повторять непосредственно в SearchRequest . Повторяющиеся параметры ограничений фильтра объединяются в запрос OR. Различные параметры или группы ограничений фильтра объединяются в запрос AND.

Например:

Чтобы найти «людей или города с названием Гор », попробуйте:

query=gore
&filter=(any type:/people/person type:/location/citytown)

Это поведение комбинирования можно переопределить и лучше контролировать с помощью параметра фильтра, который предлагает более расширенный интерфейс для комбинирования ограничений. Это s-выражение, возможно, произвольно вложенное, где оператор может быть одним из следующих:

  • any , логически ИЛИ
  • all , логически И
  • not
  • should может использоваться только на верхнем уровне и означает, что ограничение необязательное. При подсчёте очков, очки за совпадения, не соответствующие необязательным ограничениям, делятся пополам за каждое несоответствующее необязательное ограничение.

Например:

Чтобы сопоставить тип /people/person или домен /film , попробуйте:

query=gore
&filter=(any type:/people/person domain:/film)