Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Область применения: SQL Server
База данных SQL Azure Управляемый экземпляр SQL Azure
Составляйте полнотекстовые запросы с помощью предикатов CONTAINS и FREETEXT, а также табличных функций CONTAINSTABLE и FREETEXTTABLE в инструкции SELECT. В этой статье приведены примеры предикатов и функций, из которых вы сможете выбрать самые подходящие.
- Чтобы сопоставить слова и фразы, используйте
CONTAINSиCONTAINSTABLE. - Чтобы передать смысл, но не точную формулировку, используйте
FREETEXTиFREETEXTTABLE.
Примеры каждого предиката и функции
Примеры кода в этой статье используют базу данных образца AdventureWorks2025 или AdventureWorksDW2025, которую можно скачать с домашней страницы образцов и проектов сообщества Microsoft SQL Server и.
Чтобы запустить примеры запросов, нужно также настроить полнотекстовый поиск. Дополнительные сведения см. в разделе «Начало работы с полнотекстовым поиском».
Пример: СОДЕРЖИТ
В следующем примере выполняется поиск всех продуктов с ценой $80.99, которые содержат слово Mountain:
USE AdventureWorks2025;
GO
SELECT Name,
ListPrice
FROM Production.Product
WHERE ListPrice = 80.99
AND CONTAINS ((Name), 'Mountain');
GO
Пример: FREETEXT
В следующем примере выполняется поиск всех документов, содержащих слова, связанные с vital safety components:
USE AdventureWorks2025;
GO
SELECT Title
FROM Production.Document
WHERE FREETEXT ((Document), 'vital safety components');
GO
Пример: CONTAINSTABLE
Следующий пример возвращает идентификатор описания и описание всех продуктов, для которых столбец Description содержит слово aluminum рядом либо со словом light, либо со словом lightweight. Возвращаются только строки с рангом выше 2.
USE AdventureWorks2025;
GO
SELECT FT_TBL.ProductDescriptionID,
FT_TBL.Description,
KEY_TBL.RANK
FROM Production.ProductDescription AS FT_TBL
INNER JOIN CONTAINSTABLE (Production.ProductDescription, Description, '(light NEAR aluminum) OR
(lightweight NEAR aluminum)') AS KEY_TBL
ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 2
ORDER BY KEY_TBL.RANK DESC;
GO
Пример: FREETEXTTABLE
Следующий пример расширяет запрос FREETEXTTABLE, чтобы сначала возвращать строки с наивысшим рангом и добавлять ранг каждой строки в список SELECT. Чтобы написать похожий запрос, нужно знать, что ProductDescriptionID — это столбец с уникальным ключом для таблицы ProductDescription.
USE AdventureWorks2025;
GO
SELECT KEY_TBL.RANK,
FT_TBL.Description
FROM Production.ProductDescription AS FT_TBL
INNER JOIN FREETEXTTABLE (Production.ProductDescription, Description, 'perfect all-around bike') AS KEY_TBL
ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC;
GO
Ниже приведено расширение того же запроса, которое возвращает только строки с рангом 10 или выше.
USE AdventureWorks2025;
GO
SELECT KEY_TBL.RANK,
FT_TBL.Description
FROM Production.ProductDescription AS FT_TBL
INNER JOIN FREETEXTTABLE (Production.ProductDescription, Description, 'perfect all-around bike') AS KEY_TBL
ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK >= 10
ORDER BY KEY_TBL.RANK DESC;
GO
Сопоставление слов или смысла
CONTAINS и CONTAINSTABLE, или FREETEXT и FREETEXTTABLE, полезны для различных видов сопоставления. Следующая информация поможет вам выбрать наилучший предикат или функцию для вашего запроса:
CONTAINS и CONTAINSTABLE
- Сопоставление отдельных слов и фраз с точными или приближенными (менее точными) соответствиями.
- Вы также можете выполнить следующие действия:
- Определите близость слов друг к другу в пределах определенного расстояния.
- Возвращать взвешенные совпадения.
- объединять условия поиска с логическими операторами. Для получения дополнительной информации см. раздел Использование булевых операторов (AND, OR и NOT) позже в этой статье.
FREETEXT и FREETEXTTABLE
- Поиск совпадений по смыслу, а не по буквальному совпадению задаваемых слов, фраз или предложений (текст в свободной форме).
- Совпадения генерируются, если любой термин или его форма найдены в полнотекстовом индексе указанного столбца.
Сравнение предикатов и функций
Предикаты CONTAINS или FREETEXT, а также табличные функции CONTAINSTABLE или FREETEXTTABLE имеют разный синтаксис и параметры. Следующая информация поможет вам выбрать наилучший предикат или функцию для вашего запроса:
Предикаты CONTAINS и FREETEXT
Использование. Используйте предикаты полнотекстового поиска CONTAINS и FREETEXT в предложении WHERE или HAVING оператора SELECT.
Результаты . Предикаты CONTAINS и FREETEXT возвращают значение TRUE или FALSE, которое указывает, соответствует ли данная строка полнотекстовому запросу. Строки, которые совпадают, возвращаются в результирующий набор.
Дополнительные параметры. Вы можете объединить предикаты с любым из других Transact-SQL предикатов, например LIKE и BETWEEN.
Вы можете указать, следует ли искать один столбец, список столбцов или все столбцы в таблице.
При желании вы можете указать язык, ресурсы которого используются полнотекстовым запросом для разбиения на слова и выделения корней, поиска в тезаурусе и устранения шумовых слов.
Вы можете использовать четырёхчастное имя в CONTAINS предикате или FREETEXT предикате для запроса полного индекса столбцов целевых таблиц на связанном сервере. Чтобы подготовить удаленный сервер к приему полнотекстовых запросов, сначала необходимо создать полнотекстовые индексы для целевых таблиц и столбцов на удаленном сервере, а затем добавить удаленный сервер в качестве связанного сервера.
Для получения дополнительной информации о синтаксисе и аргументах этих предикатов см. CONTAINS и FREETEXT.
Функции строкового набора значений CONTAINSTABLE и FREETEXTTABLE
Использование. Используйте полнотекстовые функции CONTAINSTABLE и FREETEXTTABLE как обычное имя таблицы в предложении FROM инструкции SELECT.
Вам нужно указать базовую таблицу для поиска при использовании любой из этих функций. Как и для предикатов, в таблице, где выполняется поиск, можно задавать один столбец, список столбцов или все столбцы, а также при необходимости язык, ресурсы которого будут использоваться данным полнотекстовым запросом.
Обычно нужно соединить результаты CONTAINSTABLE или FREETEXTTABLE с базовой таблицей. Для объединения таблиц необходимо знать название уникального ключевого столбца. Этот столбец, который присутствует во всех полнотекстовых включённых таблицах, используется для обеспечения уникальных строк для таблицы ( столбца с уникальным ключом). Для получения дополнительной информации о столбце ключей см . Создание и управление полнотекстовыми индексами.
Результаты . Эти функции возвращают пустую таблицу, либо таблицу с одной или несколькими строками, соответствующими полнотекстовому запросу. Возвращаемая таблица содержит только строки базовой таблицы, которые соответствуют критерию выбора, задаваемому в условии полнотекстового поиска функции.
Запросы, использующие одну из этих функций, также возвращают значение ранга релевантности (RANK) и полнотекстовый ключ (KEY) для каждой возвращаемой строки, следующим образом:
KEYстолбец. СтолбецKEYвозвращает уникальные значения возвращаемых строк. СтолбецKEYможно использовать для указания критериев отбора.RANKстолбец. Столбец возвращаетRANKдля каждой строки, показывающее, насколько строка соответствует критериям выбора. Чем выше ранжирующее значение текста или документа в строке, тем больше она релевантна данному полнотекстовому запросу. Разные строки могут ранжироваться одинаково. Можно ограничить число возвращаемых совпадений. Для этого нужно задать необязательный параметр top_n_by_rank . Для получения дополнительной информации см . раздел «Ограничить результаты поиска по рангу».
Для получения дополнительной информации о синтаксисе и аргументах этих функций см. CONTAINSTABLE и FREETEXTTABLE.
Конкретные типы поиска
Ищите определённое слово или фразу (простой термин)
Вы можете использовать CONTAINS, CONTAINSTABLE, FREETEXTили FREETEXTTABLE для поиска в таблице определённого слова или фразы. Например, если вы хотите поискать в ProductReview таблице AdventureWorks2025 базы данных все комментарии о продукте с этой фразой learning curve, вы можете использовать CONTAINS предикат следующим образом:
USE AdventureWorks2025;
GO
SELECT Comments
FROM Production.ProductReview
WHERE CONTAINS ((Comments), '"learning curve"');
GO
Условие поиска, в данном случае learning curve, может быть сложным и состоять из одного или нескольких терминов.
Больше информации о простом поиске по словам
В полнотекстовом поиске слово (или токен) представляет собой строку, границы которой определяются соответствующими разделителями слов согласно лингвистическим правилам указанного языка. Допустимая фраза состоит из нескольких слов со знаками препинания между ними или без них.
Например, croissant — слово, а café au lait — фраза. Такие слова и выражения называются простыми терминами.
CONTAINS и CONTAINSTABLE ищут точное совпадение с фразой.
FREETEXT и FREETEXTTABLE разбивают фразу на отдельные слова.
Поиск слова с префиксом (префиксным термином)
Вы можете использовать CONTAINS или CONTAINSTABLE искать слова или фразы с заданным префиксом. Будут возвращены все записи в столбце, содержащие текст, который начинается с заданного префикса. Например, чтобы искать все строки, содержащие префикс top-, как в topple, topping, и top, запрос выглядит следующим примером:
USE AdventureWorks2025;
GO
SELECT Description,
ProductDescriptionID
FROM Production.ProductDescription
WHERE CONTAINS ((Description), '"top*"');
GO
При выполнении этого запроса будут возвращены все фрагменты текста, соответствующие тексту, указанному перед звездочкой (*). Если текст и звёздочка не заключены в двойные кавычки, как в CONTAINS (DESCRIPTION, 'top*'), полнотекстовый поиск не рассматривает звёздочку как подстановочный знак.
Если префиксный термин является фразой, каждый токен, составляющий фразу, считается отдельным префиксным термином. Все строки, в которых слова, начинающиеся с префиксных терминов, возвращаются. Например, префиксный термин light bread* находит строки с текстом light breaded, lightly breaded, или light bread, но не возвращает lightly toasted bread.
Дополнительная информация о поиске по префиксам
Префиксный термин — это строка, прикреплённая к началу слова для образования производного слова или изменённой формы.
Для одного префиксного термина любое слово, начинающееся с указанного терма, входит в набор результатов. Например, термин
auto*соответствуетautomatic,automobileи так далее.Внутри фразы каждое слово считается префиксным термином. Например, термин
auto tran*совпадает сautomatic transmissionиautomobile transducer, но не совпадает сautomatic motor transmission.
Поиск по префиксу поддерживается в CONTAINS и CONTAINSTABLE.
Поиск флективных форм конкретного слова (термина генерации)
Вы можете использовать CONTAINS, CONTAINSTABLE, FREETEXT, или FREETEXTTABLE для поиска всех разных времен и спряжений глагола, либо форм единственного и множественного числа существительного (флективный поиск), либо для синонимических форм конкретного слова (поиск в тезаурусе).
Следующий пример ищет любую форму foot (foot, feet, и так далее) в Comments столбце ProductReview таблицы базы AdventureWorks2025 данных:
USE AdventureWorks2025;
GO
SELECT Comments,
ReviewerName
FROM Production.ProductReview
WHERE CONTAINS ((Comments), 'FORMSOF(INFLECTIONAL, "foot")');
GO
В полнотекстовом поиске используются стеммеры, которые позволяют искать глагол в различных временах и формах, а также существительное в единственном и множественном числе. Дополнительные сведения о стеммерах см. в разделе «Настройка средств разбиения слов и стеммеров и управление ими».
Подробнее о поиске по поколению
Словоформы — это формы глаголов в различных временах и лицах или формы существительных в единственном или множественном числе.
Например, поискайте флекционную форму слова drive. Если в различных строках таблицы содержатся слова drive, drives, drove, driving и driven, все они будут входить в набор результатов, поскольку каждое из них может быть сгенерировано путём словоизменения из слова drive.
FREETEXT и FREETEXTTABLE по умолчанию ищут флективные термины всех указанных слов.
CONTAINS и CONTAINSTABLE поддерживают необязательный аргумент INFLECTIONAL.
Поиск синонимов конкретного слова
В тезаурусе определяются пользовательские синонимы терминов. Для получения дополнительной информации о файлах тезауруса смотрите раздел Configure and Manage Thesaurus Files for Full-Text Search.
Например, если к тезаурусу добавляется запись {car, automobile, truck, van}, вы можете искать форму тезауруса слова car. Все строки в таблице, запрашиваемые, содержащие слова automobile, truck, van, или car появляются в наборе результатов, потому что каждое из этих слов принадлежит множеству расширения синонимов, содержащего слово car.
FREETEXT и FREETEXTTABLE по умолчанию используют тезаурус.
CONTAINS и CONTAINSTABLE поддерживают необязательный аргумент THESAURUS.
Ищите слово рядом с другим словом
Термин близости обозначает слова или фразы, которые расположены близко друг к другу. Также можно указать максимальное количество слов, которые не включаются в поиск и разделяют первое и последнее из искомых слов. Кроме того, можно искать два слова или две фразы в любом порядке или в порядке, в котором они указаны.
Например, нужно найти строки, в которых слово ice находится рядом со словом hockey или в которых фраза ice skating находится рядом с фразой ice hockey.
Дополнительные сведения о поиске слов по близости см. в разделе «Поиск слов рядом с другим словом с помощью NEAR».
Ищите слова или фразы с использованием взвешенных значений (взвешенных терминов)
Вы можете использовать CONTAINSTABLE для поиска слов или фраз и указания значения веса. Вес, измеряемый числом от 0,0 до 1,0, обозначает степень важности каждого слова и фразы в наборе слов или фраз. Значение веса 0,0 является самым низким, значение 1,0 — самым высоким.
Следующий пример показывает запрос, который ищет все адреса клиентов с использованием весов, в котором любой текст, начинающийся со строки Bay , имеет либо Street , либо View. Результаты дают более высокий ранг тем строкам, которые содержат больше указанных слов.
USE AdventureWorks2025;
GO
SELECT AddressLine1,
KEY_TBL.RANK
FROM Person.Address AS Address
INNER JOIN CONTAINSTABLE (Person.Address, AddressLine1, 'ISABOUT ("Bay*",
Street WEIGHT(0.9),
View WEIGHT(0.1)
) ') AS KEY_TBL
ON Address.AddressID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC;
GO
Взвешенное выражение можно использовать в сочетании с любым простым выражением, префиксным выражением, генерационным выражением или выражением близости.
Подробнее о поиске по взвешенным терминам
При поиске с учетом веса взвешенное значение указывает степень важности каждого слова и каждой фразы в группе слов и фраз. Значение веса 0,0 является самым низким, значение 1,0 — самым высоким.
Например, в запросе для поиска нескольких выражений можно задать вес для каждого искомого слова, обозначающий его значимость по сравнению с другими словами в условии поиска. Результат выполнения такого типа запроса будет в начале содержать наиболее релевантные строки, исходя из соответствующего веса, присвоенного искомым словам. Наборы результатов содержат документы или строки, содержащие любой из указанных терминов (или содержимое между ними); однако некоторые результаты считаются более релевантными из-за вариаций взвешенных значений, связанных с разными поисковыми терминами.
Взвешенные поиски по терминам поддерживаются CONTAINSTABLE.
Использование ОПЕРАТОРОВ AND, OR и NOT (логические операторы)
CONTAINS Предикат и CONTAINSTABLE функция используют одни и те же условия поиска. Оба поддерживают объединение нескольких поисковых запросов с помощью булевых операторов (AND, ORи NOT) для выполнения логических операций. Например, можно использовать AND, чтобы найти строки, которые содержат и latte, и New York-style bagel. Например AND NOT, можно использовать , чтобы найти строки, которые содержат bagel , но не содержат cream cheese.
В отличие от этого, FREETEXT и FREETEXTTABLE воспринимают булевы термины как слова, которые нужно искать.
Для информации о комбинировании CONTAINS с другими предикатами, использующими логические операторы AND, OR, и NOT, см. Условие поиска.
Пример
В следующем примере предикат CONTAINS используется для поиска описаний, в которых идентификатор описания не равен 5, а описание содержит как слово Aluminum, так и слово spindle. Условие поиска использует AND булевый оператор. В этом примере используется таблица ProductDescription базы данных AdventureWorks2025.
USE AdventureWorks2025;
GO
SELECT Description
FROM Production.ProductDescription
WHERE ProductDescriptionID <> 5
AND CONTAINS ((Description), 'aluminum AND spindle');
GO
Регистр, стоп-слова, язык и тезаурус
При написании полнотекстовых запросов можно также указать следующие параметры.
Чувствительность к регистру. В запросах полнотекстового поиска не учитывается регистр букв. Однако в японском языке существует несколько фонетических орфографий, в которых концепция орфографической нормализации аналогична нечувствительности к регистру (например, кана = нечувствительность). Такой тип орфографической нормализации не поддерживается.
Стоп-слова. Когда вы определяете полнотекстовый запрос, движок Full-Text отбрасывает стопворды (также называемые шумовыми словами) из критериев поиска. Стопворды — это слова, такие как
a,and,is, илиthe, которые могут встречаться часто, но обычно не способствуют поиску конкретного текста. Стоп-слова перечислены в стоплисте. Каждый полнотекстовый индекс связан с конкретным списком стоп-слов, который определяет, какие стоп-слова не указываются в запросе или в индексе во время индексирования. Для получения дополнительной информации смотрите раздел «Настроить и управлять стоп-вордами и стоп-листами» для Full-Text Search.Язык с параметром
LANGUAGE. Многие выражения запроса в значительной степени зависят от поведения разделителя слов. Чтобы убедиться, что используются правильные средство разбиения слов (и стеммер) и тезаурусный файл, следует указать параметрLANGUAGE. Для получения дополнительной информации см. раздел «Выберите язык при создании полнотекстового индекса».Тезаурус.
FREETEXTаFREETEXTTABLEзапросы по умолчанию используют тезаурус.CONTAINSиCONTAINSTABLEподдерживают необязательный аргументTHESAURUS. Дополнительные сведения см. в разделе Настройка файлов тезауруса для полнотекстового поиска и управление ими.
Проверка результатов маркеризации
После того как вы примените заданную комбинацию разрывателя слова, тезауруса и стоп-листа в запросе, вы можете увидеть, как Full-Text Search токенизирует результаты с помощью sys.dm_fts_parser динамического режима управления. Для получения дополнительной информации см. sys.dm_fts_parser.