Aanhalingstekens correct parseren in zoekopdrachten in volledige tekst


Samenvatting


SQL Server 7,0 of later full text search (FTS) biedt een uitgebreide set zoekfuncties. U kunt een contain-component gebruiken om verschillende zoekopdrachten uit te voeren, zoals:
  • Een woord of woordgroep.
  • Het voorvoegsel van een woord of woordgroep.
  • Een woord dat bij een ander woord staat.
  • Een woord dat via een andere inflectionally is gegenereerd. Het woord ' station ' is bijvoorbeeld de INFLECTIONAL, Drove, bestuurders en gerichte.
  • Een woord dat groter is dan het bepaalde gewicht van een ander woord.
De syntaxis bevat dubbele aanhalingstekens voor prefix ("Choc *") en voor meerdere woorden of woordgroepen ("chocolade-chip" of "Oatmeal"). Dit kan problematisch zijn in de voorwaarden van de GEBRUIKERSINTERFACE, omdat gebruikers niet gewend zijn te hoeven hun zoekopdrachten niet op de juiste manier te citeren en de zoekopdrachten te kunnen inactief maken. U moet een eenvoudige functie gebruiken die ontwikkelaars kunnen gebruiken om een queryreeks goed te citeren voordat deze wordt doorgegeven aan SQL Server.

Meer informatie


Hieronder ziet u een overzicht van de syntaxis van de query basis van de query met het trefwoord in de WHERE-component (voor uitgebreide beschrijving raadpleegt u de SQL Server 7,0-boeken online):
  • Eenvoudige term:
    WHERE CONTAINS(QuantityPerUnit, 'bottles')
  • Woordgroep met eenvoudige term:
    WHERE CONTAINS(ProductName, ' "Sasquatch ale" OR "steeleye stout" ')
  • Voorvoegsel term:
    WHERE CONTAINS(ProductName, ' "choc*" ')
  • OF met voorvoegsel term:
    WHERE CONTAINS(Description, '"sea*" OR "bread*"')
  • Nabijheids aanduiding:
    WHERE CONTAINS(ProductName, 'spread NEAR Boysenberry')
  • Generatie term:
    WHERE CONTAINS(ProductName, ' FORMSOF (INFLECTIONAL, dry) ')
  • Gewogen term:
    WHERE CONTAINS(Description, 'ISABOUT (spread weight (.8), 1)
U zult merken dat proximity, generatie en gewogen voorwaarden geen dubbele aanhalingstekens gebruiken. U ziet ook het volgende:
  • Afzonderlijke woorden en woordgroepen kunnen worden omgeven met dubbele aanhalingstekens (behalve in proximity, generatie en gewogen termen).
  • Zoekopdrachten voor de voorvoegsel term moeten tussen dubbele aanhalingstekens staan.
  • De zoekopdracht naar meerdere termen en woordgroepen moet elk woord en/of woordgroep omgeven met dubbele aanhalingstekens.
Met de voorgaande vereenvoudigde regels in gedachten kunt u een eenvoudige parser maken met behulp van reguliere expressies, zodat u aanhalingstekens correct rond een zoekreeks kunt plaatsen. Het te gebruiken algoritme luidt als volgt:
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
Het volgende is een JavaScript-versie:
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;}
Hieronder ziet u een VBScript-versie:
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