CONTAINSTABLE: примеры (SQL)

Полнотекстовый поиск с помощью CONTAINSTABLE в SQL Server
Раздел: Весовые функции полнотекстового поиска, Полнотекстовый поиск
CONTAINSTABLE(table, column [, 'search_condition']): table

Функция CONTAINSTABLE в MS SQL

Функция CONTAINSTABLE применяется для полнотекстового поиска по таблицам, которая возвращает таблицу с релевантностью строк для заданного запроса. Эта функция работает только с таблицами, имеющими полнотекстовый индекс.

Основное использование связано с выполнением сложных запросов, включающих поиск слов, фраз, префиксов, близости терминов или взвешенных значений. Функция возвращает таблицу с двумя столбцами: KEY и RANK. Столбец KEY содержит уникальные значения ключа полнотекстового индекса, а RANK - числовое значение релевантности (от 0 до 1000).

Аргументы функции:

  • table: Имя таблицы с полнотекстовым индексом.
  • column: Имя столбца или список столбцов, по которым выполняется поиск.
  • search_condition: Условие поиска в синтаксисе полнотекстового запроса.
  • top_n: Необязательное целое число, указывающее количество строк с наивысшим рейтингом для возврата.

Примеры применения CONTAINSTABLE

Поиск точного слова:

SELECT * 
FROM CONTAINSTABLE(Products, ProductDescription, 'bike');
KEY      RANK
1        245
3        128

Поиск с префиксом:

SELECT * 
FROM CONTAINSTABLE(Products, ProductDescription, 'auto*');
KEY      RANK
5        312
7        95

Поиск фразы с NEAR:

SELECT * 
FROM CONTAINSTABLE(Articles, Content, 'NEAR((database, security), 5)');
KEY      RANK
12       856
15       423

Альтернативные функции в MS SQL

FREETEXTTABLE выполняет поиск по смыслу, а не по точным совпадениям. Она полезна для нечеткого поиска и работы с синонимами.

CONTAINS является предикатом, который возвращает логическое значение. Ее используют в условиях WHERE для фильтрации строк.

Выбор между функциями зависит от задачи. CONTAINSTABLE применяют для получения ранжированного списка, а CONTAINS для простой фильтрации. FREETEXTTABLE подходит для поиска по смыслу.

Аналоги в других СУБД

PostgreSQL использует функции to_tsquery и ts_rank для полнотекстового поиска.

SELECT title, ts_rank_cd(textsearch, query) 
FROM documents, to_tsquery('bike') query 
WHERE textsearch @@ query 
ORDER BY rank DESC;

MySQL применяет MATCH ... AGAINST в естественно-языковом режиме.

SELECT *, MATCH(content) AGAINST('bike' IN NATURAL LANGUAGE MODE) AS score 
FROM articles 
ORDER BY score DESC;

Oracle использует CONTAINS в составе пакета CTX_QUERY.

SELECT SCORE(1), text 
FROM docs 
WHERE CONTAINS(text, 'bike', 1) > 0;

Типичные ошибки

Отсутствие полнотекстового индекса приводит к ошибке.

SELECT * FROM CONTAINSTABLE(Products, ProductName, 'wheel');
Сообщение 7601, уровень 16, состояние 3: Не удается найти полнотекстовый индекс для таблицы 'Products'.

Использование несуществующего столбца.

SELECT * FROM CONTAINSTABLE(Products, InvalidColumn, 'test');
Сообщение 207, уровень 16, состояние 1: Недопустимое имя столбца 'InvalidColumn'.

Изменения в новых версиях

В SQL Server 2012 появилась поддержка семантического поиска, который позволяет использовать функции SEMANTICKEYPHRASETABLE и SEMANTICSIMILARITYTABLE для поиска по смыслу.

В более поздних версиях улучшена производительность и расширены языковые средства для полнотекстового поиска, включая улучшенную обработку слов.

Расширенные примеры

Поиск с весовыми коэффициентами:

Пример sql
SELECT * 
FROM CONTAINSTABLE(Products, ProductDescription, 'ISABOUT (bike weight(0.8), seat weight(0.2))');
KEY      RANK
2        945
4        621

Комбинирование условий с AND:

Пример sql
SELECT * 
FROM CONTAINSTABLE(Products, ProductDescription, 'bike AND durable');
KEY      RANK
6        782
9        455

Использование переменных в запросе:

Пример sql
DECLARE @SearchTerm NVARCHAR(100);
SET @SearchTerm = 'mountain';
SELECT * 
FROM CONTAINSTABLE(Products, ProductDescription, @SearchTerm);

MS SQL CONTAINSTABLE function comments

En
CONTAINSTABLE Returns a table of zero or more rows for columns containing precise or fuzzy matches