Nach ein paar Tagen voller Arbeit habe ich endlich eine einfache Volltextsuche implementiert. Lassen Sie mich
diesen Artikel überprüfen und zusammenfassen. Was kann Lucene.Net tun? Und die Frage, wie geht das? Abschließend wird ein Beispiel für die Implementierung der Volltextsuche durch Lucene.Net gegeben.
1. Was ist Lucene.Net?
Lucene.net war ursprünglich ein Open-Source-Projekt und wurde dann kommerzialisiert. Lucene.net 2.0 wurde ebenfalls veröffentlicht, allerdings für Geld D. Das Schicksal von Lucene.net ähnelt in gewisser Weise dem von FreeTextBox, das mit der Veröffentlichung von 2.0 nach Version 1.6 begann. 5. Kommerzieller Weg, 2.0 bietet eine kostenlose Version in Form einer DLL, und für die Quellcode-Version muss eine kommerzielle Lizenz erworben werden. Der Quellcode bleibt jedoch bei Version 1.6.5, und Sie können die meisten internen Details weiterhin sehen , aber in Version 2.0. Die zusätzliche Unterstützung für den Mozilla-Browser ist nur durch die von ihm generierten HTML- und JavaScript-Skripte sichtbar.
Lucene ist eine in der Java-Welt häufig verwendete Indexierungs-API. Mit den von ihr bereitgestellten Methoden können Sie Indizes für Textmaterialien erstellen und den Abruf ermöglichen. (Referenz: NLucene und Lucene .NET) NLucene ist der erste .net-Port und eine Version im .net-Stil, die .net-Namenskonventionen und Klassenbibliotheksdesign verwendet. Aus Energiegründen veröffentlichte der Leiter des NLucene-Projekts jedoch nur die 1.2beta-Version. Nach der Entstehung des Lucene.NET-Projekts gab es keine neuen Pläne für NLucene.
Lucene.NET behauptete ursprünglich, eine aktuelle .net-Lucene-Transplantation zu sein. Es übernahm lediglich die Vorschläge von .net in Bezug auf die Benennung. Sein Hauptziel bestand darin, das Indexformat kompatibel zu machen Sie könnten zusammenarbeiten. Einer davon besteht darin, dass die Benennung ähnlich ist (mit nur wenigen Unterschieden, wie z. B. Groß- und Kleinschreibung usw.), und der Zweck besteht darin, Entwicklern die Verwendung von Java Lucene-bezogenem Code und Informationen zu erleichtern.
Ich weiß nicht, wann das Lucene.NET-Projekt seinen Open-Source-Plan aufgegeben und sich dem Geschäft zugewandt hat. Tatsächlich wurden die Open-Source-Dateien auf SourceForge gelöscht. Zur gleichen Zeit erschien das dotLucene-Projekt auf SourceForge. Aus Protest gegen Lucene.NET hätte dotLucene den Lucene.NET-Code fast intakt als Ausgangspunkt genommen. ( https://sourceforge.net/forum/forum.php?thread_id=1153933&forum_id=408004 ).
Um es ganz klar auszudrücken: Lucene.Net ist eine Informationsabruffunktionsbibliothek (Bibliothek). Sie können damit Ihrer Anwendung Indizierungs- und Suchfunktionen hinzufügen,
ohne dass Sie über umfassende Kenntnisse im Volltextabruf verfügen müssen Wenn Sie wissen, wie Sie die Funktionen in der Bibliothek aufrufen, können Sie die Volltextsuchfunktion für Ihre Anwendung realisieren.
Erwarten Sie jedoch nicht, dass Lucene eine Suchmaschine wie Google und Baidu ist ein Tool, eine Bibliothek. Sie können es sich auch als eine einfache und benutzerfreundliche API vorstellen, die Indizierungs- und Suchfunktionen kapselt. Mit dieser API können Sie viele suchbezogene Dinge tun, und das ist sehr praktisch Ihre Anforderungen erfüllen. Eine Anwendung führt eine einfache Volltextsuche durch. Als Anwendungsentwickler (nicht professioneller Suchmaschinenentwickler) reichen ihre Funktionen aus, um Sie zufriedenzustellen.
2. Was kann Lucene.Net tun?
Lucene kann alle Daten indizieren und durchsuchen, solange sie in Text umgewandelt werden können. Mit anderen Worten, ob es sich um MS Word, HTML oder PDF handelt Sonstiges Jede Art von Datei kann von Lucene verwendet werden, solange Sie Textinhalte daraus extrahieren können. Sie können Lucene verwenden, um sie zu indizieren und zu durchsuchen.
3. Wie verwendet man Lucene.Net?
Es läuft einfach darauf hinaus, einen Index zu erstellen und einen Index zu verwenden. Beim Erstellen eines Index handelt es sich um das Speichern oder Analysieren der Informationen der zu durchsuchenden Datenquelle als unsere Schlüsselinformationen, und das Hinterlassen einer Markierung für die Suche ist wie das Erstellen einer Tabelle Inhalt in Word (persönliches Verständnis) Die Verwendung des Index besteht darin, die Datenquelle während der Suche anhand der Indexinformationen zu analysieren und die benötigten Informationen zu extrahieren.
Schauen Sie sich bitte das Beispiel an:
öffentliche Klasse IntranetIndexer
zum Erstellen eines Index
{
/**/////Indexschreiber
privater IndexWriter-Writer;
//Das Stammverzeichnis der Datei, die in den Index geschrieben werden soll
private Zeichenfolge docRootDirectory;
//Abgleichendes Dateiformat
privates string[]-Muster;
/**//// <Zusammenfassung>
/// Initialisieren Sie einen Indexschreiber. True bedeutet, dass die Indexdatei neu erstellt wird, wenn die Indexdatei bereits vorhanden ist überschrieben.
/// </summary>
/// <param name="directory">Das zu indizierende Verzeichnis wird übergeben. Beachten Sie, dass es sich um einen Zeichenfolgenwert handelt. Wenn das Verzeichnis nicht existiert, wird es automatisch erstellt</param>
publicIntranetIndexer(String-Verzeichnis)
{
write = new IndexWriter(directory, new StandardAnalyzer(), true);
Writer.SetUseCompoundFile(true);
}
public void AddDirectory(DirectoryInfo-Verzeichnis, Zeichenfolge []-Muster)
{
this.docRootDirectory = Verzeichnis.FullName;
this.pattern = Muster;
addSubDirectory(Verzeichnis);
}
private void addSubDirectory(DirectoryInfo-Verzeichnis)
{
for(int i=0;i<pattern .Length ;i++)
{
foreach (FileInfo fi im Verzeichnis.GetFiles(pattern[i]))
{
AddHtmlDocument(fi.FullName);
}
}
foreach (DirectoryInfo di indirectory.GetDirectories())
{
addSubDirectory(di);
}
}
public void AddHtmlDocument(string path)
{
string exname=Path.GetExtension (Pfad);
Dokumentdokument = neues Dokument();
Zeichenfolge HTML;
if(exname.ToLower ()==".html" ||exname .ToLower ()==".htm"||exname .ToLower ()==".txt")
{
using(StreamReader sr=new StreamReader (path,System .Text .Encoding .Default ))
{
html = sr.ReadToEnd();
}
}
anders
{
using (StreamReader sr = new StreamReader(path, System.Text.Encoding.Unicode ))
{
html = sr.ReadToEnd();
}
}
int relativePathStartsAt = this.docRootDirectory.EndsWith("\") ? this.docRootDirectory.Length : this.docRootDirectory.Length + 1;
string relativePath = path.Substring(relativePathStartsAt);
string title=Path.GetFileName(path);
//Bestimmen Sie, ob es sich um eine Webseite handelt, entfernen Sie das Tag, andernfalls verwenden Sie es nicht
if(exname.ToLower ()==".html" ||exname .ToLower ()==".htm")
{
doc.Add(Field.UnStored("text", parseHtml(html)));
}
anders
{
doc.Add (Field .UnStored ("text",html));
}
doc.Add(Field.Keyword("path", relativePath));
//doc.Add(Field.Text("title", getTitle(html)));
doc.Add (Field .Text ("title",title));
Writer.AddDocument(doc);
}
/**//// <Zusammenfassung>
/// Tags von Webseiten entfernen
/// </summary>
/// <param name="html">Webseite</param>
/// <returns>Entfernten Webseitentext zurückgeben</returns>
privater String parseHtml(string html)
{
string temp = Regex.Replace(html, "<[^>]*>", "");
return temp.Replace(" ", " ");
}
/**//// <Zusammenfassung>
/// Holen Sie sich den Seitentitel
/// </summary>
/// <param name="html"></param>
/// <returns></returns>
privater String getTitle(string html)
{
Match m = Regex.Match(html, "<title>(.*)</title>");
if (m.Groups.Count == 2)
return m.Groups[1].Value;
return „Dokumenttitel unbekannt“;
}
/**//// <Zusammenfassung>
/// Index optimieren und Writer schließen
/// </summary>
öffentliche Leere Close()
{
Writer.Optimize();
Writer.Close();
}
}
Erstellen Sie zunächst ein Document-Objekt und fügen Sie dann einige Attribute Field zum Document-Objekt hinzu. Sie können sich das Document-Objekt als eine virtuelle Datei vorstellen, aus der in Zukunft Informationen abgerufen werden. Das Feld wird als Metadaten betrachtet, die diese virtuelle Datei beschreiben Darunter umfasst das Feld vier Typen: Schlüsseldaten
dieses Typs werden nicht analysiert, sondern indiziert und im Index gespeichert.
Nicht indiziert
Daten dieser Art werden nicht analysiert oder indiziert, sondern im Index gespeichert.
Nicht gespeichert
Im Gegensatz zu UnIndexed wird es analysiert und indiziert, aber nicht gespeichert.
Text
Ähnlich wie UnStored. Wenn der Werttyp „String“ ist, wird er nicht gespeichert, genau wie „UnStored“.
Abschließend wird jedes Dokument dem Index hinzugefügt.
Das Folgende ist eine Suche im Index
//Erstelle einen Indexer
IndexSearcher searcher = new IndexSearcher(indexDirectory);
//Das Textfeld des Index für die Suche analysieren
Abfrage query = QueryParser.Parse(this.Q, "text", new StandardAnalyzer());
//Suchergebnisse in Treffer einfügen
Treffer hits = searcher.Search(query);
//Statistik über die Gesamtzahl der durchsuchten Datensätze
this.total = hits.Length();
//Hervorheben
QueryHighlightExtractor highlighter = new QueryHighlightExtractor(query, new StandardAnalyzer(), "<font color=red>", "</font>");
Der erste Schritt besteht darin, IndexSearcher zu verwenden, um die Indexdatei für nachfolgende Suchvorgänge zu öffnen, und der Parameter ist der Pfad der Indexdatei.
Der zweite Schritt besteht darin, QueryParser zu verwenden, um besser lesbare Abfrageanweisungen zu konvertieren (z. B. das Abfragewort Lucene usw.). erweiterte Methoden lucene AND. net) in ein von Lucene intern verwendetes Abfrageobjekt
und gibt die Ergebnisse an die Treffersammlung zurück. Es ist zu beachten, dass Lucene nicht alle Ergebnisse auf einmal in Treffer einfügt Aus Platzgründen
werden die Suchergebnisse dann verarbeitet und auf der Seite angezeigt:
for (int i = startAt; i < resultsCount; i++)
{
Document doc = hits.Doc(i);
string path = doc.Get("path");
string location =Server.MapPath("documents")+" \"+path ;
string exname=Path.GetExtension (Pfad);
string plainText;
string str=doc.Get ("title");
if(exname==".html" || exname ==".htm" || exname ==".txt")
{
using (StreamReader sr = new StreamReader(location, System.Text.Encoding.Default))
{
plainText = parseHtml(sr.ReadToEnd());
}
}
anders
{
using (StreamReader sr = new StreamReader(location, System.Text.Encoding.Unicode ))
{
plainText = sr.ReadToEnd();
}
}
//DataTable Zeilen hinzufügen
DataRow row = this.Results.NewRow();
row["title"] = doc.Get("title");
string IP=Request.Url.Host;//Server-IP abrufen
//Request.Url.Port;
row["path"]=@" http://"+IP+"/WebUI/Search/documents/"+path ;
row["sample"] = highlighter.GetBestFragments(plainText, 80, 2, "");
this.Results.Rows.Add(row);
}
searcher.Close();//Schließen Sie den Sucher. Wenn Sie mehr über Lucene.Net erfahren möchten, besuchen Sie bitte die Website:
http: //blog.tianya. cn/blogger/view_blog.asp?BlogName=aftaft