CONTAINSTABLE: примеры (SQL)
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 для поиска по смыслу.
В более поздних версиях улучшена производительность и расширены языковые средства для полнотекстового поиска, включая улучшенную обработку слов.
Расширенные примеры
Поиск с весовыми коэффициентами:
SELECT *
FROM CONTAINSTABLE(Products, ProductDescription, 'ISABOUT (bike weight(0.8), seat weight(0.2))');KEY RANK 2 945 4 621
Комбинирование условий с AND:
SELECT *
FROM CONTAINSTABLE(Products, ProductDescription, 'bike AND durable');KEY RANK 6 782 9 455
Использование переменных в запросе:
DECLARE @SearchTerm NVARCHAR(100);
SET @SearchTerm = 'mountain';
SELECT *
FROM CONTAINSTABLE(Products, ProductDescription, @SearchTerm);