2008-10-31 14 views
9

Lucene es un excelente motor de búsqueda, pero la versión .NET está detrás de la versión oficial de Java (la última versión estable de .NET es 2.0, pero la última versión de Java Lucene es 2.4, que tiene más funciones).¿Cómo ejecutas Lucene en .net?

¿Cómo se soluciona esto?

+0

Alguien con más prestigio que yo debería editar la "lucencia" a lucene – friism

+0

Acabo de arreglarlo :) – Kalid

Respuesta

20

Una forma que encontré, que se sorprendió podría funcionar: Crear una DLL .NET desde un archivo Java .jar! Usando IKVM que pueda download Lucene, obtener el archivo .jar, y ejecute:

ikvmc -target:library <path-to-lucene.jar> 

que genera un archivo DLL .NET así: Lucene-core-2.4.0.dll

continuación, puede simplemente hacer referencia a este ¡DLL de su proyecto y listo! Hay algunos tipos de Java que necesitará, así que también haga referencia a IKVM.OpenJDK.ClassLibrary.dll. Su código podría ser un poco como esto:

QueryParser parser = new QueryParser("field1", analyzer); 
java.util.Map boosts = new java.util.HashMap(); 
boosts.put("field1", new java.lang.Float(1.0)); 
boosts.put("field2", new java.lang.Float(10.0)); 

MultiFieldQueryParser multiParser = new MultiFieldQueryParser 
         (new string[] { "field1", "field2" }, analyzer, boosts); 
multiParser.setDefaultOperator(QueryParser.Operator.OR); 

Query query = multiParser.parse("ABC"); 
Hits hits = isearcher.search(query); 

nunca supe que podría tener Java para la interoperabilidad .NET tan fácilmente. La mejor parte es que C# y Java son "casi" compatibles con el código fuente (en lo que respecta a los ejemplos de Lucene). Simplemente reemplace System.Out con Console.Writeln :).

=======

Actualización: Cuando la construcción de bibliotecas como el marcador Lucene, asegúrese de que se hace referencia el conjunto de núcleo (de lo contrario obtendrá advertencias acerca de las clases que faltan). Por lo tanto, el marcador se construye así:

ikvmc -target:library lucene-highlighter-2.4.0.jar -r:lucene-core-2.4.0.dll 
+0

Esta es la primera vez que aprendo de IKVM. ¿Está bien el rendimiento? Porque, cada instrucción en el Java original necesita pasar por DOS capas de VM, ¿no? IKVM JVM y luego .NET CLR. Y la búsqueda es una cosa que le gustaría ser lo más rápido posible. –

+0

Buena pregunta. En este caso, creo que realmente crea una DLL .NET que se ejecuta directamente y no se interpreta. Por lo tanto, lucene-core-2.4.0.dll se está ejecutando a través de CLR. IKVM puede tener otros modos en los que está haciendo una interpretación sobre la marcha que podría ser lenta. – Kalid

+1

A partir de pruebas rápidas, de nuestro conjunto de datos, etc. No veo una diferencia de rendimiento entre Lucene.NET y la versión de IKVMC. – Kalid

1

Descargue la fuente y compilela. Lo hice el fin de semana pasado y fue fácil. No hay problema. La fuente está en la versión 2.3.1.

Me suscribo a la lista de correo y a juzgar por ella, Lucene.Net se está desarrollando activamente.

+0

Interesante - Todavía preferiría la última versión (dada la facilidad con la que se puede portar con IKVM), pero gracias por el puntero ! – Kalid

+0

Parece que la última versión de desarrollo es 2.3, pero la última versión estable es 2.0.0.4. – Kalid

+0

Envío 2.3 con mi aplicación (BugTracker.NET) y hasta el momento no tengo quejas. –

1

Lucene.net está en desarrollo y ahora tiene tres committers

0

Convertí la Lucene 2.4 del tarro a dll a través de este camino, pero ahora me da un error que 'tipo o espacio Lucene no se pudo encontrar'. Eliminé el dll anterior del proyecto y agregué la referencia para el nuevo. Realmente quiero deshacerme de la versión anterior, ya que tardó alrededor de 2 días y al final durante la optimización dio un error y ahora el índice no es actualizable: S. Leí en alguna parte que la velocidad de indexación de Lucene 2.4 es mucho más rápida que las versiones anteriores, si uso 2.3.1 desde SVN, ¿será más rápido también?