Benchmark Lucene en PHP vs Lucene en Java
Posted in
Computers
Tags: buscadores, java, lucene, php, programación
Lucene es una librería opensource de recuperación de información, usada generalmente para la programación de motores de búsqueda. Fue originalmente implementada en Java por Doug Cutting, aunque ha sido portada a otros lenguajes de programación como C, C++, Python, Perl, Ruby, PHP, … Para PHP existe Zend Search Lucene, un motor de búsqueda de propósito general escrito íntegramente en PHP5. Zend Search Lucene almacena sus índices en el sistema de archivos, evitando la necesidad de un servidor de bases de datos. Nos permite una ranked searching (los mejores resultados aparecerán los primeros), diversas potentes consultas (consultas de frases, consultas por proximidad, consultas por rango, …) y búsquedas por campos específicos (por título, autor, contenidos, …).
Zend Search Lucene puede ser una opción estupenda para integrarlo en un proyecto escrito en PHP (nos olvidaríamos de la conexión puente entre Java y PHP), aunque investigando un poco en temas de eficiencia me he topado con un artículo donde el autor hace un pequeño benchmark para comparar Zend Search Lucene y Lucene en Java. Se llega a las siguientes conclusiones:
- La indexación usando Zend Search Lucene es mucho más lenta que con Java Lucene. En el benchmark se indexó 30.000 resultados con Zend Search Lucene en 1883 segundos (aproximadamente media hora).
- El índice creado por Zend Search Lucene es totalmente compatible con Java Lucene, por lo que un índice creado por uno puede ser leído por otro y viceversa.
- La búsqueda con Zend Search Lucene es mucho más lenta que con Java Lucene. El tiempo para 100 búsquedas fue:
jayant@jayantbox:~/myprogs/java$ java searcher Total : 30000 docs t2-t1 : 231 milliseconds jayant@jayantbox:~/myprogs/php$ php -q searcher.php Total 30000 docs total time : 15 seconds
Aún así se pensó que tal vez el código en PHP devolvía los documentos que se estaba buscando, por lo que se hizo un cambio en el código donde se extraían todos los documentos tanto en PHP como en Java. Sin embargo el tiempo empleado por el código en PHP fue mucho mayor:
jayant@jayantbox:~/myprogs/java$ java searcher Total : 30000 docs t2-t1 : 2128 milliseconds jayant@jayantbox:~/myprogs/php$ php -q searcher.php Total 30000 docs total time : 63 seconds
El código de búsqueda en PHP usado para Lucene fue el siguiente:
<? * * searcher.php * On 2007-06-06 * By jayant * */ include("Zend/Search/Lucene.php"); $index = new Zend_Search_Lucene("/tmp/myindex"); echo "Total ".$index->numDocs()." docsn"; $query = "java"; $s = time(); for($i = 0; $i < 100; $i++) { $hits = $index->find($query); // retrieve all documents. Comment this code if you // dont want to retrieve documents foreach($hits as $hit) $doc = $hit->getDocument(); } $total = time() - $s; echo "total time : $total s"; ?>Y el código de búsqueda en Java usado para Lucene fue este:
/* * searcher.java * On 2007-06-06 * By jayant * */ import org.apache.lucene.search.*; import org.apache.lucene.queryParser.*; import org.apache.lucene.analysis.*; import org.apache.lucene.analysis.standard.*; import org.apache.lucene.document.*; public class searcher { public static void main (String args[]) throws Exception { IndexSearcher s = new IndexSearcher("/tmp/myindex"); System.out.println("Total : "+s.maxDoc()+" docs"); QueryParser q = new QueryParser("content",new StandardAnalyzer()); Query qry = q.parse("java"); long t1 = System.currentTimeMillis(); for(int x=0; x < 100; x++) { Hits h = s.search(qry); // retrieve all documents. Comment this code // if you dont want to retrieve documents for(int y=0; y < h.length(); y++) { Document d = h.doc(y); } } long t2 = System.currentTimeMillis(); System.out.println("t2-t1 : "+(t2-t1)+" ms"); } }
Más información | Whatever….






xeon
30 ago 2007 21:56:12
Jope. Lo que pasa es que tirar de Lucene VS tirar de PHP, es muy chungo, y me quedo con PHP. Jo, vaya golpe… pero al menos en índices gordos, quien tarda más en buscar, PHP o Lucene? (digo por que en busquedas individuales dudo que se note tanto, además, la última versión de la rama trunk del svn de Zend está mucho mejor…)
Rodrigo Sánchez Jiménez
26 feb 2008 11:57:41
Hombre, yo diría que no se puede esperar que el port de Lucene a PHP se comporte igual que el original en cuanto a eficiencia. Simplemente que son dos conceptos distintos; el porte de ZenFramework está muy bien para sitios Web más modestos, pero a nadie se le habrá ocurrido aplicarlo sobre una colección de 2 millones de documentos… Para trabajar con grandes cantidades de datos PHP no parece el marco más adecuado.
Sin embargo, el porte a PHP sí que permite que se utilicen soluciones de calidad para multitud de problemas muy comunes. Para empezar, abre la puerta a que todos los CMS y demás soluciones genéricas de edición Web puedan acceder a servicios de búsqueda en condiciones, lo que será un gran cambio, porque los que se utilizan hoy día son birriosos.
Resumiendo, me parece muy buena idea, pero hay que saber dónde emplearlo.