En la práctica:Lucene y Yahoo! BOSS
José Carlos Cortizo Pérez http://www.esp.uem.es/jccortizo [email protected]
Departamento de Sistemas Informáticos Escuela Superior Politécnica Universidad Europea de Madrid
José Carlos Cortizo Pérez
Índice
Lucene
Yahoo! BOSS
Sistemas Inteligentes de Acceso a la Información
LUCENE
José Carlos Cortizo Pérez
Lucene
Motor de búsqueda sobre texto
Orientado a alto rendimiento
Multiplataforma (Java)
Open Source
Con todas las características de un motor avanzado
¿Qué es?
José Carlos Cortizo Pérez
José Carlos Cortizo Pérez
Lucene
Lucene es rápido buscando porque utiliza índices
Inverted Index (palabras --> documentos)
En Lucene, un Document es la unidad de búsqueda e indización
Un Document puede ser un texto, pero también una tabla, u otro tipo de documento estructurado
Búsqueda e Indización
José Carlos Cortizo Pérez
José Carlos Cortizo Pérez
Lucene
Un Document consiste en uno o más Fields
Un Field es un par nombre-valor
P.e: title-King Kong
La Indexación en Lucene, requiere crear un Documento agregando varios campos, y añadir ese Document al IndexWriter
Campos en Lucene
José Carlos Cortizo Pérez
José Carlos Cortizo Pérez
Lucene
El proceso de búsqueda requiere que se haya creado algún índice
Necesita que se cree una Query (habitualmente a partir de un QueryParser) y llevar esta Query a un IndexSearcher, que devuelve una lista de coincidencias (Hits)
Lucene tiene su propio minilenguaje para realizar búsquedas, permitiendo restricciones booleanas y otras funcionalidades
Búsqueda y consultas
José Carlos Cortizo Pérez
José Carlos Cortizo Pérez
Pasos por Proyecto
Es importante saber cómo quieres que se vean los resultados, porque en función de eso necesitaremos organizar algunas cosas. P.e:
¿Vas a mostrar snippets o no?
¿Cómo vas a enlazar a los documentos?
¿Qué orden vas a seguir con los resultados?
¿Qué forma de visualización?
Determinar como quieres que se vean los resultados
José Carlos Cortizo Pérez
José Carlos Cortizo Pérez
Pasos por Proyecto
System.out.println("Found " + hits.length() + " hits.");
for(int i=0;i<hits.length();++i) {
System.out.println((i + 1) + ". " + hits.doc(i).get("title"));
}
Ej. código visualización
José Carlos Cortizo Pérez
José Carlos Cortizo Pérez
Pasos por Proyecto
A partir de la página de resultados, determina los pasos necesarios para llevar tu aplicación a Lucene
¿Cuáles son los campos del documento?
Si tus datos están en una BBDD, ¿qué tablas y columnas necesitas? ¿qué SQL vas a ejecutar para recuperar esos datos?
Mapear tu aplicación al modelo de Lucene
José Carlos Cortizo Pérez
José Carlos Cortizo Pérez
Pasos por Proyecto
Vengan de donde vengan los datos, lo primero es escribir tu propio Indexer
Cuándo tengas creado el índice, puedes revisarlo con Luke
Escribe el código de indexación
José Carlos Cortizo Pérez
José Carlos Cortizo Pérez
Pasos por Proyecto
Directory index = new RAMDirectory();IndexWriter w = new IndexWriter(index, new StandardAnalyzer(), true);addDoc(w, "Lucene in Action");addDoc(w, "Lucene for Dummies");addDoc(w, "Managing Gigabytes");addDoc(w, "The Art of Computer Science");w.close();
Escribe el código de indexación
José Carlos Cortizo Pérez
José Carlos Cortizo Pérez
Pasos por Proyecto
private static void addDoc(IndexWriter w, String value) throws IOException {
Document doc = new Document(); doc.add(new Field("title", value,Field.Store.YES, Field.Index.TOKENIZED)); w.addDocument(doc);}
Escribe el código de indexación
José Carlos Cortizo Pérez
José Carlos Cortizo Pérez
Pasos por Proyecto
Es mejor separar la indexación de la búsqueda, tanto conceptualmente como de forma práctica
El Searcher recibirá un String (consulta) y devolverá una lista de Hits
Alguna funcionalidad adicional:
Limitar el número de resultados
Devolver páginas
Escribe el código de búsqueda, en otra clase
José Carlos Cortizo Pérez
José Carlos Cortizo Pérez
Pasos por Proyecto
String querystr = args.length > 0 ? args[0] : "lucene";
Query q = new QueryParser("title", new StandardAnalyzer()).parse(querystr);
Escribe el código de búsqueda (QUERY)
José Carlos Cortizo Pérez
José Carlos Cortizo Pérez
Pasos por Proyecto
IndexSearcher s = new IndexSearcher(index);
Hits hits = s.search(q);
Escribe el código de búsqueda (SEARCH)
José Carlos Cortizo Pérez
José Carlos Cortizo Pérez
Pasos por Proyecto
P.e.
Filtrados por permisos
Ordenar por fecha (o de otra forma)
Buscar por tipo de fichero
etc.
Implementar funcionalidades de búsqueda adicionales
José Carlos Cortizo Pérez
José Carlos Cortizo Pérez
Pasos por Proyecto
Una exhaustiva fase de pruebas siempre es necesaria
Comprueba que tus resultados tienen sentido
José Carlos Cortizo Pérez
José Carlos Cortizo Pérez
¿Alguna pregunta?
Sistemas Inteligentes de Acceso a la Información
Yahoo! BOSS
José Carlos Cortizo Pérez
Yahoo! BOSS
BOSS = Build your Own Search Service
Es una plataforma abierta para la construcción de servicios web de búsqueda
Objetivo: Promover la innovación de la industria de búsqueda
¿Quién está detrás? Evidentemente Yahoo! :D
¿Qué es?
José Carlos Cortizo Pérez
José Carlos Cortizo Pérez
Yahoo! BOSS
Aprovechar
El ‘know-how’ de Yahoo!
Sus algoritmos
Su infraestructura
Pero...
Pudiendo aportar nuestra propia innovación
¿Por qué usar Yahoo! BOSS?
José Carlos Cortizo Pérez
José Carlos Cortizo Pérez
Yahoo! BOSS
Hakia: Un buscador semántico
Me.dium Search: Buscador social
Daylife: Plataforma de publicación de contenidos
Cluuz: Clusteriza y ordena de forma gráfica los resultados
¿Quién lo está usando?
José Carlos Cortizo Pérez
José Carlos Cortizo Pérez
Yahoo! BOSSLimitaciones
José Carlos Cortizo Pérez
José Carlos Cortizo Pérez
Yahoo! BOSS
Conseguir un BOSS App ID
http://developer.yahoo.com/boss
Requisitos
José Carlos Cortizo Pérez
José Carlos Cortizo Pérez
Yahoo! BOSSEjemplo simple (PHP)
José Carlos Cortizo Pérez
José Carlos Cortizo Pérez
Yahoo! BOSS
Simple, ¿no?
José Carlos Cortizo Pérez
José Carlos Cortizo Pérez
Yahoo! BOSS
El API de Yahoo! BOSS recibe una URL tipohttp://boss.yahooapis.com/ysearch/web/v1/{query}?appid={youBOSSappid}[¶m1=val1¶m2=val2&etc]
Ej: http://boss.yahooapis.com/ysearch/web/v1/sinai?appid= {youBOSSappid}
La procesa y devuelve los resultados en formato XML, de forma que podemos procesarlos y extraer la info
¿Cómo funciona por detrás?
José Carlos Cortizo Pérez
José Carlos Cortizo Pérez
Yahoo! BOSS¿Cómo funciona por detrás?
José Carlos Cortizo Pérez
José Carlos Cortizo Pérez
Yahoo! BOSS
En función de la URL accedemos a diversos servicios (búsqueda sobre web, noticias, imágenes), diversos parámetros y diversas consultas
¿Cómo funciona por detrás?
José Carlos Cortizo Pérez
José Carlos Cortizo Pérez
Yahoo! BOSSWeb
http://boss.yahooapis.com/ysearch/web/v1/{query}?appid={youBOSSappid}[¶m1=val1¶m2=val2&etc]
Imágeneshttp://boss.yahooapis.com/ysearch/images/v1/{query}?appid=xyz[¶m1=val1¶m2=val2&etc
Noticiashttp://boss.yahooapis.com/ysearch/news/v1/{query}?appid=xyz[¶m1=val1¶m2=val2&etc
Spellinghttp://boss.yahooapis.com/ysearch/spelling/v1/{query}?appid=xyz[¶m1=val1¶m2=val2&etc
URLS
José Carlos Cortizo Pérez
José Carlos Cortizo Pérez
Yahoo! BOSS
Pero, si Yahoo! BOSS se encarga de casi todo, ¿yo qué hago?
Innovar, por supuesto :D“Mezclar” las búsquedas de Yahoo! BOSS con las de otros, p.e. las de Google: http://code.google.com/apis/ajaxsearch/
Reordenar los resultados
Clusterizar
Ordenar en líneas temporales
Hacer buscadores específicos para medios sociales
Etc. José Carlos Cortizo Pérez
José Carlos Cortizo Pérez
¿Alguna pregunta?
José Carlos Cortizo Pérez
Bibliografía
http://www.lucenetutorial.com
Raymond Mooney. Basic Tokenizing, Indexing and Implementation of Vector-Space Retrieval. Tema 3, curso IR.
http://www.cs.utexas.edu/~mooney/ir-course/slides/Evaluation.ppt
Tutorial: Create a Yahoo BOSS powered Site Search Enginehttp://www.labnol.org/internet/tutorial-create-yahoo-boss-site-search/5636/
Yahoo! BOSS doc: http://developer.yahoo.com/search/boss
Adicional
José Carlos Cortizo Pérez
¿Alguna pregunta?