Benchmark Lucene en PHP vs Lucene en Java

30 agosto 2007 at 00:21

Fecha Filed 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 Comments (2) Benchmark Lucene en PHP vs Lucene en Java Permalink Votar: Positive 0 Negative 0

No uses innerHTML, usa DOM

20 agosto 2007 at 18:30

Fecha Filed in Computers
Tags Tags: , , ,

A pesar de que innerHTML sea relativamente mucho más rápido, existen ciertas cuestiones que hacen más recomendable el uso de DOM para manejar documentos xHTML.

  • innerHTML no es un estándar, es una propiedad de Microsoft (al igual que outerHTML).
  • Se supone en un futuro innerHTML no funcionará en los documentos xHTML basados en el MIME type application/xhtml+xml.
  • Una de las diferencias principales entre innerHTML y DOM es que el primero es un string y el segundo una estructura de objetos jerárquica (un árbol). Meter un string en un objeto es una auténtica chapuza, por llamarlo de algún modo.
  • Perdemos interacción con el objeto (fijar atributos, cambiar valores, …) al ser un string.

Crear un elemento

innerHTML

document.getElementById("contenedor").innerHTML =
                    "<div id="capa" >Texto<!--comentario--></div>";

DOM

div = document.createElement("div");
div.setAttribute("id", "capa");
texto = document.createTextNode("Texto");
div.appendChild(texto);
div_comentario = document.createComment("comentario");
div.appendChild(div_comentario);
document.getElementById("contenedor").appendChild(div);

Obtener el texto de un elemento

innerHTML

texto = document.getElementById("contenedor").innerHTML

DOM

texto = document.getElementById("contenedor").firstChild.nodeValue;

Crear varios elementos

innerHTML

data = new Array("one","two","three");
mHTML = "<ul>";
for(i=0; i<data.length; i++) {
	mHTML+="<li>" + data[i] + "";
}
mHTML+="</ul>";
document.getElementById("contenedor").innerHTML = mHTML;

DOM

data = new Array("one", "two", "three");
eUL = document.createElement("ul");
for(i=0; i<data .length; i++) {
	eLI = document.createElement("li");
	eLI.appendChild(document.createTextNode(data[i]));
	eUL.appendChild(eLI);
}
document.getElementById("contenedor").appendChild(eUL);

Más información | SlayerOffice
Más información | Mozilla Developer Center

API de Xurrency disponible

07 agosto 2007 at 18:03

Fecha Filed in Internet, Computers, Bussiness 2.0
Tags Tags: , , , ,

XurrencyAunque ya lleva bastante tiempo terminada, hoy encuentro un hueco y lanzo la API de Xurrency. Ahora puedes integrar datos en tu sitio o aplicación web directamente desde Xurrency. Como ya comenté en un principio, la API está basada en SOAP, así que podrás usarla en diferentes lenguajes de programación (multiplataforma). Para PHP, sugiero usa la libreria NuSOAP, una colección libre de clases que permiten a los usuarios enviar y recibir mensajes SOAP.

Actualmente los métodos disponibles son los siguientes:

  • string getName(string $code)
  • string getZone(string $code)
  • string getURL(string $code)
  • int getNumCurrencies()
  • int isCurrency(string $code)
  • array getCurrencies()
  • array getValues(string $code)
  • array getValuesInverse(string $code)
  • float getValue(float $amount, string $base, string $target)

El uso de la API con NuSOAP es tan sencillo como el siguiente ejemplo, donde se muestra el nombre de la divisa con código eur.

        require('lib/nusoap.php'); 

        $cliente = new soapclient('http://xurrency.com/api.wsdl', 'wsdl');
	$err = $cliente->getError();
	if($err)
	   exit();
        $proxy  = $cliente->getProxy();
        $resultado = $proxy->getName('eur');

        if (!$cliente->getError())
          echo $resultado;
        else
          echo $cliente->getError();

Además, he publicado una lista sandbox que muestra las salidas de todos los métodos que ofrece la API.

Más información | API Xurrency

Comments Comments (1) API de Xurrency disponible Permalink Votar: Positive 0 Negative 0