У меня проблема при использовании полнотекстового поиска SQL Server на SQL Server 2016.
Я хочу найти все строки, которые содержат все слова в тексте запроса, но не заботятся о порядкеслов в тексте запроса.
Пример, если одна строка столбца:
"this is my first hello world sql code"
Я хочу найти эту строку по любому из следующего текста запроса:
"hello"
"hello world"
"world hello"
Моя идея состоит в том, чтобы разбить текст запроса на список слов и соединить их с помощью AND, прежде чем передать текст в предикат CONTAINS.Например, если текст запроса «world hello», я буду использовать предикат CONTAINS следующим образом:
CONTAINS(text, 'world AND hello')
Я также рассмотрел стоп-слова в тексте запроса, поэтому перед тем, как соединить слова с AND, я сначала удалювсе стоп-слова из текста запроса.
Например, если текст запроса «это мой», окончательный текст, используемый в СОДЕРЖАНИИ, будет:
CONTAINS(text, 'this AND my')
Слово «есть» - этоудалено из текста.У меня есть список стоп-слов, который содержит все стоп-слова SQL Server по умолчанию, полученные из таблицы sys.fulltext_system_stopwords .
Пока все хорошо.Но проблема в том, что он не работает, если в тексте есть специальные символы.
Например, есть одна строка со значением:
"AT & T is cool"
И текст запроса "AT &T ", он не вернет результаты, если я просто воспользуюсь следующим кодом:
CONTAINS(text, 'AT AND & AND T')
Вместо этого я должен удалить '&' перед тем, как объединить слова.И аналогично всем другим специальным символам, таким как '-', '+', '*' и т. Д.
Но проблема в том, где получить полный список специальных символов, которые SQL-сервер удалил при построении инвертированияИндексные токены?
Или есть ли другие решения, удовлетворяющие моим требованиям к соответствию всех слов?