Загальні принципи
Загалом існує два основні методи реалізації пошуку. Перший полягає в прямому пошук серед існуючих систем зберігання даних (HTML файли, бази даних... залежно від типу сайту). Цей метод дуже повільний, оскільки типи даних, що зберігаються і до яких ви маєте доступ, як правило, не передбачені для цієї мети.
Другий метод, який був прийнятий SPIP (а також усіма професійними пошуковими системами), полягає в створенні способу зберігання даних, який відповідатиме конкретним вимогам пошуку. Наприклад, оцінка для кожного слова в статті може зберігатися таким чином, щоб бути легко доступною знову і щоб дозволяти отримати загальний бал пошуку простим додаванням. Перевага тут у тому, що пошук відбувається дуже швидко - майже так само швидко, як і будь-які інші розрахунки для сторінки, які ми могли б зробити. Незручність в тому, що цей метод вимагає фази для побудови інформації, призначеної для зберігання; ця фаза відома як крок індексації. Індексація має певну вартість в плані ресурсів (часу для її виконання і дискового простору), а також вводить невеликі затримки в часі між додаванням або модифікацією змісту і тим, коли цей доданий чи модифікований зміст відбиватиметься в результатах пошукової системи. З іншого боку, у разі SPIP, ми змушені використовувати PHP і MySQL, як ми це робимо для іншої частини програмного забезпечення, що не допоможе нам досягти високої продуктивності пошуку, не тільки з точки зору швидкості, але й з боку релевантності та різних інших удосконалень (індексування документів, зовнішніх щодо нашого сайту; створення семантичних полів, що дозволяють більш точно налаштовувати пошук; і т.д.).
Перевагою вбудованної системи пошуку, однак, є те, що вона дозволяє керувати відображенням результатів пошуку, використовуючи ті ж методи (шаблони), як і для решти SPIP сторінок, і робити це всередині того ж візуального середовища.
Індексація
Індексація здійснюється під час візитів в на загальнодоступний сайт. Щоб уникнути накопичення завдань індексації і розрахунків сторінок, що може призвести до тайм-аутів на особливо повільних серверах, SPIP чекає, доки сторінка не буде відображатися за допомогою кешу [1].
Індексація розглядає різні текстові поля даних певного типу контенту одне за іншим: наприклад для статті це опис, назва, текст... Для кожного текстового поля даних обчислюється оцінка кожного слова шляхом підрахунку кількості йього входжень. При цьому слова з трьох символів або менше ігноруються (вони в більшості випадків незначні, але тягнуть за собою створення громіздкої бази даних). З іншого боку, будь-які акцентовані літери транслітеруються (перетворюютьсяі в не акцентовані еквіваленті), щоб уникнути проблем, пов’язаних з наборами символів, а також щоб зробити можливим виконувати пошук з використанням акцентованих версій ключових слів. Нарешті, результати для кожного слова накопичуються у зваженному варіанті щодо різних полів текстових даних у індексованому контенті. Зважування дозволяє, наприклад, призначити більшу вагу ключовим словам, які зустрічаються в назві статті, ніж тим ж словам в тексті або в постскриптумі...
Функції індексації можуть бути вивчені у файлі ecrire/inc_index.php
. Щоб краще уявити собі динамічну індексацію сайту, ви можете відкрити файл ecrire/data/spip.log
або продивитися сторінку ecrire/admin_index.php
(зауваження: ця сторінка має все ще досить експериментальний характер, не поставляється з усіма версіями SPIP і існує тільки французькою. Її було знято з [SPIP 1.9] і тепер вона доступна з плагіна recherche_etendue разом з кількома іншими функціями управління індексацією).
У версії [SPIP 1.6] були зроблені деякі важливі зміни у поведінці пошукової системи:
- покращена робота в багатомовному середовищі;
- символ підкреслення тепер розглядається не як роздільник слів, але як літерний символ (це корисно для комп’ютерної документації);
- будь-які слова з двох букв (або більше), які містять тільки символи верхнього регістру, розглядаються як абревіатури і скороченя і будуть індексуватися, що виключає один з головних недоліків з обмеження індексації словами більше 3-х букв (G8, США, ПДВ, ООН тепер усі проіндексовані).
Пошук
Пошук працює просто шляхом поділу тексту, який шукається, на окремі слова. Застосовується той самий фільтр, як і під час індексації: видаляються слова з трьох або менше символів (крім абревіатур) і транслітеруються акцентовані літери.
Для кожного контенту, за яким йде пошук, збирається оцінка різних слів і потім додається, щоб отримати загальний бал. Нарешті результати, як правило, відображауться в порядку зменшення оцінки замовлення ({par points}{inverse}
), тобто в порядку убування релевантності (але це залишається на розсуд того, хто створює код шаблонів для форматування результатів).
Продуктивність
Швидкість
На сучасному сервері, який не є перевантаженим, індексація великого тексту (кілька десятків тисяч знаків) займе одну-дві секунда: очікування майже непомітне в порівнянні з затримками передачі даних мережею. Короткий зміст індексуються квазі-миттєво. Звичайно, ці вимоги необхідно співвідносити в залежності від розміру сайту. Дійсно величезний сайт ризикує значно збільшити час індексації; майте це на увазі в перспективі, але зважте, що наприклад сайт Le Courrier des Balkans містив біля 3800 опублікованих статей на момент написання цієї статті і понад 7500 повідомленнь на форумі, але пошукова система SPIP не виказувала жодних ознак слабкості.
На додаток, статистично кажучи, ми можемо припустити, що кожна частина контенту буде індексуватися приблизно тільки один раз: приймаючи до розгляду те, що, як правило, відвідувань сайту набагато більше, ніж оновлень його змісту, навантаження серверу має бути зовсім непомітним в цілому.
Якість
Якість індексування нижче, ніж у професійних пошукових систем. Оскільки РНР в цілому є досить повільною мовою, фаза видобування слів має бути спрощена, наскільки це можливо, аби час індексації залишився на абсолютного мінімуму. В результаті дані індексації містять в собі деякі «відходи», тобто фрагменти тексту, які насправді не відповідають «реальним» словам, але які були проіндексовані (найчастіше це технічний контент, такий як імена файлів або розділів із жахливою пунктуацією). Наприклад на uZine ми спостерігаємо приблизно 2% таких «відходів», а тому ми вважаємо їх досить незначною кількістю і думаємо, що це дуже малоймовірно, щоб вони з’явились на перших позиціях в результатах будь-якого пошуку.
Пошук SPIP не пропонує жодних логічних операторів, а неявний оператор працює більш-менш як логічне «АБО». Проте, починаючи зі SPIP 1.7.1, знайдені статті будуть відображатися в порядку, за яким привілеї мають результати, що містять більш точно написане слово відповідно до критеріїв пошуку. Наприклад в результатах пошуку для фрази «шлях до мети» статті, що містять слова «шлях» і «мети», будуть передувати статтям, які містять слова «шляхтич» і «метикувати» - ці статті будуть, як і раніше, з’являтися в списку результатів, але значно нижче.
Дисковий простір
MySQL не є спеціально призначений для зберігання даних індексуівання, а використання пошукової системи призводить до того, що бази даних з’їдають багато доступного дискового простору. Щоб забезпечити трохи більше точності по цій темі, ми можемо сказати, що певний текстовий контент генерує дані індексу розміром приблизно між розміром самого цього контенту і подвійний розміром того ж контенту. Отже, якщо екстраполювати це на дані, які не індексуються (форуми, наприклад), то індексація потребує приблизно подвійного або потрійного простору, який займається базою даних. Це може бути болючим, якщо для вас доступний невеликий ліміт дискового простору.
Якщо ви коли-небудь вирішите деактивувати пошукову систему з метою економії дискового простору, не забудьте потім видалити всі дані індексації (на сторінці зберігання/відновлення бази даних), щоб бути певними, що дисковий простір дійсно звільнено від цих даних.