Suche Datenbank - ASP.NET MVC C#
Ich bin versucht zu implementieren, die vollständige Suchfunktion in meine ASP.NET MVC (C#, Linq-to-Sql) website.
Der Ort besteht aus etwa 3-4 Tabellen, die über 1-2 Spalten, die ich durchsuchen möchten.
Dies ist, was ich habe, so weit:
public List<SearchResult> Search(string Keywords)
{
string[] split = Keywords.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
List<SearchResult> ret = new List<SearchResult>();
foreach (string s in split)
{
IEnumerable<BlogPost> results = db.BlogPosts.Where(x => x.Text.Contains(s) || x.Title.Contains(s));
foreach (BlogPost p in results)
{
if (ret.Exists(x => x.PostID == p.PostID))
continue;
ret.Add(new SearchResult
{
PostTitle= p.Title,
BlogPostID = p.BlogPostID,
Text=p.Text
});
}
}
return ret;
}
Wie Sie sehen können, habe ich eine foreach-für die keywords und eine innere foreach-das läuft über eine Tabelle (ich wiederhole es für jede Tabelle).
Scheint dies inefficent und ich wollte wissen, ob es gibt ein besserer Weg, um eine Suche nach Methode für eine Datenbank.
Also, was kann ich tun, um die Spalten in der Datenbank, so dass Sie durchsucht werden können schneller? Lese ich etwas über die Indizierung von Ihnen, ist, dass nur die "Full-text indexing" True/False Feld sehe ich im SQL-Management-Studio?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, aktivieren Sie die Volltextindizierung wird in der Regel gehen einen langen Weg zur Verbesserung der Leistung für dieses Szenario. Aber leider funktioniert es nicht automatisch mit dem operator LIKE (und das ist, was Ihre LINQ-Abfrage generiert). Also müssen Sie verwenden Sie eine der integrierten Volltext-Suche Funktionen wie FREETEXT, FREETEXTTABLE, ENTHÄLT, oder der CONTAINSTABLE-Funktion.
Einfach zu erklären, dein original-code ist erheblich langsamer als full-text-Suche ein, so wie es typischerweise in einem table scan. Zum Beispiel, wenn Sie auf der Suche nach einem varchar-Feld mit dem Namen Titel mit LIKE '%ABC%' - dann gibt es keine Wahl, sondern für SQL Scannen jeden einzelnen Datensatz, um zu sehen, wenn es enthält diese Zeichen.
Jedoch die integrierte Volltext-Suche wird der index tatsächlich den text für jede Spalte, die Sie angeben, um in den Volltext-index. Und es ist, dass der index, drastisch beschleunigt Ihre Fragen.
Nicht nur das, sondern Volltext-Suche bietet einige Coole features, die den LIKE-operator kann es nicht geben Ihnen. Es ist nicht so anspruchsvoll wie Google, aber es hat die Fähigkeit, um die Suche für Alternative Versionen von root-Wort. Aber einer meiner Lieblings-features ist die ranking-Funktionalität, wo es auch einen zusätzlichen Wert zu geben Relevanz, die Sie dann verwenden können, um zu Sortieren Sie Ihre Ergebnisse. Zu verwenden, der Blick in die FREETEXTTABLE oder CONTAINSTABLE Funktionen.
Einige weitere Ressourcen:
Folgenden sollte den trick tun. Ich kann nicht sagen, dass aus der Spitze von meinem Kopf, ob die lassen kwa = ... Teil tatsächlich funktioniert oder nicht, aber etwas ähnliches wird benötigt, um das array der verfügbaren Schlüsselwörter innerhalb des Sicherheitskontexts des SQL Server. Ich habe nicht verwendet LINQ to SQL für eine Weile (ich habe mit LINQ to Entities 4.0 und nHibernate für einige Zeit jetzt, die haben einen anderen Satz von Fähigkeiten). Müssen Sie möglicherweise zu zwicken, dass Teil zum laufen zu bringen, aber das Allgemeine Prinzip ist sound: