Un poco de teoría sobre búsquedas en BBDD.
Hoy os queremos contar algo que probablemente os deje a muchos con la sensación de que os estamos mintiendo. Puede que el título del post sea algo populista, pero realmente es cierto, así que: ¿Por qué no ponerle un nombre llamativo? J.
Antes de continuar, decir que para que le saquéis más jugo al post deberíais de saber SQL, aunque sea de forma muy básica. Los ejemplos mostrados y todo lo aquí expuesto está hecho con MySQL, pero estar característica no exclusiva de SGBD. Otros gestores (MS SQL Server) también disponen de ella. Para hacer nuestra base de datos de ejemplo y lanzar las consultas hemos usado, por comodidad, MySQL Workbench 5.2 OSS.
Cuando acabéis de leer el post conseguiréis que una búsqueda que antes tardaba en ejecutarse 12 segundos, se ejecute en 0.047 segundos!!!. Como dirían en la teletienda: increíble, pero cierto. Y para muestra un botón:
Conseguirás pasar de esto:

A esto:

El que más o el que menos ha hecho alguna vez (o al menos lo a usado) un típico buscador en una página web. Cuando escribes lo que quieres buscar, internamente se suele transformar en un consulta más o menos como sigue:
SELECT campo1,campo2,…,campoN FROM Tabla1, Tabla2…, TablaN WHERE Campo1 LIKE 'VALOR DE ENTRADA';
Este es el ejemplo más sencillo de consulta que podemos encontrar, y menos eficiente, porque si escribes dos palabras irían dentro del mismo "LIKE". Por eso lo que se hace es separar cada valor de lo que escribamos y construir sentencias con múltiples condiciones:
SELECT campo1,campo2,…,campoN FROM Tabla1, Tabla2…, TablaN WHERE Campo1 LIKE 'ENTRADA1' AND Campo1 LIKE 'ENTRADA2' … ;
Hace unos días realizando una busqueda por la red, utilizando Google claro. Nos encontramos con unos resultados que me animaron a escribir un poco sobre como recorrer y analizar la información que Google nos puede llegar a mostrar.
Bajo estas mismas premisas desarrollamos las primeras versiones de plecost. Ahora veremos lo sencillo que es realizar este tratamiento ayudados de algunas librerias.
La búsqueda
Lo primero es realizar la búsqueda, algunos de los operadores de Google más interesantes son los siguientes:
allintext:, allintitle:, allinurl:, cache:, define:, filetype:, id:, info:, intext:, intitle:, inurl:, related:, site:
En este caso utilizaremos filetype, inurl y intext para localizar los ficheros phpinfo() que son nuestros objetivos. En la siguiente captura vemos la salida del buscador:

Si conocéis a alguien que tenga un MAC, o si vosotros mismos lo tenéis, posiblemente una de la frases que oigáis con mayor frecuencia sea relacionada con el tema del rendimiento: y realmente es cierto.
Seguramente no seréis el primero, ni el último, que se enganche al “fruto del árbol prohibido”. No solamente por su impecable diseño, sino por su OS X y su sorprendente rendimiento. ¿Que me diríais si os dijera que podríais conseguir (o al menos aproximarlo bastante) ese rendimiento que os ofrece la compañía de la manzana en vuestro GNU/Linux?. Pues sí, es posible. Veamos cómo:
UserAgentString.com es una web muy sencilla pero que puede llegar a ser muy útil, veamos como.
Estos días estamos publicando una serie de entradas donde mostramos sencillos ejemplos con clientes HTTP en diferentes lenguajes de programación.
A veces lo sencillo no es la mejor solución. Un cliente tan sencillo como el que mostramos en el pequeño script de python:
import urllib
import urllib2
url = 'http://www.example.com/accion'
values = {'param1':'parametro','param2':'parametro'}
data = urllib.urlencode(values)
req = urllib2.Request(url,data)
res = urllib2.urlopen(req)
print res.read()
res.close()
Puede darnos algunos problemas para acceder a cierta información, que desde un navegador si que nos resulta accesible.
>>> import urllib
>>> import urllib2
>>> url = 'http://www.google.com/search?q=iniqua'
>>> req = urllib2.Request(url)
>>> res = urllib2.urlopen(req)
urllib2.HTTPError: HTTP Error 403: Forbidden