Пишемо власне пошукове ядро

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

1. Структура.

Для початку хочу показати в якій таблиці у мене зберігаються матеріали:

пишемо

Як бачите у мене досить багато полів, більшість я не став показувати, вони призначені чисто для технічних моментів. Нас цікавлять насправді перші 4 поля: id, title, keywords, text. Якщо ви якось інакше зберігаєте свої матеріали, і у вас наприклад є ще поле description то необхідно врахувати цей момент і відповідно внести необхідні коригування.

Далі нас цікавить які файли у нас будуть у системі:

Тут теж нічого складного, саме пошукове ядро ​​search_core.php та шаблон search_result.tpl. В чому суть? У тому, що всі дані, що надсилаються користувачем, будуть оброблятися в пошуковому ядрі і формувати виведення з файлу шаблону в потрібне нам місце на сайті.

Сам файл search_core.php буде побудований у нас на функціях, роботі з масивами і регулярних функціях.

2. Особливості української мови.

Ні для кого не секрет, що українська мова, напевно, найскладніша з усіх існуючих у світі, т.к. стільки словоформ скільки у нас у мові немає в жодній мові світу. Чому? Та тому що у нас у мові існують такі речі, як приставки, закінчення, суфікси тощо. Що неймовірно сильно ускладнює для іноземців, і для нас - програмістів зокрема, процес вивчення танавчання великого та могутнього. Нам доведеться навчити нашу систему хоча б розуміти різні відмінки слів.

Визначимося з тим, які у нас є закінчення у слів і напишемо першу функцію в наше ядро, яка буде відрізати у слів запиту закінчення для підвищення рівня релевантності:

Як бачите загалом поки що нічого складного. Тобто. якщо користувач введе наприклад слово: "Пісні", то система відкине літеру "і" і залишить нам тільки "Пісні", а це погодьтеся дозволити знайти вже такі слова, як пісня, пісня, пісні і т.д. Тобто. Семантика пошуку у нас збільшилася.

Я вказав не всі існуючі закінчення їх може бути більше, тут вам доведеться повчити систему. Можливо навіть доведеться дещо переробити регулярну функцію та написати додаткові правила.

Такі ж функції можна написати на приставки і суфікси, але не захоплюйтесь поки що, а то можна наші слова перетворити на незрозумілі огризки і тоді система знаходитиме все, хоч скільки-небудь схоже на наш запит, а нам все ж таки потрібні точніші збіги.

Іншою необхідністю є те, що в українській мові, ну власне як і в будь-якій іншій, є маса стоп-слів, які нам не потрібні в пошуку і які зустрічаються часто-густо в будь-якому тексті. Тому нам треба ще написати функцію, яка вбиває всі стоп-слова.

Добре, ще одна функція ядра готова, де я знову ж таки взяв трохи слів для прикладу. Вона дозволить нам створити більш осмислений пошуковий запит.

Як бачите такими нескладними функціями, можна навчати систему роботи зі словами української мови. Повірте мені на слово, все це працює досить швидко і говорити про те, що така велика кількість регулярних функцій шкідливо із сучасним інтернетом вже не доводиться. Зрештою ми жЧи не Яндекс пишемо і обробляти у нас буде не так багато інформації.

Як варіант для обох функцій можна формувати масив таких значень і брати вже з нього для порівняння, але не будемо тут ускладнювати собі життя.

3. Обробка пошукового запиту

Тепер нам треба нарешті отримати всі пошукові слова із загального пошукового запиту, який запитав користувач:

Думаю варто пояснити чому ми слова коротші за 6 символів вбиваємо. Це правило поширюється на кодування UTF-8, особливість якого полягає в тому, що кожен український символ йде за два. Спробуйте заради інтересу вивести на екран довжину 1 українського символу і ви будете здивовані тим, що вона дорівнює 2. Таким чином, якщо ми пишемо коротше 6 символів, то для українців це означає коротше 3 символів. Ось такий нюанс, який слід пам'ятати. Зараз напевно кожен одразу згадав недавнє обурення нашого уряду на тему, чому SMS-повідомлення в українській розкладці вдвічі коротші за англійські.

Таким чином, якщо вивести наш масив, то ми отримаємо приблизно таке:

Вже добре і практично те, що нам потрібне. З цим ми вже можемо спокійно працювати і отримати більше матеріалів із бази, ніж ми шукали б за цілою фразою.

Напишемо ще одну невелику функцію суто візуалізаційну і на цьому закінчимо першу частину уроку.

За допомогою цієї функції ми просто виділятимемо знайдені нами слова, щоб користувач бачив за якими словами був знайдений матеріал.

На цьому хотілося б зупинитися і дати вам можливість самим придумати якісь додаткові функції для пошукового ядра. А в наступному уроці ми вже подивимося, як серед купи матеріалів знайти ті, що потрапили в пошук і як їх вивести за допомогою шаблону.

Цей урок підготовлений для вас командою сайтуruseller.com Джерело уроку: www.ruseller.com Автор: Павлов Олександр Урок створено: 10 Жовтня 2011 Переглядів: 71518 Правила передруку

5 останніх уроків рубрики "PHP"

Фільтрування даних за допомогою zend-filter

Коли йдеться про безпеку веб-сайту, фраза "фільтруйте все, екрануйте все" завжди буде актуальною. Сьогодні поговоримо про фільтрацію даних.

Контекстне екранування за допомогою zend-escaper

Підключення Zend модулів до Expressive

Expressive 2 підтримує можливість підключення інших компонентів ZF за спеціальною схемою. Не всім подобається це рішення. У цій статті ми розповімо, як покращили процес підключення кількох модулів.

Порада: надсилання інформації в Google Analytics через API

Припустимо, що вам необхідно надіслати якусь інформацію до Google Analytics із серверного скрипту. Як це зробити. Відповідь у цій нотатці.

Підбірка PHP пісочниць

Добірка з кількох видів PHP пісочниць. На деяких ви в режимі online зможете потішити свій код, але є рішення, які можна впровадити на свій сайт.