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

Использование SEMANTICSIMILARITYTABLE для поиска похожих документов
Раздел: Функции для работы с диаграммами сходства, Семантический поиск
SEMANTICSIMILARITYTABLE(table, column, source_key): table

Основные сведения о функции SEMANTICSIMILARITYTABLE

Функция SEMANTICSIMILARITYTABLE является частью семантического поиска в Microsoft SQL Server. Она возвращает таблицу с нуля или более строк для документов, семантически похожих на указанный документ. Эта функция применяется, когда требуется найти документы, имеющие схожий смысл, даже если они используют различную лексику.

Функция доступна только в базах данных, где создан и заполнен семантический индекс для указанных столбцов. Для работы необходим установленный компонент семантического поиска.

Синтаксис функции: SEMANTICSIMILARITYTABLE ( table, column, key ).

  • table: Имя таблицы, содержащей проиндексированные столбцы. Аргумент задается в формате 'имя_схемы.имя_таблицы' или просто 'имя_таблицы', если используется схема по умолчанию.
  • column: Имя индексированного столбца, содержащего текстовые данные, для которого выполняется поиск похожих документов.
  • key: Уникальный ключ документа (как правило, первичный ключ), для которого ищутся семантически похожие документы в указанной таблице и столбце.

Функция возвращает таблицу с тремя столбцами: KEY (ключ похожего документа), SCORE (оценка сходства в диапазоне от 0.0 до 1.0, где 1.0 означает полное семантическое сходство) и SOURCE (ключ исходного документа, переданный в аргументе key).

Простые примеры использования

Пример с указанием всех обязательных параметров. Предполагается, что для столбца DocumentContent в таблице dbo.Documents создан семантический индекс.

SELECT TOP(3) st.[KEY] AS SimilarDocID, st.SCORE, st.SOURCE AS OriginalDocID, d.DocumentTitle FROM SEMANTICSIMILARITYTABLE ( dbo.Documents, DocumentContent, 1053 ) AS st INNER JOIN dbo.Documents AS d ON st.[KEY] = d.DocumentID ORDER BY st.SCORE DESC;
SimilarDocID  SCORE                  OriginalDocID  DocumentTitle
1053          1.0                    1053           Исходный документ
1078          0.789243638515472      1053           Похожий отчет
1012          0.654329002857208      1053           Дополнительные материалы

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

SELECT st.[KEY], st.SCORE, d.DocumentDate FROM SEMANTICSIMILARITYTABLE ( Documents, DocumentContent, 42 ) AS st INNER JOIN Documents d ON st.[KEY] = d.DocumentID WHERE d.DocumentDate > '2023-01-01' AND st.SCORE > 0.5 ORDER BY st.SCORE DESC;

Похожие функции в MS SQL Server

В рамках компонента семантического поиска существуют другие функции.

  • SEMANTICSIMILARITYDETAILSTABLE: Возвращает таблицу с ключевыми фразами, общими для двух документов, с оценкой сходства для каждой фразы. Полезно для детального анализа, какие именно концепции делают документы похожими. Требует указания ключей двух сравниваемых документов.
  • SEMANTICKEYPHRASETABLE: Возвращает таблицу с ключевыми фразами, извлеченными из документов в индексированном столбце. Используется для получения основных тем документа, а не для поиска похожих документов.
  • CONTAINS и FREETEXT: Это предикаты полнотекстового, а не семантического поиска. Они ищут слова или синонимы, но не анализируют смысловое содержание. Предпочтительны для задач точного или нечеткого поиска по словам.

Функция SEMANTICSIMILARITYTABLE применяется именно для задач поиска документов со схожим смыслом. Она требует наличия семантического индекса, в отличие от полнотекстовых функций.

Типичные ошибки при работе

Ошибка, возникающая при отсутствии семантического индекса для указанного столбца.

SELECT * FROM SEMANTICSIMILARITYTABLE ( dbo.Products, ProductDescription, 10 );
Msg 4129, Level 16, State 1, Line 1
Произошла ошибка полнотекстового или семантического поиска 'Для полнотекстовой операции запрашивается необработанный семантический индекс для столбца 'ProductDescription'.'

Ошибка при указании несуществующего ключевого значения документа.

-- Документ с ID 9999 не существует
SELECT * FROM SEMANTICSIMILARITYTABLE ( dbo.Documents, Content, 9999 );
-- Запрос выполнится, но вернет пустой набор строк, а не ошибку.

Попытка использовать функцию в неподдерживаемой версии SQL Server.

-- Семантический поиск недоступен в Express Edition без дополнительных компонентов
SELECT * FROM SEMANTICSIMILARITYTABLE ( ... );
-- Функция будет недоступна для вызова, либо возникнет ошибка конфигурации.

Забывают, что функция возвращает таблицу, и пытаются использовать ее как скалярное значение.

DECLARE @score FLOAT = (SELECT SCORE FROM SEMANTICSIMILARITYTABLE(...));
Msg 512, Level 16, State 1, Line 1
Вложенный запрос возвращает больше одного значения.

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

Функция SEMANTICSIMILARITYTABLE была представлена в SQL Server 2012 как часть компонента семантического поиска. С тех пор в синтаксис и аргументы функции значительных изменений не вносилось.

В SQL Server 2017 и более новых версиях изменились системные представления, связанные с семантическим поиском, например, sys.fulltext_semantic_languages. Однако это не затрагивает синтаксис и поведение самой функции.

Основные изменения касаются производительности и стабильности работы семантического индексирования в целом. Рекомендуется использовать актуальные накопительные пакеты обновлений для SQL Server.

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

Использование функции для построения рекомендательной системы похожих документов внутри приложения.

Пример sql
-- Получение топ-5 похожих документов с фильтрацией по типу и минимальному порогу схожести
SELECT d2.DocumentID, d2.Title, st.SCORE FROM Documents d1 CROSS APPLY SEMANTICSIMILARITYTABLE ( Documents, Body, d1.DocumentID ) AS st INNER JOIN Documents d2 ON st.[KEY] = d2.DocumentID WHERE d1.DocumentID = @CurrentDocID AND d2.DocumentType = 'ARTICLE' AND st.SCORE > 0.2 AND d1.DocumentID <> d2.DocumentID ORDER BY st.SCORE DESC OFFSET 0 ROWS FETCH NEXT 5 ROWS ONLY;

Сравнение двух конкретных документов с помощью функции SEMANTICSIMILARITYTABLE. Хотя функция предназначена для поиска похожих на один документ, можно инвертировать логику.

Пример sql
-- Оценка сходства документа 105 с документом 208
SELECT SCORE FROM SEMANTICSIMILARITYTABLE ( dbo.Contracts, ContractText, 105 ) WHERE [KEY] = 208;
SCORE
0.756894

Пакетное обновление метаданных, например, добавление в таблицу DocumentSimilarities связей между документами, имеющими высокий коэффициент семантического сходства.

Пример sql
INSERT INTO DocumentSimilarities (SourceDocID, TargetDocID, SimilarityScore, CreatedDate) SELECT st.SOURCE, st.[KEY], st.SCORE, GETDATE() FROM Documents d CROSS APPLY SEMANTICSIMILARITYTABLE ( Documents, Abstract, d.DocumentID ) AS st WHERE st.SCORE > 0.7 AND st.SOURCE < st.[KEY]; -- Условие исключает дубликаты (A-B и B-A)

Комбинирование семантического и полнотекстового поиска для точного фильтрования результатов.

Пример sql
SELECT st.[KEY], st.SCORE, d.Title FROM SEMANTICSIMILARITYTABLE ( Documents, Content, 55 ) AS st INNER JOIN Documents d ON st.[KEY] = d.DocumentID INNER JOIN CONTAINSTABLE(Documents, Content, 'SQL') AS ft ON st.[KEY] = ft.[KEY] WHERE st.SCORE > 0.4 ORDER BY st.SCORE DESC;

Аналоги в других системах

Прямых аналогов функции семантического поиска SQL Server в других СУБД нет. Однако существуют различные подходы к семантическому анализу и поиску смысла.

PostgreSQL с расширениями: Расширение pg_trgm обеспечивает поиск по сходству на основе триграмм, оценивая лексическое, а не семантическое сходство. Может использоваться для поиска похожих строк.

-- Установка расширения
CREATE EXTENSION pg_trgm;

-- Поиск похожих строк по столбцу description
SELECT id, description, similarity(description, 'искомый текст') AS sim FROM products WHERE description % 'искомый текст' ORDER BY sim DESC;

Oracle Text: Компонент Oracle Database для интеллектуального текстового поиска. Функция CATSEARCH или оператор CONTEXT с определенными параметрами могут использоваться для тематических запросов, но требуют сложной настройки тезаурусов.

MySQL, SQLite, Sybase: Не имеют встроенных функций семантического поиска. Для реализации похожей функциональности требуется внешняя обработка текста, использование векторных представлений слов (Word2Vec, BERT) и интеграция на уровне приложения.

Основное отличие MS SQL SEMANTICSIMILARITYTABLE - это встроенная, готовая к использованию функция, не требующая от разработчика реализации сложных алгоритмов машинного обучения.

MS SQL SEMANTICSIMILARITYTABLE function comments

En
SEMANTICSIMILARITYTABLE Returns a table of zero or more rows for documents that are similar in meaning