Descripción general de la búsqueda

  1. Descripción general
  2. Consideraciones de seguridad
  3. Filtros avanzados

Descripción general

La API de Freebase Search proporciona acceso a los datos de Freebase a partir de una consulta de texto libre. Los resultados de la búsqueda se ordenan y tienen una puntuación de relevancia numérica.

Los desarrolladores pueden aplicar filtros para restringir los resultados de la búsqueda a ciertos tipos de datos. Consulta el Libro de cocina de la Búsqueda para obtener más información sobre cómo crear consultas de búsqueda detalladas.

Estos son algunos ejemplos de cómo los desarrolladores pueden usar la API de Search:

  • Sugerencia automática de entidades (p.ej., Freebase Suggest Widget)
  • Obtener una lista clasificada de las entidades más destacadas con un nombre determinado
  • Cómo encontrar entidades con Search Metaschema

En las siguientes muestras de código en varios lenguajes admitidos, se muestra cómo realizar una búsqueda de un artista musical que coincida con el texto “Cee Lo Green”. Una restricción adicional es que haya creado algo llamado “The Lady 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']
} 
En este ejemplo, se usan las bibliotecas Httparty y 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>
En este ejemplo, se usa la biblioteca 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>

También puedes consultar la página Bibliotecas cliente para ver si se admite tu lenguaje favorito.

Documentación de la API de Search

Consulta también la siguiente documentación:

Consideraciones de seguridad

La API de Search indexa y busca contenido generado por usuarios almacenado en el gráfico de Freebase. Esto significa que no puedes usar directamente el contenido de una página web sin escaparlo de forma segura primero.

Consulta Cómo comenzar: Seguridad para obtener más información.

Filtrado avanzado

La API de Search admite una gran cantidad de restricciones de filtro para orientar mejor la búsqueda hacia las entidades correctas.

Por ejemplo, con una restricción de filtro de "tipo", podemos mostrar una lista de las personas más destacadas en Freebase.

filter=(any type:/people/person)

Las restricciones de filtro aceptan una variedad de entradas:

  • Son IDs legibles para personas de entidades o usuarios del esquema, por ejemplo:
    • /people/person para una restricción de tipo
    • /film para una restricción de dominio
  • Por ejemplo, los MIDs de Freebase:
    • /m/01g317 para la misma restricción de tipo /people/person
    • /m/010s para la restricción de dominio /film anterior
  • Nombres de entidades, por ejemplo:
    • "person" para una restricción de tipo /people/person menos precisa
    • "film" para una restricción de dominio /film menos precisa

Las restricciones de filtro se pueden clasificar en algunas categorías. Consulta el Recetario de búsqueda para obtener más detalles.

Las restricciones de filtro se pueden combinar y repetir libremente en la SearchRequest directamente. Los parámetros de restricción de filtro repetidos se combinan en una consulta OR. Los diferentes parámetros o grupos de restricciones de filtro se combinan en una consulta AND.

Por ejemplo:

Para buscar "personas o ciudades llamadas Gore", prueba lo siguiente:

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

Este comportamiento de combinación se puede anular y controlar mejor con el parámetro de filtro, que ofrece una interfaz más enriquecida para combinar restricciones. Es una expresión S, posiblemente anidada de forma arbitraria, en la que el operador es uno de los siguientes:

  • any, lógicamente un OR
  • all, lógicamente un AND
  • not
  • should, que solo se puede usar en el nivel superior y que indica que la restricción es opcional. Durante la puntuación, la puntuación de las coincidencias que no cumplen con las restricciones opcionales se divide a la mitad por cada restricción opcional que no cumplen.

Por ejemplo:

Para hacer coincidir el tipo /people/person o el dominio /film, prueba lo siguiente:

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