Поиск по сайту с учетом морфологии русского языка на PHP + карта сайта


Содержание

Удобный поиск по сайту с учетом морфологии и релевантности — evoSearch

Многие наверное слышали о CMS Modx EVO теперь она называется EVOLUTION. Так вот раньше для поиска я всегда использовал AjaxSearch, не скажу, что он мне сильно нравился, просто альтернативы то и не было. Суть работы сниппета AjaxSearch заключалась в обычной выборке из таблиц БД соответствий полученному запросу, большой набор параметров не всегда позволял сделать нормальную выборку, и честно приходилось просто ставить поиск по сайту от Яндекса или Гугла, так как он давал большую релевантность.

Не так давно появилось очень интересное решение evoSearch от webber, это целая система, которое включает в себя сниппет, плагин и необходимые библиотеки. Установка не занимает много времени. Есть небольшой набор параметров, которые позволяют подстроить поиск под себя. Но самый большой плюс это полноценный поиск с учётом морфологии и релевантности.

Сейчас расскажу, как всё это работает. После того как вы установили сниппет и плагин evoSearch вам нужно переиндексировать ваш сайт, при первой переиндексации в конфигурации плагина надо выбрать — Переиндексировать все (поставить — 1) и количество строк за сеанс. Тут стоить быть аккуратным если ваш сайт большой имеет тысячи сток (документов) в базе то лучше переиндексировать сайт в несколько этапов. Многое ещё зависит от хостинга. Также в конфигурации можно исключить из индексации целые разделы или отдельные страницы.

И так вы переиндексировали ваш сайт, заходим обратно в настройки и отключаем переиндексировать все (ставим 0), а в графе Строк за сеанс индексировать ставим 1. Теперь при создании или сохранении документа он будет автоматом переиндексирован или проиндексирован. А что мне особенно нравиться так это возможность настроить релевантность поиска, по умолчанию 0.01, чем выше цифра — тем более релевантные результаты. Также можно искать в отдельных параметрах TV.

Морфологизаторы — скрипты морфологического анализа.

Морфологические анализаторы (морфологизаторы) на php и других языках существуют уже достаточно давно и в большом количестве, позволяя реализовать поиск с учетом словоформ. Неотвратимый изъян анализатора — привязка к словарю, но некоторые более продвинутые скрипты могут работать и без словаря эвристическим способом, основываясь на вероятностных методах. Анализаторы сделаны как парсеры и стеммеры.

Парсер (parser) — грамматический анализатор в составе синтаксического анализатора. Скрипт, обеспечивающий автоматическую обработку (разборку) страниц сайтов с целью получения нужных данных. Так, парсят серп (поисковую выдачу) Яндекса и Гугл, например, чтобы определить показатели качества сайта — ТИЦ и ПР, а также позиции сайта, парсят страницы на предмет нахождения там нужной ссылки (открыта/закрыта), текста и т.п.

Стеммер (stemmer) — процесс нахождения основы слова для заданного исходного слова. Основа слова необязательно совпадает с морфологическим корнем слова. Алгоритм стемминга представляет собой давнюю проблему в области компьютерных наук и применяется в поиcковых системах для обобщения поискового запроса пользователя. Стеммер, в отличие от «аналитических», т.е. от списков окончаний, более «умный», может иметь свой словарь для выделения формальной основы. Программа определения основы заданного исходного слова:

  • кружка : кружка (сущ., ж.), кружок (сущ., м.).
  • моя : мыть (гл.), мой (мест.).
  • Буря мглою небо кроет,
  • Вихри снежные крутя;
  • То, как зверь, она завоет,
  • То заплачет, как дитя…
  • [Буря: буря, бурить, :1] [мглою: мгла, :1] [небо: небо, :1] [кроет: крыть, :1],
  • [Вихри: вихрь, :1] [снежные: снежный, :1] [крутя: крутить, :1];
  • [То: то, :1], [как: как, :1] [зверь: зверь, :1], [она: она, :1] [завоет: завыть, :1],
  • [То: то, :1] [заплачет: заплакать, :1], [как: как, :1] [дитя: дитя, :1]…

А ведь можно попробовать для стемминга использовать обученную нейросеть и предоставить пользователям корректировать БД знаний скрипта — об этом уже упомяналось ранее в предыдущих статьях, но никто пока до этого еще не дошел (не нашел во всяком случае таковых).

Вот некоторые морфологические скрипты:

Проект «Вавилонская башня» — бесплатный скрипт.

RuMor — морфологический модуль на языках Перл и php для русского языка, включающий в себя две основные функции: нахождение базовой формы слова или всех его словоформ. Данный модуль может использоваться в поисковых системах для улучшения поиска по документам с русским текстом. В качестве исходных данных для генерации словоформ используется словарь Зализняка, дополненный 30 тысячами основ. Всего в словаре содержится около 125 тысяч основ, что позволяет генерировать более 3500000 словоформ.

MyStem — стеммер от Яндекса, производит морфологический анализ текста на русском языке; по сути простой стеммер, может только нормальную форму получить и вывести морфологическую информацию по слову. Работает очень шустро, но на уровне ОС (операционной системы), на сервере требует запуск «демона» (daemon). Для слов, отсутствующих в словаре, порождаются гипотезы, может работать и без словаря эвристическим способом. Это и плюс и минус: плюс — даст нормальную форму даже для несловарного слова; минус — иногда ошибается и выдает бред. Бесплатен для некоммерческого использования.

Morphlogy — определяет словоформы слов, корни и начальные формы. Если нужно реализовать поиск с учетом словоформ, то это совсем просто — нужно просто получить корень слова с помощью phpMorphy ($root=$morphy->getPseudoRoot($words);) и провести поиск по базе данных SQL-оператором LIKE. На данный момент словари есть для русского, английского и немецкого языков.

Ispell — одна из наиболее популярных бесплатных программ проверки орфографии на Unix-системах. В рамках проекта ispell создано множество словарей для разных языков, распространяемых под лицензией GPL, которые в определенных пределах можно использовать и для задачи морфоанализа. Эти словари изначально создавались для проверки орфографии, поэтому качество морфоанализатора основанного на этих словарях заметно ниже словарей специализированных. Словари ispell обычно состоят из двух файлов: файл с правилами генерации словоформ (так называемый affix-файл) и собственно словарь, где для каждого слова указаны номера правил, которые нужно применить к этому слову. Скрипт поддерживает preffix правила (правила приставок), но для каждой возможной приставки в словарь будет добавлено отдельное слово, потому что, как правило, приставки изменяют смысл слова и логично считать это слово отдельным. Например: подъезд №1 дома №2; объезд болота с левой стороны; заезд в гараж дальше.

Для справки: а ффикс — морфема, которая присоединяется к корню и служит для образования слов. Все категории аффиксов на Вики.

Релевантный поиск с морфологией (без индексации)

Часто перед веб-разработчиками встает задача реализации поиска по сайту. Попробуем сконструировать «велосипед», обладающий следующими характеристиками:

  1. Отсутствие индексной таблицы (индексы — тема отдельной статьи);
  2. Работа с кодировкой UTF-8;
  3. Удаление коротких и стоп-слов;
  4. Морфологическое преобразование русских словоформ;
  5. Сортировка результатов с учетом их релевантности;
  6. Постраничная выдача результатов.

Что нужно?

Нам понадобится рабочий веб-сервер с поддержкой PHP. Для морфологического анализа мы будем использовать русскоязычный стеммер Портера. Кроме этого, нам потребуется список стоп-слов и некоторые функции из проекта PHP UTF-8. Поскольку мы договорились, что не будем использовать индексирование, то в базе данных достаточно одной таблицы приблизительно такого вида:

Илон Маск рекомендует:  Разное положение декоративной линии

Искать страницы будем по их содержимому ( content ), а в сниппетах выводить название ( title ) и описание ( description ). Однако при необходимости вы легко сможете расширить поиск до нескольких полей и даже учитывать это при подсчете релевантности.

Предварительная обработка строки

Сперва инициализируем переменные со строкой запроса, номером текущей страницы и количеством записей, отображаемым на одной странице. Последние две переменные нужны для организации постраничной выдачи результатов с соответствующей навигацией.

Сократим поисковый запрос до 64 символов (такой длины вполне достаточно) и приведем его к нижнему регистру. Для этого воспользуемся функциями из упомянутого выше проекта PHP UTF-8, архив с которым мы распаковали в директорию utf8 . Если ваш рабочий сервер поддерживает mbstring, можете воспользоваться аналогичными функциями оттуда.

Для корректной работы стеммера необходимо заменить буквы «ё» на «е». Далее удаляем из строки все HTML сущности и специальные символы, а идущие подряд пробелы заменяем единичными экземплярами. Таким образом, получаем подготовленную строку из слов, разделенных пробелами.

Морфологический анализатор

В русском языке ярко выражена морфологическая изменяемость слов (например, «дерево, деревьями, деревянным»), поэтому в целях улучшения качества поиска имеет смысл проводить морфологический анализ поисковых запросов. Целью такого анализа будет получение из слова его основы, или леммы. Поиск по леммам увеличивает полноту получаемых результатов за счет документов, в которых встречаются другие словоформы с той же основой. Морфологический анализ положительно влияет и на релевантность (точность) поиска, поскольку использование лемм придает гибкости механизму поиска и избавляет пользователя от необходимости указывать словоформу в нужном падеже и т. д.

Есть два основных подхода к морфологическому анализу. Первый и наиболее точный — применение алгоритмов с использованием словарей. В качестве примеров можно привести Ispell и AOT. Минусом такого подхода является более высокая нагрузка на сервер, поскольку объем словарей может достигать десятков мегабайт.

Второй и гораздо более экономичный подход заключается в применении лемматизаторов, или стеммеров, — алгоритмов, определяющих леммы по суффиксам и окончаниям. Точность их на порядок ниже, однако для небольших сайтов, где поиск не является ключевым инструментом, этого более чем достаточно.

В качестве стеммера мы воспользуемся реализацией алгоритма Портера на PHP. Однако вы можете использовать пакет PECL::stem или любой другой по своему усмотрению. Стеммер Портера выглядит таким образом:

Нам также понадобится массив стоп-слов, не несущих значительной смысловой нагрузки и подлежащих удалению. В него не вошли слова короче трех букв, поскольку их мы удалим в любом случае (существенно снижают точность поиска).

Построение SQL-запроса

Прежде чем получить леммы и построить из них SQL-запрос, вспомним о релевантности. Логично, что страница тем больше соответствует запросу, чем больше в ее тексте запрашиваемых слов (лемм). SQL позволяет определить количество вхождений слова в строку (текст документа) с помощью такой конструкции:

Конечно, правильнее было бы нормализовать количество вхождений длиной текста, так как налицо разница между десятью повторениями в целой книге и пятью — в одном абзаце (второй случай более релевантен, несмотря на меньшее количество совпадений). Однако средствами SQL без применения хранимых процедур невозможно определить общее количество слов в строке. Поэтому придется пренебречь амплитудой объема страниц, считая их приблизительно одинаковыми.

Итак, для начала сформируем части запроса, содержащие конструкцию WHERE и подсчет релевантности. Последняя определяется как сумма вхождений каждой из искомых лемм. Если вы хотите реализовать поиск по нескольким полям таблицы, то нужно соответсвующим образом изменить эти части запроса. При этом можно повысить вес некоторых полей, добавив для них какой-либо коэффициент в формулу подсчета релевантности.

Предварительно будем отсеивать короткие и стоп-слова, а для оставшихся определим леммы, которые и будем искать. В целях дополнительной защиты от слишком «тяжелых» запросов ограничимся пятью первыми словами.

Поскольку мы намереваемся получать результаты постранично, нам понадобятся два SQL-запроса. Из первого мы узнаем общее количество искомых страниц, а с помощью второго выберем необходимые для отображения (в количестве, указанном в $rpp ), отсортировав их по убыванию релевантности.

Вывод результатов

Остается только отобразить форму ввода запроса вместе с результатами поиска:

И наконец, добавим ссылки для перемещения между страницами результатов:

Исключение тегов и атрибутов

Серьезным минусом безындексной реализации является поиск по всему документу, включая теги и их атрибуты. Например, намереваясь найти страницы со словом «article», вы найдете также и все документы с одноименным тегом. Это не страшно, если у вас русскоязычный сайт о цветах или автомобилях. Хуже, если ваши пользователи действительно часто ищут слова вроде «article», «section», «script» и т. д. Помочь в этом случае может хранимая процедура MySQL, удаляющая из строки все теги. Выглядит она следующим образом:

Хранимые процедуры поддерживаются в системе InnoDB, но не в MyISAM. Поэтому использование этой возможности остается на ваше усмотрение.

11 комментариев

Антон из Ставрополя @ 8 декабря 2011

Алексей @ 8 декабря 2011

Антон из Ставрополя @ 8 декабря 2011

гость @ 16 августа 2013

Алексей @ 13 сентября 2013

Арго @ 22 апреля 2014


Том @ 23 апреля 2014

энергетик @ 29 ноября 2014

Начиная с 5.6 Mysql умеет использовать FULLTEXT index для InnoDB.

Sphinx все же лучшие решение для поиска по релевантности морфологии итд. Благодаря настройке формул ранжирования

Александр @ 17 апреля 2015

работает вот так
return step4(step3(step2(step1($a[0]))));

Скажите пожалуйста, что делает функция rv($word)? В ней переменная $flag == 1 только на последней букве слова, последняя итерация цикла, соответственно функция всегда возвращает $rv = » (пусто)

Кристина @ 26 ноября 2015

Краткий курс HTML 5

Этот курс знакомит читателя с основами языка HTML 5 и позволяет начать его практическое применение в кратчайшие сроки.

Поиск по сайту с учетом морфологии русского языка на PHP + карта сайта

Курс предназначен для базовой подготовки администраторов сайтов, созданных на «1С-Битрикс: Управление сайтом». Изучив курс, вы освоите основные методы администрирования системы, а также пополните знания по темам, изученным в курсе Контент-менеджер.

Если вы добросовестно изучите курс, то научитесь:

  • управлять доступом к системе, сайтами, пользователями, группами пользователей;
  • работать с инструментами системы;
  • использовать возможности интерфейса по управлению системой;
  • работать с модулями «1С-Битрикс: Управление сайтом», связанными с оптимизацией и безопасностью работы сайта;
  • выполнять работу по конфигурированию веб-системы для оптимальной работы.

Если вам предстоит самостоятельная установка системы или перенос сайта на хостинг, то без курса Установка и настройка Курс Установка и настройка предназначен для специалистов устанавливающих «1С-Битрикс: Управление сайтом» или «Битрикс24 в коробке».

Начальные требования

Необходимый минимум знаний для изучения курса:

  • базовые навыки компьютерной грамотности и навыков работы с ОС Windows;
  • базовые знания о WWW и организации доступа к веб-серверу;
  • знание системы в рамках курса Контент-менеджер Мы считаем, что вы этот курс уже прошли и знаете многое о Битриксе. Поэтому подсказок во всплывающих окнах будет намного меньше, чем в курсе Контент-менеджер. , чтобы банально не путаться в интерфейсе.

Неплохо было бы иметь базовые навыки установки и администрирования *nix-систем.

Тесты и сертификат

После изучения курса пройдите тесты на сертификацию. При успешной сдаче последовательности тестов на странице Моё обучение вы увидите результат обучения и там же — ваш сертификат в формате PDF.

Иконка успешно сданного вами курса отображается в вашем профиле на Freelance, если вы укажите ссылку на ваш профиль на сайте компании 1С-Битрикс.

Комментарии к урокам

На каждой странице курса авторизованный на сайте посетитель может дать комментарий к содержимому страницы. Комментарий — не форум, там не ведётся обсуждений или разъяснений. Это инструмент для сообщений нам об ошибках, неточностях. Для отправки комментария воспользуйтесь расположенной в правом нижнем углу окна браузера кнопкой:
Илон Маск рекомендует:  Глава 13 контекстно свободные грамматики

Для преподавания оффлайн

Если данный курс берётся в качестве основы для оффлайного преподавания, то рекомендуемая продолжительность: 3 дня (24 академических часа).

Если нет интернета

Экономите время и учитесь по дороге на работу или в ВУЗ? Для этого нужны файлы. Мы предоставляем две возможности оффлайнового изучения: файлы в формате PDF и CHM, они открываются на любых устройствах. Программы для чтения доступны в AppStore и Play Market. Файлы обновляются периодически, но всё равно будут отставать от онлайновой версии курса. Поэтому, всё же, мы рекомендуем он-лайн версию курсов, тем более, что мобильный интернет сейчас не проблема.

Чтобы отключить подобное отношение к файлу необходимо:

    перейти в свойства файла на вкладку Общие. Внизу у Вас отобразится сообщение о том, что этот файл был заблокирован системой с целью защиты компьютера.

Отсутствие кнопки Разблокировать возможно в двух случаях:

  1. Файл лежит не локально, а на сетевом ресурсе.
  2. Если файл лежит на локальном диске, но путь к нему содержит спецсимволы (# и прочие).

жители зёмли!

Функция добавления индекса будет выглядеть следующим образом:

function insert_index($url,$text)
<
$words=clear_text($text);
$text=strip_tags($text);
$date=time();
mysql_query(«INSERT INTO `seach_index` (`url`,`date`,`page_text`,`page_words_in dex`)
VALUES (‘$url’,$date,’$text’,’$words’)») or die(mysql_error());
>

Поиск
Перед поиском ключевые слова нужно будет преобразовать в словоформы всё той же функцией clear_text() и искать по полю page_words_index следующим запросом:
SELECT * from seach_index WHERE MATCH (page_words_index) AGAINST (‘ЗЕМЛ’)
Можно усложнить запрос и добавить подсчет релевантности, постраничный вывод , а на выводе результатов ключевые слова в поле page_text подсвечивать. Главное не забывайте изменять поисковый индекс при изменении самого объекта.

Поиск по сайту с учетом морфологии русского языка на PHP + карта сайта

Здесь могла бы быть ваша реклама

Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006
Откуда: Israel

Секрет
Теперь, когда вы уже наверняка второпях отправили свой запрос,
я расскажу вам простой секрет, который сэкономит вам уйму ожиданий,
даже если первый ответ по теме последуем сразу же.

Само собой я знаю что ответят мне тут же, и если я посмотрю
на сообщения на форуме, то пойму что в общем то я и не ошибаюсь.
Но еще я точно замечу, что очень мало тем, в которых всего два ответа :
вопрос автора и еще два сообщение вида Ответ + Спасибо

После этого приходится начинать уточнять этим неграмотным что мне надо.
Они что, сами читать не умеют? А уточнять приходится.
И иногда пока они переварят то что я им скажу проходит и не одна ночь..

Уверен что если бы я им сказал что у меня есть
фиолетовый квадрат, и нужно превратить его в синий треугольник
и я пытался взять кисточку, макнуть в банку и поводить ей по квадрату
но почему то кисточка не принимала цвет краски в банке,
то на мой вопрос — где взять правильные банки мне бы ответили гораздо быстрее
предложив её открыть, а не тратить еще стольник на жестянку.

Поэтому с тех пор я строю свои вопросы по проверенной давным давно схеме:
Что есть
Что нужно получить
Как я пытался
Почему или что у меня не получилось.

На последок как оно происходит на форумах

Новичок: Подскажите пожалуста самый крепкий сорт дерева! Весь инет перерыл, поиском пользовался!
Старожил: Объясни, зачем тебе понадобилось дерево? Сейчас оно в строительстве практически не используется.
Новичок: Я небоскрёб собираюсь строить. Хочу узнать, из какого дерева делать перекрытия между этажами!
Старожил: Какое дерево? Ты вообще соображаешь, что говоришь?
Новичок: Чем мне нравиться этот форум — из двух ответов ниодного конкретного. Одни вопросы неподелу!
Старожил: Не нравится — тебя здесь никто не держит. Но если ты не соображаешь, что из дерева небоскрёбы не строят, то лучше бы тебе сначала школу закончить.
Новичок: Не знаите — лучше молчите! У меня дедушка в деревянном доме живёт! У НЕГО НИЧЕГО НЕ ЛОМАЕТСЯ.
Но у него дом из сосны, а я понимаю, что для небоскрёба нужно дерево прочнее! Поэтому и спрашиваю. А от вас нормального ответа недождёшся.
Прохожий: Самое крепкое дерево — дуб. Вот тебе технология вымачивания дуба в солёной воде, она придаёт дубу особую прочность:
Новичок: Спасибо, братан! То что нужно.

Отредактировано модератором: Uchkuma, 26 Апреля, 2011 — 10:21:12

Поиск по сайту с учетом морфологии русского языка на PHP + карта сайта

Прежде всего скажу, что после отсутствия нормального описания, документации и т.д. при работе с морфологией на C#, такое ощущение, что попал в рай –полностью подробная документация, обилие готовых модулей, полная прозрачность. Поэтому много писать не имеет смысла.
Я использовал популярный морфологический модуль для php phpMorphy. Здесь мы снова встречаемся с компанией АОТ, работа с модулями которой для С и С# уже была описана здесь.

Библиотека phpMorphy

phpMorphy – библиотека морфологического анализа, реализованная на платформе PHP. Помимо русского работает с английским, немецким и даже украинским языком. Есть возможность добавить поддержку других языков при помощи myspell словаря.

Ее возможности:

  • Лемматизация (получение нормальной формы слова)
  • Получение всех форм слова
  • Получение грамматической информации для слова (часть речи, падеж, спряжение и т.д.)

  • Изменение формы слова в соответствии с заданными грамматическими характеристиками
    Поддерживаются различные кодировки:
  • Все однобайтовые (windows-1251, iso-8859-* и т.п.)
  • Unicode кодировки — utf-8, utf-16le/be, utf-32, ucs2, ucs4
    Для работы phpMorphy использует словари. Вы можете выбрать как словари проекта AOT, http://aot.ru уже рассмотренные здесь, так и myspell. В данном проекте я использовал словари АОТ, но работал и с myspell. Исходя из задач, особой разницы не почувствовал. В словарях myspell отсутствует грамматическая информация, потому часть функций будет недоступна, но насколько это важно, зависит от ваших задач, которые вы решаете. Единственное, что нужно для работы с модулем — исходный код библиотеки и один или несколько словарей в бинарном виде. Полная инструкция лежит здесь http://phpmorphy.sourceforge.net/dokuwiki/manual, там же можно скачать саму библиотеку phpMorphy и большое количество словарей к ней

    Для установки библиотеки phpMorphy:

    1. Скачайте последнюю версию библиотеки.

    2. Распакуйте архив (к примеру, в каталог c:\php\libs\phpmorphy). Рекомендуется разместить код бибилотеки в директории недоступной web серверу. Для Apache к примеру, выше DocumentRoot.

    3. Скачайте необходимые словари. Распакуйте файл со словарями (используем c:\php\libs\phpmorphy\dicts). В c:\php\libs\phpmorphy\dicts должны находится файлы словаря т.е. common_aut.*.bin, predict_aut.*.bin и т.п.

    4. Инициализировать словари.

    // Подключите файл common.php. phpmorphy-0.3.2 — для версии 0.3.2,
    // если используется иная версия исправьте код.
    // подключаем библиотеку только однажды, в дальнейшем проверяем

    // Укажите путь к каталогу со словарями
    $dir = ‘c:/php/libs/phpmorphy/dicts’;

    // Укажите, для какого языка будем использовать словарь.
    // Язык указывается как ISO3166 код страны и ISO639 код языка,
    // разделенные символом подчеркивания (ru_RU, uk_UA, en_EN, de_DE и т.п.)

    // Укажите опции
    // Список поддерживаемых опций (полный список опций -в описании библиотеки)

    $opts = array(
    ‘storage’ => PHPMORPHY_STORAGE_FILE,
    );

    5. Создаем экземпляр класса phpMorphy

    // создаем экземпляр класса phpMorphy // обратите внимание: все функции phpMorphy являются throwable т.е. // могут возбуждать исключения типа phpMorphy_Exception (конструктор тоже)

    try <
    $morphy = new phpMorphy($dir, $lang, $opts);
    > catch(phpMorphy_Exception $e) <
    die(‘Error occured while creating phpMorphy instance: ‘ . $e->getMessage());
    >

    // далее под $morphy мы подразумеваем экземпляр класса phpMorphy

    Вот небольшой пример использования phpMorphy для определения нормальной формы слова в цикле:
    foreach($title as $t) <
    $t2=mb_strtoupper($t,’UTF-8′);
    $base2 = $morphy->getBaseForm($t2);
    $base_titl[] = $base2[0];
    >

    Метод getBaseForm берет нормальную форму слова. Также можно получить текущую форму слова, для этого используются анкоды, уже рассмотренные здесь. Перевод в слов в верхний регистр используется, так как словари работают только с такой формой написания.

    Илон Маск рекомендует:  Что такое код gzfile

    Новый модуль поиска с учетом морфологии русского языка для системы управления сайтом HostCMS v. 3.0

    Морфологический поиск — это вид информационного поиска во всех сайтах, поддерживаемых системой управления сайтом HostCMS, с учетом морфологического анализа слов запроса пользователя и контента сайтов. Новый модуль поиска значительно ускоряет внутреннюю индексацию контента, предоставляет посетителям сайтов на базе HostCMS удобное средство поиска.

    — Поиск по различным разделам сайта- Ранжирование результатов на основе веса слова по отношению к документу («контрастность слов»)- Учет стоп-слов- API для внедрения индексации в модули сторонних разработчиков

    С подробной информацией Вы можете ознакомиться на сайте http://www.hostcms.ru/

    Выпуск системы управления сайтом HostCMS v. 3.0 намечен на 1 ноября 2005 года.

    Релиз опубликован: 2005-10-31

    Основана в 2002

    Сайт компании: http://www.hostcms.ru

    Профиль деятельности: Компания «Хостмэйк» основана в апреле 2002 года (c 2005 года — ООО «Хостмэйк»), основным видом деятельности является разработка программного обеспечения. Компания имеет обширный и плодотворный опыт реализации проектов с территориально удаленными заказчиками. Наше сочетание цена и качество уникально во многом благодаря тому, что компания расположена не в столице. Для клиентов из крупных городов — это возможность получить первоклассный высокопрофессиональный результат не переплачивая лишние деньги.

    Проекты: Компания «Хостмэйк» основана в апреле 2002 года (c 2005 года — ООО «Хостмэйк»), основным видом деятельности является разработка программного обеспечения. Компания имеет обширный и плодотворный опыт реализации проектов с территориально удаленными заказчиками. Наше сочетание цена и качество уникально во многом благодаря тому, что компания расположена не в столице. Для клиентов из крупных городов — это возможность получить первоклассный высокопрофессиональный результат не переплачивая лишние деньги.

    Адрес: Россия, Контактное лицо: Дурицкая Юлия Александровна, сотрудник пресс службы, Тел.: +7 495 223-46-50

    Поиск с учётом морфологии русского языка в Joomla! 1.5

    В любой системе всегда есть что улучшать. Зачастую это вопрос «красоты», но иногда — совершенная необходимость. В этой статье я покажу, как сделать в Joomla! 1.5 нормальный поиск с поддержкой морфологии русского языка.

    Поисковые системы я разрабатываю не первый год. Даже не второй и не третий :) Поэтому имею собственное представление о правильном поиске — это создание полноценных индексов на основе документов со словами, приведёнными к канонической форме (для существительных — именительный падеж, единственное число). То есть отдельное храненое ПОДов (поисковых образов документов). Плюс к этому словари тематик для автоопределения смысла документов и измерения расстояний между кластерами тематик… Всё даже сложнее, но пока вернёмся к поиску в рассматриваемой CMS.

    Поиск в Joomla! — компромисс между простотой реализации, возможностью искать в контенте сторонних компонентов и скоростью. Для любознательных скажу, что ведётся он методом прямого перебора текстовых полей через LIKE. Без индекса. Это хорошо, когда данных мало, а памяти (и кэша процессора в частности) — много, однако для больших объёмов нужен, конечно, совсем другой подход. Но сегодня мы рассмотрим другую проблему — поиск с помощью SQL-запроса с LIKE-условием плохо работает для языков с обилием словоформ, русского в частности.

    Существует два распространённых решения проблемы учёта русской морфологии при реализации поиска:

    • приведение слов к канонической форме, например, по словарю Зализняка (менее точно, но быстро) или комбинированным способом через поиск по таблице и попытку получения канонической формы по тому же Зализняку в случае отсутствия слова в таблице (точно, но медленнее);
    • стемминг, то есть отсечение окончаний, характерных для словоформ.

    Первый способ не получится прикрутить к Joomla! в силу особенностей реализации поиска в ней, отмеченных выше: отсутствие отдельных поисковых индексов. Поэтому наш выбор падает на стемминг.

    Воспользуемся широко распространённым стеммером Портера для русского языка. Так как в Joomla! 1.5 текстовые данные хранятся в UTF-8, в коде стеммера придётся заменить вызовы некоторых стандартных функций работы со строками на методы класса JString, применяемого в Joomla! для абстракции от того, как реализована поддержка UTF-8 в php на сервере. После внесения изменений, получаем такой код:

    Создаём директорию helpers в components/com_search . Сохраняем в неё файл с указанным выше содержимым под именем rus_stemmer.php

    Теперь нужно сделать так, чтобы от слов поискового запроса отбрасывались окончания словоформ перед тем, как будет сформирован запрос к базе данных. Другими словами, нужно вставить вызов стеммера в код компонента Joomla!

    Открываем файл components/com_search/models/search.php , находим реализацию метода setSearch() класса SearchModelSearch . Изменяем код метода на следующий:

    Конечно, правильнее было бы не патчить ключевой компонент системы, а оформить подключение стеммера в качестве плагина. Но для этого необходимо наличие события вроде onSearchKeywordsPrepare и возможности модифицировать запрос в плагине. Этого пока нет, так что приходится патчить :(

    Осталось сделать так, чтобы по завершении поиска пользователю показывался исходный запрос. Не просто же так мы храним его в переменной original_keyword ! Для этого в файле components/com_search/views/search/view.html.php в самом конце заменяем одну строчку:

    Всё, наслаждаемся правильным поиском с учётом русской морфологии. Теперь важно не забывать патчить файлы после установки очередной сборки Joomla!

    Пишем поиск по сайту на PHP и MySQL

    Сегодня мы напишем собственный поиск по сайту с использованием PHP и MySQL. Первым делом рассмотрим краткий алгоритм.

    Пользователь выполняет POST запрос из формы поиска, этот запрос передается специальному скрипту-обработчику, который должен обработать поисковый запрос пользователя и возвратить результат.

    Сначала скрипт должен обработать должным образом запрос пользователя для обеспечения безопасности, затем выполняется запрос к базе данных, который возвращает в ассоциативном массиве результаты, которые должны будут выводиться на экран. Итак, приступим.

    Для начала создадим форму поиска на нужной нам странице:

    Эта форма и будет отправлять сам поисковый запрос скрипту search.php. Теперь создадим сам скрипт-обработчик.

    Естественно, данные таблиц БД нужно задать собственные. Рассмотрим, что делает эта функция. Первые 4 строчки обрабатывают запрос, чтобы он стал безопасным для базы. Такую обработку нужно делать обязательно, т. к. любая форма на Вашем сайте — это потенциальная уязвимость для злоумышленников.

    Затем идет проверка, не пустой ли запрос. Если запрос пустой, то возвращаем соответствующее сообщение пользователю. Если запрос не пустой, проверяем его на размер.

    Если поисковый запрос имеет длину менее 3 или более 128 символов, также выводим соответствующие сообщения пользователю. Иначе, выполняем запрос к базе данных, который делает выборку идентификатора страницы, ее заголовка, описания, описания ссылки, категорию, если она есть и идентификатор самой статьи, в которой найдены совпадения нужных нам полей с поисковым запросом.

    В данном случае мы делаем сравнение с текстом статьи, ее заголовком, ключевыми словами и описанием. Если ничего не найдено, выводим пользователю сообщение об этом. Если запрос возвратил хотя бы одну запись, выполняем в цикле еще один запрос, который делает выборку из таблицы со страницами ссылку на страницу, на которой находится статья.

    Если у Вас все статьи на одной странице, вы можете опустить этот шаг. После выполнения запроса при каждой итерации цикла в переменную $text Дозаписываем одну найденную статью.

    После завершения цикла, возвращаем переменную $text , Которая и будет выводиться на нашей странице пользователю.

    Теперь осталось на этой же странице search.php сделать вызов этой функции и вывести ее результат пользователю.

    Также вы можете упростить скрипт поиска по Вашему усмотрению. Желательно создать стиль в таблице css для выводимой информации, чтобы выводимая информация смотрелась более красиво и читабельно. Все замечания вопросы по скрипту можете задавать в комментариях.

  • Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL