2008-10-31 3 views
9

Lucene ist eine ausgezeichnete Suchmaschine, aber die .NET-Version ist hinter der offiziellen Java-Version (neueste stabile .NET-Version ist 2.0, aber die neueste Java Lucene-Version ist 2.4, die mehr Funktionen hat).Wie läuft Lucene auf .net?

Wie kommst du dazu?

+0

Jemand mit mehr Lob als ich soll die „lucence“ bearbeiten, um Lucene – friism

+0

gerade reparierte es :) – Kalid

Antwort

20

Eine Möglichkeit, die ich gefunden habe, die überrascht war, könnte funktionieren: Erstellen Sie eine .NET DLL aus einer Java .jar Datei! Mit IKVM Sie können download Lucene, erhalten die .jar-Datei, und führen Sie:

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

, die eine .NET-DLL wie folgt erzeugt: Lucene-Core-2.4.0.dll

können Sie dann verweisen gerade diese DLL von Ihrem Projekt und Sie sind gut zu gehen! Es gibt einige Java-Typen, die Sie benötigen, also referenzieren Sie auch IKVM.OpenJDK.ClassLibrary.dll. Ihr Code könnte etwa so aussehen:

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); 

Ich wusste nie, dass Sie Java so leicht mit .NET-Interoperabilität verbinden können. Der beste Teil ist, dass C# und Java "fast" mit Quellcode kompatibel sind (wo Lucene Beispiele betroffen sind). Ersetzen Sie einfach System.Out durch Console.Writeln :).

=======

Update: Wenn Bibliotheken wie der Highlighter Lucene bauen, stellen Sie sicher, dass Sie den Kern Assembly verweisen (sonst Warnungen erhalten Sie über fehlende Klassen). So wird der Textmarker wie folgt aufgebaut:

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

Dies ist mein erstes Mal, das Lernen von IKVM. Ist die Leistung in Ordnung? Weil jede Anweisung im ursprünglichen Java zwei Ebenen der VM durchlaufen muss, richtig? Die IKVM JVM und dann die .NET CLR. Und Suche ist eine Sache, die Sie so schnell wie möglich sein möchten. –

+0

Gute Frage. In diesem Fall glaube ich, dass es tatsächlich eine .NET-DLL erstellt, die direkt ausgeführt wird und nicht interpretiert wird. Also, lucene-core-2.4.0.dll läuft durch die CLR. IKVM kann andere Modi haben, in denen es eine On-the-Fly-Interpretation macht, die langsam sein könnte. – Kalid

+1

Aus schnellen Tests, für unseren Datensatz usw. kann ich keinen Leistungsunterschied zwischen Lucene.NET und der IKVMC-Version feststellen. – Kalid

1

Laden Sie die Quelle und bauen es. Ich habe das erst letztes Wochenende gemacht und es war einfach. Überhaupt kein Problem. Die Quelle ist Version 2.3.1.

Ich habe die Mailingliste abonniert und beurteile daraus, dass Lucene.Net aktiv entwickelt wird.

+0

Interessant - ich würde immer noch die neueste Version bevorzugen (angesichts wie einfach es mit IKVM portiert werden kann), aber danke für den Zeiger ! – Kalid

+0

Es sieht aus wie die neueste Entwicklungsversion ist 2.3, aber die neueste stabile Version ist 2.0.0.4. – Kalid

+0

Ich liefere 2,3 mit meiner App (BugTracker.NET) und bisher keine Beschwerden. –

1

Lucene.net ist in der Entwicklung und hat jetzt drei Committer

0

ich das Lucene 2.4 aus Glas umgewandelt durch diese Art und Weise dll, aber jetzt gibt es mir einen Fehler, dass ‚Typ oder Namespace Lucene konnte nicht gefunden werden.‘ Ich entfernte die alte DLL vom Projekt und fügte Referenz für das neue hinzu. Ich möchte wirklich die alte Version loswerden, da es ungefähr 2 Tage gedauert hat und am Ende während der Optimierung einen Fehler verursacht hat und jetzt der Index nicht aktualisierbar ist: S. Ich habe irgendwo gelesen, dass die Indexierungsgeschwindigkeit von Lucene 2.4 um ein Vielfaches schneller ist als die alten Versionen, wenn ich 2.3.1 von SVN verwende, wird das auch schneller sein?