7

Ich habe eine ASP.NET MVC-Anwendung mit MVC 2.0 und Fluent NHibernate (aus bestimmten Gründen versteckt hinter Repositories) erstellt. Die Anwendung stellt eine recht komplexe Domäne mit verschiedenen Objekten wie Benutzern, Nachrichten, Kommentaren, Dateien und Terminen dar.Was ist der beste Weg, um eine Volltextsuche für eine ASP.NET MVC-Anwendung zu implementieren?

Jetzt möchte ich eine Volltextsuche implementieren, die es dem Benutzer ermöglicht, einfach alle Arten von Inhalten zu finden, indem er einfach einen Suchbegriff eingibt. Wenn ich alle Arten von verschiedenen Objekten in der Anwendung separat handhabe, muss ich sie jetzt für die Suche "zusammensetzen". Das heißt, der Benutzer unterscheidet nicht zwischen den verschiedenen Typen, er gibt nur "xyz" ein und möchte Ergebnisse in einer Liste erhalten, Kommentare mit Nachrichten vermischt.

Option 1 besteht darin, einen Suchdienst zu erstellen, der die Suche abruft Ergebnis aus den verschiedenen Repositories und bereitet die kombinierte Ausgabe vor (Sortieren, Paging etc.). Aber das ist wirklich, wirklich teuer, wenn die Daten dahinter wachsen (und es wird wachsen).

So suche ich nach einer alternativen Lösung. Derzeit arbeite ich mit SQL Server 2008. Was ich gefunden habe, ist lucene.net (http://lucene.apache.org/lucene.net/), aber ich habe noch nicht viel Zeit investiert.

Irgendwelche Vorschläge?

Antwort

2

Ich würde definitiv mit SQL-Volltext-Funktionen gehen. Ich verstehe, dass ein Teil des Inhalts in Dateien, anderen Strukturen verfügbar sein könnte, aber selbst dann sollte die Mehrheit der Daten im Backend sein und SQL macht einen guten Job mit Volltextindizes architekturweise.

Ich würde vorschlagen, dass Sie mit SQL-Volltext beginnen und eine kleine Komponente erstellen, die die anderen Ressourcen abfragt (falls erforderlich). Ich gehe davon aus, dass 80% der durchsuchbaren Inhalte von SQL Server stammen würden.

Hier sind ein paar Ressourcen mit SQL Server Volltext in gestartet:

  1. http://msdn.microsoft.com/en-us/library/ms142571.aspx
  2. http://www.dotnetfunda.com/articles/article1019-implementing-fulltext-search-on-view-.aspx?sms_ss=dotnetshoutout
+0

Es ist sogar 100% der Daten von SQL Server. Du hast also recht, ich nehme einfach den guten alten Weg, vielleicht sogar mit einer gespeicherten Prozedur oder einfach ADO.NET - zum Glück benutze ich immer noch Repositories. –

2

Für .Net können Sie in RavenDB suchen, die Lucene als Indexspeicher verwendet und Ihnen die Suchfunktionen von Lucene als Bonus zur Verfügung stellt. Es könnte einfacher zu verwenden sein. Sicherlich flexibler und bessere API's. Aber Sie sollten in den Speicheraufwand schauen.

Je nach Bedarf können Sie in SQL Server Full Text Search aktivieren, die Ihnen zusätzliche Abfragefunktionen von SQL bietet. Auf diese Weise müssen Sie keinen anderen Index außerhalb Ihrer Datenbankdaten verwalten. Wenn sich Ihre Daten in mehreren Repositorys befinden, ist die Verwendung eines externen Index wie Lucene möglicherweise eine bessere Methode.

Wie bei anderen Volltextsuchmaschinen haben Sie Microsoft Search Server Express, aber Sie müssen möglicherweise Ihren eigenen Inhaltskonnektor erstellen, um die Daten zu erhalten (wiederum abhängig von Ihren Repositories).

+0

@jfar: Bearbeitete meine Antwort, um dies zu reflektieren. Ich denke immer noch, dass die Verwendung von RavenDB als Ersatz für Lucene direkt eine Option ist, da die API es bereitstellt. –

+0

meine Abstimmung aktualisiert und Kommentar entfernt, um Ihre Bearbeitung zu reflektieren;) – jfar

0

Einfach zu sagen "Verwendung Volltext" ist nicht genug. Seine Lösung besteht nicht notwendigerweise darin, eine erweiterte Textsuche innerhalb jedes Entitätstyps zu haben. Er muss in der Lage sein, den Index für einen beliebigen Entitätstyp basierend auf der Abfragezeichenfolge abzufragen. Ich könnte sehen, NHibernate.Search als die Methode zu verwenden, um einen Lucene-Index zu füllen, aber nicht wissen, ob seine Fähigkeiten die Suche des Index unabhängig vom Indexdokumenttyp unterstützen (die NHibernate-Klasse wird beibehalten). Daher müssen Sie den Lucene-Index möglicherweise direkter abfragen und die Ergebnisse für die Anzeige oder den direkten Abruf des zugrunde liegenden Objekts in der SQL-Server-DB über NHibernate selbst interpretieren.