Benchmark Lucene en PHP vs Lucene en Java

30 agosto 2007 at 00:21

Fecha Posted in Computers
Tags Tags: , , , ,

Lucene in ActionLucene 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….

Comments (ADD YOURS)

  1. 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…)

  2. Avatar
    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.

Write a comment



OpenID Sign In with OpenID