Чтобы понять концепцию полнотекстового поиска, вы должны вспомнить информацию о поиске по шаблону с помощью ключевого слова LIKE. Итак, давайте предположим, что таблица 'person' в базе данных 'test' со следующими записями в ней.
>> ВЫБРАТЬ * ОТ человека;
Предположим, вы хотите получить записи этой таблицы, где имя столбца имеет символ i в любом из его значений. Попробуйте выполнить приведенный ниже запрос SELECT при использовании предложения LIKE в командной оболочке. Из вывода ниже видно, что у нас есть только 5 записей для этого конкретного символа «i» в столбце «имя».
>> ВЫБРАТЬ * ОТ человека, ГДЕ имя LIKE '% i%';
Использование ТВсектора:
Иногда бесполезно использовать ключевое слово LIKE для быстрого поиска по шаблону, хотя слово есть. Возможно, вы подумаете об использовании стандартных выражений, и хотя это возможная альтернатива, регулярные выражения одновременно сильны и медлительны. Наличие процедурного вектора для целых слов в тексте, просторечного описания этих слов - гораздо более эффективный способ решения этой проблемы. Концепция полного текстового поиска и тип данных tsvector были созданы для ответа на него. В PostgreSQL есть два метода, которые делают то, что мы хотим:
- To_tvsector: Используется для составления списка токенов (ts означает «текстовый поиск»).
- To_tsquery: Используется для поиска в векторе встречаемости определенных терминов или фраз.
Пример 01:
Начнем с простой иллюстрации создания вектора. Предположим, вы хотите создать вектор для нити: «У некоторых людей вьющиеся каштановые волосы благодаря правильной расчесывании.”. Таким образом, вы должны написать функцию to_tvsector () вместе с этим предложением в скобках запроса SELECT, как показано ниже. Из выходных данных ниже вы можете видеть, что он даст вектор ссылок (позиции файлов) для каждого токена, а также где термины с небольшим контекстом, такие как статьи (the) и союзы (и, или), намеренно игнорируются.
>> SELECT to_tsvector ('У некоторых людей вьющиеся каштановые волосы благодаря правильной расчесыванию');
Пример 02:
Предположим, у вас есть два документа с некоторыми данными в каждом из них. Для хранения этих данных мы будем использовать реальный пример генерации токенов. Предположим, вы создали таблицу «Данные» в своей базе данных «test» с некоторыми столбцами в ней, используя приведенный ниже запрос CREATE TABLE. Не забудьте создать в нем столбец типа TVSECTOR с именем 'token'. Из вывода ниже вы можете взглянуть на созданную таблицу.
>> СОЗДАТЬ ТАБЛИЧНЫЕ данные (Id SERIAL PRIMARY KEY, info TEXT, token TSVECTOR);
Теперь нам нужно добавить общие данные обоих документов в эту таблицу. Поэтому попробуйте следующую команду INSERT в оболочке командной строки, чтобы сделать это. Наконец, записи из обоих документов были успешно добавлены в таблицу «Данные».
>> INSERT INTO Data (info) VALUES ('Две ошибки никогда не сделают одну правильную.'), (' Он тот, кто может играть в футбол.'), (' Могу я сыграть роль в этом?'), («Невозможно понять боль внутри человека»), («Принеси персик в свою жизнь»;
Теперь вам нужно заполнить столбец токенов обоих документов их конкретным вектором. В конечном итоге простой запрос UPDATE заполнит столбец токенов их соответствующим вектором для каждого файла. Итак, для этого вам необходимо выполнить указанный ниже запрос в командной оболочке. Вывод показывает, что обновление наконец выполнено.
>> Данные ОБНОВЛЕНИЯ f1 SET token = to_tsvector (f1.info) FROM Data f2;
Теперь, когда у нас есть все на месте, давайте вернемся к нашей иллюстрации «можно ли с помощью сканирования». To_tsquery с оператором AND, как было сказано ранее, не делает разницы между местоположениями файлов в файлах, как показано в выходных данных, указанных ниже.
>> SELECT Id, info FROM Data WHERE token @@ to_tsquery ('can & one');
Пример 04:
Чтобы найти слова, которые находятся «рядом» друг с другом, мы попробуем тот же запрос с '<->оператор. Изменение отображается в выводе ниже.
>> SELECT Id, info FROM Data WHERE token @@ to_tsquery ('может <-> один');
Вот пример, когда рядом с другим словом нет.
>> SELECT Id, info FROM Data WHERE token @@ to_tsquery ('one <-> боль');
Пример 05:
Мы найдем слова, которые не находятся рядом друг с другом, используя число в операторе расстояния, чтобы указать расстояние. Близость между "принести" и "жизнь" находится на 4 слова от отображаемого изображения.
>> SELECT * FROM Data WHERE token @@ to_tsquery ('привести <4> жизнь');
Чтобы проверить близость между словами для почти 5 слов, добавлено ниже.
>> SELECT * FROM Data WHERE token @@ to_tsquery ('неверно <5> верно');
Заключение:
Наконец, вы выполнили все простые и сложные примеры полнотекстового поиска с использованием операторов и функций To_tvsector и to_tsquery.