Introweb - введення в web-розробку

Для того щоб зробити пошук нам необхідно задати деяке умова, при виконанні або невиконанні якого пошук буде вважатися успішним або неуспішним відповідно. Незважаючи на те, що будь-який перегляду - з умовою, я б виділив три характерні типи пошуку: повнотекстової (позиційний), пошук із запитом (вибірка), інкрементний пошук (позиційний). У дужках наводиться уточнення, щоб Вам було зрозуміло, про що йде мова, оскільки завжди є можливість програмної емуляції того чи іншого візуального ефекту при пошуку.

Повнотекстової пошук - найпростіший вид пошуку, при якому пошук інформації проводиться у всьому обсязі даних - по всьому об'єму тексту або по всім полям бази даних. І це його головна перевага. Нам не потрібно знати, як і де зберігається інформація, ми просто шукаємо її. Прикладом може послужити пошук рядків в документі 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 є проблемою, то для програмування є лише завданням, а з завдання, як відомо, вирішити простіше, ніж намагатися впоратися з проблемою.