[МУЗЫКА] [МУЗЫКА] Здравствуйте. Продолжим наш разговор про индексы. В прошлый раз мы научились с вами строить индексы на основе B-дерева, и такую основу имеют кластерные и некластерные индексы, которые могут быть построены для нашей таблицы. Мы говорили о том, что такие индексы лучше строятся для коротких полей. А что же делать, если нам захочется искать что-то в достаточно длинных текстовых полях таблицы? Любая СУБД позволяет нам сделать одно или несколько полей таблицы длинными текстовыми. Типы полей, которые могут применяться для хранения текстовых данных, вы видите на экране. Если нам нужно длинное текстовое поле произвольной длины, то мы должны использовать тип поля, который называется TEXT. В других СУБД мы можем для этого использовать поля CHAR и VARCHAR, у которых длина может достигать достаточно больших значений. Где нам могли бы понадобиться такие поля? Давайте представим, что в нашей таблице COURSE было бы не два поля, как у нас предполагалось ранее, это были поля идентификатор курса и его название, а мы могли бы добавить какое-то текстовое поле, которое бы содержало описание курса. Давайте посмотрим, как бы выглядела тогда команда. Вот мы создаем дополнительное поле, которое называется CourseDescription. Имеет оно поле TEXT, и добавляем для примера две строки в нашу таблицу. К предмету «Алгебра» мы добавляем слова «матрица, нормальная форма, ранг, определитель, линейное уравнение», к предмету «Базы данных» мы добавим уже известные вам слова из нашего курса: «реляционное исчисление, нормальная форма, индекс, представление». Какие запросы мы хотели бы выполнять? Мы хотели бы искать какую-то информацию, содержащуюся внутри этих длинных текстовых полей, искать какие-то определенные слова. Пока мы можем выполнять такие запросы при помощи шаблона LIKE, когда мы напишем слово, которое мы хотим найти в длинном текстовом описании, и перед ним и после него поставим знак %, которые будут означать произвольную последовательность символов. Выполнение такого запроса будет производиться при полном сканировании таблицы, то есть должна будет быть считана каждая запись, в ней рассмотрено отдельно каждое длинное поле, и оттуда извлекаться те строки, которые соответствуют введенному шаблону. Если мы хотим искать быстрее, то тогда мы можем построить дополнительную структуру, которая называется полнотекстовый индекс. Отличие полнотекстового индекса от других индексных столбцов таблицы заключается в том, что он бывает только один для таблицы и может включать в себя несколько столбцов. Давайте посмотрим, как строится структура полнотекстового индекса. В общем случае документ может представлять собой список слов с некоторыми разделителями между ними. Вот например, первый документ, который касается описания алгебры, содержит слова «матрица, нормальная форма, ранг, определитель, линейное уравнение». И пример также для базы данных вы видите сейчас на экране. То есть документ — это набор слов с разделителями. Что если мы построим обратный список? То есть назовем его инвертированным. Это будет список слов, к каждому слову мы построим список документов, в которых эти слова находятся. Вот в нашем случае инвертированный список будет выглядеть так, как вы сейчас видите на экране. Как проходит процесс полнотекстового индексирования? Это достаточно сложный процесс. Он потребует вначале фильтрации. То есть те элементы текстовых полей, которые не будут распознаны, как слова, должны быть удалены. После этого необходимо разбить наш документ на отдельные слова, после этого происходит процесс удаления стоп-слов. Что такое стоп-слова? Это такие слова, которые встречаются во всех практически документах и не могут быть полезны при поиске. После этого конвертированные данные превращаются в инвертированный список слов, и после этого у нас заполняется инвертированный индекс, мы добавляем к каждому слову список документов, которые это слово содержат. Как происходит процесс загрузки данных в таблицу? Если мы загружаем большое количество данных в таблицу, в которой уже построен полнотекстовый индекс, то это может быть достаточно сложный и долговременный процесс. Поэтому возможен другой порядок действий: мы можем сначала загрузить данные в таблицу, а потом построить для этой таблицы полнотекстовый индекс. Какой командой можно создать полнотекстовый индекс? Мы можем определить его вместе с созданием таблицы, когда мы пишем, выполняем команду CREATE TABLE, и построить там же индекс сразу. Можем построить полнотекстовый индекс, изменяя нашу таблицу командой ALTER TABLE. И можем отдельной командой создать полнотекстовый индекс, командой CREATE FULLTEXT INDEX. Такой индекс называется fulltext. Посмотрите, пожалуйста, на пример создания таблицы, в которой будет полнотекстовый индекс. В данном случае мы строим полнотекстовый индекс для таблицы STUDENT, этот индекс будет построен по полю «имя студента», чтобы мы могли искать не только по фамилиям, но и по именам, которые встречаются в этом длинном поле. Вот мы выполнили эту команду, индекс создался. После этого мы можем осуществлять поиск при помощи полнотекстового индекса. Для этого у нас существует функция MATCH, которая выполняет поиск в естественном языке, сравнивая заданную строку с содержимым текста. Строка поиска создается, как аргумент выражения AGAINST. На этом слайде мы видим поиск при помощи построенного полнотекстового индекса. Мы ищем имя студента, в котором встречается слово «Федор». И результат выполнения этого запроса мы видим на экране. Что возвращает команда MATCH? Кроме того, что она находит нам строки, в которых встречается искомое выражение, она еще и возвращает нам величину релевантности. Что это такое? Она оценивает степень сходства между искомой строкой и текстом, который содержится в строке таблицы. Как вычисляется релевантность? Она вычисляется на основе слов в данной строке поиска, на основе количества уникальных слов в строке, на основе анализа общего количества слов в тексте и числа документов, которые содержатся в нашей таблице. Релевантность оценивается неотрицательным числом с плавающей точкой и может быть от 0 до 1. Чем ближе к 1, тем релевантнее. Давайте посмотрим на результат поиска с выводом релевантности. Вот мы ищем в строке имя студента, поисковый образ у нас задается словом «Александр», и мы видим, что релевантность оценивается для каждой строки нашей таблицы. На этом мы закончили рассмотрение полнотекстовых индексов. [БЕЗ_ЗВУКА]