Часто встречаю такую ситуацию, когда на Интернет-сайтах необходим собственный внутренний полнотекстовый поиск. Реализовать его не так уж и сложно, а эффект от его внедрения огромный.
Так на одном из своих проектов необходимо было реализовать быстрый поиск тематической информации из БД. На данный момент для решения подобных проблем используются теги и рубрики к записям. Но в моем случае это был не вариант. Постановка задачи следующая: на основе введенных двух-трех слов необходимо вывести записи, содержащие эти слова.
Структура в упрощенной форме БД приведена на рисунке.
![image](https://habrastorage.org/r/w1560/storage/habraeffect/11/bb/11bbd414d076f5731349df71929b20df.png)
В таблице «Слова» содержатся все слова, которые встречаются в имеющихся записях, в таблице «Записи» соответственно тексты записей, а таблица «Связи» включает в себя ссылки на использование записями соответствующих слов.
Вся работа этой упрощенной поисковой системы содержит в себе ряд этапов. Первым этапом является добавление новой записи. Так весь текст записи разбивается на массив слов. После чего выполняется несколько запросов к БД: проверяется, имеются ли уже эти слова в таблице «Слова», если не имеются, то добавляются все необходимые записи. Определяются идентификаторы каждого из слов. Последним шагом является добавление пар идентификаторов слова и записи в таблицу «Связи».
Редактирование по сути дела является аналогичной операции добавления записи за исключением того, что предварительно из таблицы «Связи» необходимо удалить все записи, относящиеся к редактируемому тексту. С удалением же, я думаю, вопросов не возникнет.
Теперь относительно самого поиска записей. Допустим, пользователь вводит какое-то слово в поле поиска. Само поле поиска является полем ввода с самозаполнением.
Шаг 1:
![image](https://habrastorage.org/r/w1560/storage/habraeffect/a5/9e/a59e7b3bff47d11f75bea73d47f2141e.png)
Шаг 2:
![image](https://habrastorage.org/r/w1560/storage/habraeffect/b2/bb/b2bb85f6ae5612d002c0ce6282229427.png)
Шаг 3:
![image](https://habrastorage.org/r/w1560/storage/habraeffect/b1/65/b165a1e91a8b45cced084f8a48050126.png)
То есть при вводе очередного слова проверяется, какие из имеющихся слов, в первом случае на букву «с», имеются в записях таблицы «Записи». На втором шаге проверяется, какие слова, начинающиеся на «ра», имеются в записях, где содержится слово «способ». На третьем шаге происходит поиск слов на «к» в записях, где уже есть слова «способ» и «разрешить». Я считаю, что трех слов для поиска вполне достаточно даже среди большого числа записей.
После сформированного набора слов приступаем к поиску. Здесь все просто. Определяются идентификаторы слов, которые введены в поле ввода, фильтруются записи в таблице «Связи», в которых имеются идентификаторы слов. Из получившегося массива определяются те идентификаторы записей из таблицы «Записи», для которых присутствуют все поисковые слова.
В конечном итоге у пользователя появляется возможность быстрого поиска необходимых записей по его запросу, притом система сама помогает ему сформулировать этот самый запрос. К тому же, если говорить о системе тегов, то необходимость в ней полностью отпадает. Но это скорее дело вкуса.
Так на одном из своих проектов необходимо было реализовать быстрый поиск тематической информации из БД. На данный момент для решения подобных проблем используются теги и рубрики к записям. Но в моем случае это был не вариант. Постановка задачи следующая: на основе введенных двух-трех слов необходимо вывести записи, содержащие эти слова.
Структура в упрощенной форме БД приведена на рисунке.
![image](https://habrastorage.org/storage/habraeffect/11/bb/11bbd414d076f5731349df71929b20df.png)
В таблице «Слова» содержатся все слова, которые встречаются в имеющихся записях, в таблице «Записи» соответственно тексты записей, а таблица «Связи» включает в себя ссылки на использование записями соответствующих слов.
Вся работа этой упрощенной поисковой системы содержит в себе ряд этапов. Первым этапом является добавление новой записи. Так весь текст записи разбивается на массив слов. После чего выполняется несколько запросов к БД: проверяется, имеются ли уже эти слова в таблице «Слова», если не имеются, то добавляются все необходимые записи. Определяются идентификаторы каждого из слов. Последним шагом является добавление пар идентификаторов слова и записи в таблицу «Связи».
Редактирование по сути дела является аналогичной операции добавления записи за исключением того, что предварительно из таблицы «Связи» необходимо удалить все записи, относящиеся к редактируемому тексту. С удалением же, я думаю, вопросов не возникнет.
Теперь относительно самого поиска записей. Допустим, пользователь вводит какое-то слово в поле поиска. Само поле поиска является полем ввода с самозаполнением.
Шаг 1:
![image](https://habrastorage.org/storage/habraeffect/a5/9e/a59e7b3bff47d11f75bea73d47f2141e.png)
Шаг 2:
![image](https://habrastorage.org/storage/habraeffect/b2/bb/b2bb85f6ae5612d002c0ce6282229427.png)
Шаг 3:
![image](https://habrastorage.org/storage/habraeffect/b1/65/b165a1e91a8b45cced084f8a48050126.png)
То есть при вводе очередного слова проверяется, какие из имеющихся слов, в первом случае на букву «с», имеются в записях таблицы «Записи». На втором шаге проверяется, какие слова, начинающиеся на «ра», имеются в записях, где содержится слово «способ». На третьем шаге происходит поиск слов на «к» в записях, где уже есть слова «способ» и «разрешить». Я считаю, что трех слов для поиска вполне достаточно даже среди большого числа записей.
После сформированного набора слов приступаем к поиску. Здесь все просто. Определяются идентификаторы слов, которые введены в поле ввода, фильтруются записи в таблице «Связи», в которых имеются идентификаторы слов. Из получившегося массива определяются те идентификаторы записей из таблицы «Записи», для которых присутствуют все поисковые слова.
Что мы в итоге получаем?
В конечном итоге у пользователя появляется возможность быстрого поиска необходимых записей по его запросу, притом система сама помогает ему сформулировать этот самый запрос. К тому же, если говорить о системе тегов, то необходимость в ней полностью отпадает. Но это скорее дело вкуса.