Benchmark Lucene en PHP vs Lucene en Java
Filed 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….





