Виды поиска информации

Для того чтобы произвести поиск нам необходимо задать некоторое условие, при выполнении или невыполнении которого поиск будет считаться успешным или неуспешным соответственно. Несмотря на то, что любой поиск - поиск с условием, я бы выделил три характерных типа поиска: полнотекстовой (позиционный), поиск с запросом (выборка), инкрементный поиск (позиционный). В скобках приводится уточнение, чтобы Вам было понятно, о чем идет речь, поскольку всегда есть возможность программной эмуляции того или иного визуального эффекта при поиске.
Полнотекстовой поиск - самый простой вид поиска, при котором поиск информации производится во всем объеме данных - по всему объему текста или по всем полям базы данных. И это его главное преимущество. Нам не нужно знать, как и где хранится информация, мы просто ищем ее. Примером может послужить поиск строк в документе Word. Существенный недостаток данного поиска - уменьшение скорости поиска при увеличении объема данных. Это делает невозможным применение такого механизма для поиска информации в достаточно большой структуре данных. Представьте, например, текстовой документ Word c 10 тыс. страниц, где искомая строка находится, например, на последней странице. Поисковый механизм будет последовательно просматривать весь текст, страница за страницей, пока не найдет запрашиваемую строку. Это займет немало времени. А представьте, что таких страниц миллиарды! Вот почему полнотекстовой поиск в сети Интернет невозможен! Однако на сайте такой поиск можно более или менее успешно реализовать.
Поиск с запросом - под данным типом поиска мы будем понимать поиск информации в базе данных. Этот тип поиска наиболее универсальный, поскольку с помощью него можно производить поиск информации в огромных базах данных. Наглядный пример - поиск информации в поисковых системах или товара в интернет-магазине, например, по названию, коду, цене и др.
Инкрементный поиск. Честно говоря, я не знаю точного определения данного вида поиска, но идея его в том, что поиск осуществляется после каждого нажатия на клавишу, при котором происходит изменение строки поиска - при обычном поиске мы сначала вводим строку поиска, а затем нажимаем клавишу "Enter" или кнопку "Найти" для запуска механизма поиска. При инкрементном поиске кнопка "Найти" не нужна, поскольку поиск начинается сразу после нажатия на любую алфавитно-цифровую клавишу, Del или Backspace. Инкрементный поиск - быстрый поиск с постепенным уточнением.
Существуют два критерия нахождения информации - по точному или произвольному соответствию строке запроса. Реализация поиска на точное совпадение строке запроса означает, что будут найдены только те записи, в которых в точности присутствует данная строка запроса. Реализация поиска на произвольного совпадение приведет к поиску записей, в которых точно содержатся все фрагменты строки запроса.
Давайте в качестве примера возьмем следующие записи:
Аппарат Кипа
Прибор для демонстрации атмосферного давления
Прибор для изучения зависимости сопротивления проводника от температуры
Прибор для демонстрации видов деформации
Важно отметить, что посетитель может вводить как слово целиком, так и его фрагмент, например, "Магнитофон" - слово, а "Магнитоф" - фрагмент. Поэтому посетитель, в общем случае, составляет строку запроса не из слов, а из одного или нескольких фрагментов, хотя в большинстве случаев он все-таки вводит слова!
Также предположим, что поиск нечувствителен к регистру букв.

Поиск по запросу

Поиск на точное соответствие строке поиска
Посетитель может ввести как один фрагмент, так и несколько фрагментов. Если он введет фрагмент "Прибор", то в результатах запроса будут показаны записи:
Прибор для демонстрации атмосферного давления
Прибор для изучения зависимости сопротивления проводника от температуры
Прибор для демонстрации видов деформации
, поскольку фрагмент "Прибор" точно входит в эти названия. Если он произведет поиск строки "видов деформ", состоящей из двух фрагментов, то будет найдена одна запись:
Прибор для демонстрации видов деформации
Если же посетитель введет строку 'Прибор деформации", то не будет найдена ни одна запись, потому что такой последовательности фрагментов нет в названии ни одной записи.
Вывод. Для успешного поиска на точное совпадение необходимо, чтобы все фрагменты запроса:
  1. Присутствовали в записи
  2. Располагались в ней относительно друг друга так, как они заданы в строке поиска.
Я несколько усложнил формулировку, чтобы Вы смогли почувствовать трудности, с которыми сталкивается посетитель при поиске на точное совпадение. Он должен помнить не только фрагменты названия того, что он ищет, но и правильно их располагать в строке поиска! Могу сказать, что это очень непросто сделать даже тогда, когда посетитель имеет определенное представление о названии, а представьте, что он не имеет такого представления вообще! Я думаю, что в 95-99% случаях не информированный посетитель не найдет информацию, если он введет более 1 фрагмента для поиска. В этом и заключается парадокс поиска на точное совпадение - посетитель вводит дополнительные фрагменты в строку поиска в надежде получить более точный результ, но не находит ничего! Однако, задав один фрагмент для поиска, он может получить большое количество ненужной ему информации (в случае выборки). Конечно, желательно производить поиск по уникальному фрагменту в названии товара, но посетитель об этом даже думать не станет, а просто уйдет на другой сайт.
Когда я столкнулся с таким поиском на сайте конкурента, то сначала никак не мог понять, почему я не могу найти товар, хотя знаю до запятых его точное название? Оказалось все просто, вместо "набор" в названии товара использовалось слово "комплект" или "прибор" и т.п. Т.е. поиск не работал уже при вводе двух фрагментов! Если Вы хотите, чтобы поиск на Вашем сайте работал, НИКОГДА не используйте механизм поиска на точное совпадение!
Поиск на произвольное соответствие фрагментам строки поиска
Здесь необходимо выполнить одно единственное условие - все фрагменты строки запроса должны содержаться в искомых записях. Учтите - их последовательность не должна иметь значение, поскольку нужно дать возможность посетителю найти запись:
Прибор для демонстрации видов деформации,
указав строку запроса как "Прибор деформации" или "деформац прибор демонстрац" или "вид прибор деформац дем". Такой запрос я называю произвольный - не имеет значения, сколько фрагментов, и в какой последовательности они указаны в строке поиска. Заметьте, что с увеличение количества фрагментов происходит уточнение информации с одновременным уменьшением лишних данных в результатах поиска (в случае выборки)! А это именно то, что ожидает посетитель - он тратит время на ввод дополнительных фрагментов для уточнения запроса и получает уточненные результаты!

Инкрементный поиск

Инкрементный поиск - поиск информации после каждого изменения строки запроса, связанного с нажатием клавиш. При обычном поиске посетитель сначала вводит строку запроса в поле поиска, а затем нажимает клавишу "Enter" или производит щелчок на кнопке "Найти" для запуска поиска. В случае инкрементного поиска он производится после каждого ввода символа в строку поиска, т.е. посетитель ввел первый символ в строку поиска - произошел поиск, ввел второй символ - поиск и т.д. Инкрементный поиск – это поиск в реальном масштабе времени, поэтому его не так просто реализовать с помощью web-технологий, поскольку инкрементный поиск должен осуществляться без перезагрузки страниц! Это весьма удобный механизм, но у него также есть недостаток - позиционирование не позволяет произвести пользователю сравнение и выбор! Поэтому многие предпочитают Yandex.ru, а не Google.ru, в котором это и реализовано.
Инкрементный поиск - это поиск с постепенным уточнением - чем больше посетитель введет символов или фрагментов, которые характеризуют искомую информацию, тем "точнее" будет произведен поиск. Вас может смутить формулировка "точнее", ведь результат поиска - найдена информация или не найдена. В этом и состоит главная особенность инкрементного поиска - постепенное приближение к требуемой записи в случае их упорядоченного отображения.
Инкрементный поиск достаточно специфичен и может использоваться не везде. Это последовательный поиск, т.е. посетитель может производить поиск только одной записи - сначала осуществляется поиск одной записи, потом другой и т.д. Думаю, что и для поиска документов на сайте данный поиск в чистом виде не подойдет. Наиболее эффективен инкрементный поиск для нахождения записей в базе данных, например по коду или по названию товара. При этом последовательность действий будет следующей:
  1. Ввод символа
  2. Поиск
  3. Отображение результатов и т.д.
Значит, если посетителю необходимо ввести 10 символов для нахождения записи, то произойдет 9 промежуточных (лишних) операций поиск-отображение промежуточных результатов! Но при обычном поиске с запросом последовательность намного короче:
  1. Ввод строки поиска
  2. Поиск, при щелчке на кнопке "Найти"
  3. Отображение результатов
Если инкрементный поиск производится на компьютере пользователя, то отображение промежуточных результатов не критично. Если же мы попытаемся реализовать его для поиска товара в базе данных web-cервера, то ничего не получится, поскольку результаты поиска будут отображаться с задержкой после каждого нажатия на клавиши посетителем (требуется время на пересылку информации, ее поиска, да и браузер очень медленно отображает данные)! Другими словами будет происходить бессмысленная пересылка ненужных посетителю данных. Могу сказать, что и задержка 0,5 сек. после нажатия на клавишу уже вызывает дискомфорт. Инкрементный поиск по своей природе - клиентский поиск (локальный поиск), который производится на компьютере пользователя, что является еще одним ограничением по сравнению с обычным поиском с запросом, который может работать как локально, так и в среде "клиент-сервер".
Инкрементный поиск по началу строки
Давайте рассмотрим разновидность инкрементного поиска - поиск по началу строки, который позволяет производить быстрое позиционирование в массиве данных. Предположим, что у нас есть список из 1000 наименований, упорядоченных по алфавиту, и нужно перейти к записям, начинающиеся с буквы "т". В случае инкрементного поиска для этого достаточно один раз нажать клавишу "т". То есть, инкрементный поиск по началу строки позволяет быстро перейти к записи, начало которой полностью или "частично соответствует" введенной к тому моменту строке поиска, что невозможно сделать с помощью обычного поиска. Что значит "частично соответствует"? Предположим, у нас есть 3 записи и выбрана первая запись:
Аспиратор
Прибор 1
Прибор 2
Прибор 3
В пустой строке поиска мы вводим букву "П" - произойдет переход ко 2-й записи, поскольку она начинается с буквы "П". Что произойдет, если мы введем букву "р"? Мы останемся на записи 2, поскольку фрагмент "Пр" в строке ввода соответствует началу названия 2-й записи "Прибор 1". Что будет, если мы теперь введем букву "а"? С фрагмента "Пра" не начинается ни одна запись в нашем примере. Вот здесь все будет зависеть от реализации. В 1С, например, раздается звуковой сигнал и пользователь не сможет ввести символ. А в Google можно спокойно продолжать ввод.
Инкрементный поиск по началу строки особенно эффективен в том случае, когда товар упорядочен по товарным группам, т.е. его название начинается с названия товарной группы, например, "прибор", "модель", "плакат", "карта". Это очень удобно в том случае, когда необходимо произвести поиск нескольких товаров из одной товарной группы, например, "приборы".
Инкрементный поиск по всей строке
Инкрементный поиск по началу строки имеет большое ограничение - возможность быстрого позиционирования только по первым символам в строках записей. Для устранения данного ограничения необходимо совместить идею инкрементного поиска с возможностями произвольного поиска с запросом, в результате чего пользователь сможет производить инкрементный поиск независимо от количества и расположения фрагментов в строке запроса! В результате мы получаем один из самых эффективных механизмов последовательного поиска!
Вы заметили, что до сих пор мы рассматривали поиск с точки зрения Windows-программирования и говорили о пользователях? Это позволяет абстрагироваться от технологий и ограничений, присущим web-среде, и сосредоточить внимание на рассмотрении эффективных алгоритмов поиска. Если бы мы начали рассматривать данные вопросы с точки зрения Web, то вместо решения задачи разработки удобной системы поиска мы завязли в проблемах реализации поиска на сайте, что и демонстрируют многочисленные web-ресурсы, на которых поиск реализован непонятно как. Часто бывает, что найти решение в какой-то области "внутри нее" очень трудно. В таких случаях я рекомендую выйти за ее пределы, и обратиться к областям, которые являются родительскими, и, возможно, в них уже разработаны алгоритмы для решения похожих задач. Поскольку традиционное программирование является родителем web-программирования, то и ответы на проблемы Web нужно искать в программировании, где наработано огромное количество различных алгоритмов. Я бы сказал так, - что для Web является проблемой, то для программирования является лишь задачей, а с задачу, как известно, решить проще, чем пытаться справиться с проблемой.
Оглавление
Copyright © 2016