Richtiges Analysieren von Anführungszeichen in voll Text Suchabfragen

Zusammenfassung

In SQL Server 7,0 oder höher ist die voll Text Suche (FTS) ein umfassender Satz an Suchfunktionen. Sie können eine Contains-Klausel verwenden, um eine Vielzahl von Suchvorgängen auszuführen, beispielsweise:

  • Ein Wort oder ein Ausdruck.

  • Das Präfix eines Worts oder Ausdrucks.

  • Ein Wort, das sich in der Nähe eines anderen Worts befindet.

  • Ein Wort, das von einem anderen inflectionally generiert wird. Das Wort "Laufwerk" ist beispielsweise der Flexions-Stamm von: Drives, driven, Driving und driven.

  • Ein Wort mit einer höheren festgelegten Gewichtung als ein anderes Wort.

Die Contains-Syntax erfordert doppelte Anführungszeichen für prefix ("Choc *") und für mehrere Word-oder Phrase-Suchvorgänge ("Chocolate Chip" oder "Haferflocken"). Dies kann in Bezug auf den UI-Entwurf problematisch sein, da Benutzer nicht daran gewöhnt sind, Ihre Suchvorgänge ordnungsgemäß zu zitieren und fehleranfällig sind, wenn dies der Fall ist. Eine einfache Funktion ist erforderlich, mit der Entwickler eine Abfragezeichenfolge richtig zitieren können, bevor Sie Sie an SQL Server weiterleiten.

Weitere Informationen

Im folgenden finden Sie eine Übersicht über die Grundlagen der Volltextabfrage Syntax mit dem Contains-Schlüsselwort in der WHERE-Klausel (für vollständigere Syntax lesen Sie die SQL Server 7,0-Online Dokumentation):

  • Einfacher Ausdruck:

    WHERE CONTAINS(QuantityPerUnit, 'bottles')
  • Ausdruck im einfachen Ausdruck:

    WHERE CONTAINS(ProductName, ' "Sasquatch ale" OR "steeleye stout" ')
  • Präfix Ausdruck:

    WHERE CONTAINS(ProductName, ' "choc*" ')
  • Oder mit Präfix Ausdruck:

    WHERE CONTAINS(Description, '"sea*" OR "bread*"')
  • Näherungs Begriff:

    WHERE CONTAINS(ProductName, 'spread NEAR Boysenberry')
  • Generierungs Ausdruck:

    WHERE CONTAINS(ProductName, ' FORMSOF (INFLECTIONAL, dry) ')
  • Gewichteter Ausdruck:

    WHERE CONTAINS(Description, 'ISABOUT (spread weight (.8), 1)

Beachten Sie, dass Näherungs-, Generierungs-und gewichtete Ausdrücke keine doppelten Anführungszeichen verwenden. Beachten Sie außerdem Folgendes:

  • Einzelne Wörter und Ausdrücke können mit doppelten Anführungszeichen (außer in Näherungs-, Generierungs-und gewichteten Ausdrücken) umgeben sein.

  • Suchbegriffe für Präfixe müssen mit doppelten Anführungszeichen umgeben sein.

  • Für mehrere Ausdrucks-und Ausdrucks suchen muss jedes Wort und/oder jeder Ausdruck mit doppelten Anführungszeichen umgeben sein.

Mit den vorstehenden vereinfachten Regeln können Sie einen einfachen Parser mithilfe regulärer Ausdrücke erstellen, um Anführungszeichen ordnungsgemäß in Suchzeichenfolgen zu platzieren. Der zu verwendende Algorithmus lautet:

Replace all double quotes (clears the text and any improper quotations)   If the text string contains one of the key words "NEAR", "FORMSOF", or    "ISABOUT", the parsing is complete   Else      Surround any instances of 'and' or 'and not' with quotes      Surround any instances of 'or' or 'or not' with quotes      Surround the entire string with quotes

Es folgt eine JavaScript-Version:

function fxnParseIt() {// Note: sInputString code for demo purposes only, and should be//   replaced with user's code for getting in string value.var sInputString = 'asp and database';sText = sInputString;sText = sText.replace(/"/g,"");if (sText.search(/(formsof|near|isabout)/i) == -1) {sText = sText.replace(/ (and not|and) /gi,'" $1 "');sText = sText.replace(/ (or not|or) /gi,'" $1 "');sText = '"' + sText + '"';}sInputString = sText;}

Es folgt eine VBScript-Version:

Sub ParseIt()      '// Note: sInputString code for demo purposes only, and should be      '/replaced with user's code for getting in string value.      '// Note: this code could also be easily re-written as a function,      '/        and is written as a sub for demo purposes only.      Dim strIn, RegEx, sInput      sInputString = "asp and database"      strIn = sInput      Set RegEx = New RegExp      If Len(strIn) < 1 Then            MsgBox ("You must enter a search string")      Else            strIn = Replace(strIn, Chr(34), "")            If (InStr(strIn, "formsof") > 0) Or (InStr(strIn, "near") > 0) Or (InStr(strIn, "isabout") > 0) Then                  ParseMe.value = strIn            Else                  RegEx.IgnoreCase = True                  RegEx.Global = True                  RegEx.Pattern = "( and not | and )"                  strIn = RegEx.Replace(strIn, Chr(34) & "$1" & Chr(34))                  RegEx.Pattern = "( or not | or )"                  strIn = RegEx.Replace(strIn, Chr(34) & "$1" & Chr(34))                  strIn = Chr(34) & strIn & Chr(34)                  ParseMe.value = strIn            End If      End IfEnd Sub

Benötigen Sie weitere Hilfe?

Ihre Office-Fähigkeiten erweitern
Schulungen erkunden
Neue Funktionen als Erster erhalten
Microsoft Insider beitreten

War diese Information hilfreich?

Vielen Dank für Ihr Feedback!

Vielen Dank für Ihr Feedback. Es klingt, als ob es hilfreich sein könnte, Sie mit einem unserer Office-Supportmitarbeiter zu verbinden.

×