2009-04-28 6 views
1

Ich habe ein Suchfeld, in das Benutzer Begriffe eingeben können. Ich habe ein Tabellen-Setup mit Volltextsuche in einer String-Spalte. Nehmen wir an, ein Benutzer gibt Folgendes ein: "Word, Office, Microsoft" und klickt auf "Suchen".Asp.net Volltext mehrere Suchbegriffe Methodik

Ist dies der beste Weg, um mehrere Suchbegriffe zu behandeln?

(pseudocode) 
foreach (string searchWord in searchTerms){  
    select col1 from myTable where contains(fts_column, ‘searchWord’) 
} 

Gibt es eine Möglichkeit, die Suchbegriffe in den SQL einzufügen und nicht zu iterieren? Ich versuche, die Anzahl der Aufrufe an den SQL-Server zu reduzieren.

Antwort

2

FREETEXT könnte für Sie arbeiten. Es wird die Zeichenkette in einzelne Wörter basierend auf Wortgrenzen (Wort-Brechen) trennen. Dann hätten Sie nur einen einzigen SQL-Aufruf.

MSDN -- FREETEXT

+0

Freitext (sqlcolumn, 'test1, test3') scheint die Arbeit zu erledigen. Vielen Dank! – Paulj

0

Nun könnte man nur bauen Sie Ihre SQL-Abfrage dynamisch ...

string [] searchWords = searchTerm.Split(","); 

string SQL = "SELECT col1 FROM myTable WHERE 1=2"; 

foreach (string word in searchWords) 
{ 
    SQL = string.Format("{0} OR contains(fts_column, '{1}')", SQL, word); 
} 

//EXEC SQL... 

Offensichtlich ist dies mit den üblichen Warnungen kommt/Ausschlussklauseln über SQL Injection etc ... aber das Prinzip ist, dass Sie dynamisch aufbauen würde up all Ihre Klauseln und wenden Sie sie in einer Abfrage an.

Je nachdem, wie Sie mit Ihrer DB interagieren, ist es möglich, dass Sie den gesamten un-Split-Suchbegriff in einen SPROC übertragen und dann & dynamischen SQL in die gespeicherte Prozedur aufteilen.

0

Man könnte es ähnlich tun, was haben Sie da: nur die Suchbegriffe basierend auf Trennzeichen analysieren und dann einen Anruf auf jedem machen, zusammen, um die Ergebnisse verbinden. Alternativ können Sie mehrere CONTAINS:

SELECT Name FROM Products WHERE CONTAINS(Name, @Param1) OR CONTAINS(Name, @Param2) etc. 

Vielleicht versuchen beide und sehen, welche schneller in Ihrer Umgebung ist.