Як правильно проаналізувати лапки в повнотекстових запитах пошуку

Загальні відомості

SQL Server 7,0 або пізніша версія повнотекстового пошуку (FTS) містить Багатий набір функцій пошуку. Ви можете скористатися пунктом МІСТИТЬ речення, щоб виконувати різноманітні пошукові запити, наприклад:

  • Слово або фразу.

  • Префікс слова або фрази.

  • Слово, яке стоїть поруч із іншим словом.

  • Слово, яке можна створити в іншому документі. Наприклад, слово "диск" – це відповідне стебло: диски, поїхали, водіння та керовані.

  • Слово, яке має вищий рівень, що призначається, ніж інше слово.

Синтаксис має подвійні лапки для префікса ("Choc *") і для кількох пошуків слів або фраз ("шоколадна фішка" або "вівсянка"). Це може бути проблематично з точки зору дизайну інтерфейсу користувача, тому що користувачі не звикли належним чином цитувати свої пошукові запити та схильні робити помилки, коли вони роблять. Потрібна проста функція, яку розробники можуть використовувати для правильного пропонування рядка запиту, перш ніж передати його до сервера SQL Server.

Додаткові відомості

Нижче наведено огляд основ повнотекстового запиту синтаксису, що МІСТИТЬ ключове слово в реченні WHERE (для більш повного синтаксису, див. книги SQL Server 7,0):

  • Простий термін:

    WHERE CONTAINS(QuantityPerUnit, 'bottles')
  • Фраза у простому Терміні:

    WHERE CONTAINS(ProductName, ' "Sasquatch ale" OR "steeleye stout" ')
  • Термін префіксу:

    WHERE CONTAINS(ProductName, ' "choc*" ')
  • АБО з префіксом "термін":

    WHERE CONTAINS(Description, '"sea*" OR "bread*"')
  • Термін близькості:

    WHERE CONTAINS(ProductName, 'spread NEAR Boysenberry')
  • Термін генерації:

    WHERE CONTAINS(ProductName, ' FORMSOF (INFLECTIONAL, dry) ')
  • Термін дії:

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

Зверніть увагу, що близькість, генерація та зважені умови не використовують подвійні лапки. Також зверніть увагу, що:

  • Окремі слова та фрази можуть бути оточені подвійними лапками (за винятком близькості, генерації та зважених термінів).

  • Пошук у префіксних термінів має бути оточене подвійними лапками.

  • За допомогою кількох термінів і фраз потрібно, щоб кожне слово та/або фразу оточували подвійні лапки.

Використовуючи попередні спрощені правила, можна створити простий аналізатор за допомогою регулярних виразів для правильного розміщення лапок в рядках пошуку. Алгоритм використання:

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

Нижче наведено версію JavaScript:

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;}

Нижче наведено версію VBScript:

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

Потрібна додаткова довідка?

Отримуйте нові функції раніше за інших
Приєднатися до Microsoft оцінювачів

Чи були ці відомості корисні?

Дякуємо за ваш відгук!

Дякуємо, що знайшли час і надіслали нам відгук! Можливо, у нас не буде часу відповісти на кожен коментар, але докладемо максимум зусиль, щоб переглянути їх усі. Вас цікавить, як ми використовуємо ваші відгуки?

×