3 Stimmen

MS Sql Volltextsuche vs. LIKE-Ausdruck

Ich bin derzeit auf der Suche nach einer Möglichkeit, eine große Datenbank (500MB - 10GB oder mehr auf 10 Tabellen) mit vielen verschiedenen Feldern (nvarchars und bigints) zu durchsuchen. Viele der Felder, die durchsucht werden sollen, befinden sich nicht in der gleichen Tabelle.

Ein Beispiel: Eine Suche nach '5124 Peter' sollte alle Artikel zurückgeben, die ...

  • haben eine ID mit der Nummer 5124,
  • Peter" im Titel oder in der Beschreibung enthalten
  • eine Artikelbezeichnung mit der Nummer 5124 haben
  • erstellt von einem Benutzer namens 'peter' oder einem Benutzer, dessen ID 5124 enthält
  • erstellt von einem Nutzer mit '5124' oder 'peter' in seiner Adresse.

Wie soll ich die Suche durchführen? Ich habe gelesen, dass die Volltextsuche von MS-Sql viel leistungsfähiger ist als eine Abfrage mit dem LIKE-Schlüsselwort, und ich denke, die Syntax ist klarer, aber ich denke, sie kann nicht nach bigint(id)-Werten suchen, und ich habe gelesen, dass sie Leistungsprobleme mit der Indizierung hat und daher Einfügungen in die DB verlangsamt. In meinem Projekt wird es mehr Einfügen als Lesen, so dass dies ein Thema sein könnte.

Vielen Dank im Voraus, Marks

3voto

Mike Punkte 20677

Sie könnten eine eigenständige Suchmaschine wie Sphinx Search ausprobieren:

http://www.sphinxsearch.com/index.html

oder Apache Solr:

http://lucene.apache.org/solr/

1voto

greggersh Punkte 46

Ich glaube nicht, dass Sie mit MS SQL die erforderliche Leistung erzielen können. Sie müssen sehr komplexe Abfragen erstellen, um alle Daten/Tabellen abzudecken, die Sie durchsuchen wollen, und Sie haben die zusätzliche Belastung, dass Sie gleichzeitig mit der Abfrage Daten in die Datenbank schreiben müssen.

Ich würde vorschlagen, dass Sie sich entweder Apache Solr ( http://lucene.apache.org/solr/ ) oder Lucene ( http://lucene.apache.org ). Solr baut auf Lucene auf, beide können verwendet werden, um einen umgekehrten Dateiindex zu erstellen, im Grunde wie der Index am Ende eines Buches (Begriff 1 erscheint in den Dokumenten 1, 3, 7 usw.) Solr ist eine Search-Engine-in-a-Box und verfügt über mehrere Mechanismen, mit denen Sie ihr sagen können, wie und wo sie Daten indizieren soll. Lucene ist auf einer niedrigeren Ebene angesiedelt und ermöglicht es Ihnen, Ihre Indizierungs- und Sucharchitektur mit mehr Flexibilität einzurichten.

Das Gute an Solr ist, dass es als Webdienst verfügbar ist. Wenn Sie also nicht mit Java vertraut sind, können Sie einen Solr-Client in der Sprache Ihrer Wahl finden und Indexierungs- und Suchcode in der Sprache schreiben, die Ihnen am besten gefällt. Hier ist ein Link zu einer Liste von Client-Bibliotheken für Solr, einschließlich einiger in C# http://wiki.apache.org/solr/IntegratingSolr Damit würde ich anfangen.

0voto

Michael Punkte 10451

Die Volltextsuche ist auf jeden Fall leistungsfähiger als der Ausdruck "like". Was Sie tun können, ist einen Volltext-Index auf eine Ansicht anstelle einer Tabelle zu erstellen, und da es nur der Index ist, der durchsucht wird, die Tabelle Joins später speichern kann, die Dinge ein bisschen beschleunigen kann. Der View würde es Ihnen auch ermöglichen, die Bigint-Spalten in Varchar-Spalten zu konvertieren, die dann indiziert werden können, z.B. durch Verkettung aller zu durchsuchenden Spalten zu einer Varchar-Spalte. Dazu müssen Sie eine Ansicht mit SCHEMABINDING erstellen und mindestens eine Spalte auswählen, die eindeutig ist, und einen geclusterten eindeutigen Index für sie erstellen.

Was die Auswirkungen auf Volltext auf Einfügen Leistung, ich habe nicht viel von einer Auswirkung auf Bulk-Insert selbst bemerkt, aber ich sehe aus Stackoverflow Frage 3301470, jemand erwähnen, dass Leistung auf SQL 2005 langsam war, aber dass in SQL 2008, die jetzt behoben ist. Das liegt daran, dass der Index jetzt nach der Masseneinfügung und nicht mehr nach jeder einzelnen Zeile aktualisiert wird (ich verwende 2008). Wenn Sie 2005 verwenden, können Sie zur Verbesserung die Änderungsverfolgung nur für die Masseneinfügung deaktivieren und den Index danach manuell aktualisieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X