Рубрика:
Веб /
Веб-технологии
|
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|
АНДРЕЙ САПРОНОВ
Поисковая система своими руками
Данная статья о том, как очень просто и быстро настроить службу индексирования (MS Indexing Service) для работы с интернет-сервером IIS (MS Internet Information Services). Рассматриваемые в статье методы и приемы могут быть применены ко всем версиям Windows, начиная c Windows 2000. Эта информация может быть полезна тем, перед кем встала задача организовать поиск по веб-сайту или по файловым серверам в локальной сети.
Очень многим системным администраторам задача организации поиска представляется достаточно сложной. Они считают, что для этого необходимо писать какие-то скрипты, поисковые движки и прочее. Ничего этого не нужно. Для понимания материала (а соответственно для организации поиска) вам понадобятся самые элементарные знания по HTML и функционированию веб-сервера IIS. Почему все так просто. Дело в том, что корпорация Microsoft в составе своих операционных систем имеет стандартное средство для реализации подобных задач – службу индексирования (далее СИ). Эта служба появилась в операционных Windows достаточно давно – начиная с Windows NT 4.0.
В периодической печати и сети имеется большое количество материала, знакомящего пользователя с данной службой. Поэтому, чтобы не повторяться, я дам лишь ссылки на подобные статьи:
Еще одним источником информации об этой службе для вас может стать встроенная справка. Здесь же следует отметить, что подавляющее большинство встреченных мною источников процентов на 80 повторяют информацию, приведенную в справке. Далее я буду полагать, что читатель либо ознакомился с приведенными материалами, либо имеет общие понятия об архитектуре и принципах функционирования СИ.
Со своей стороны я сделаю небольшое резюме по архитектуре и функциональным возможностям СИ.
Краткое описание службы индексирования
СИ является стандартным компонентом. Основными задачами этой службы являются индексирование и организация поиска в указанных пользователем каталогах.
Параметры службы, включая расположение индексируемых данных, можно указать в консоли управления компьютером, оснастке «Служба индексирования».
По умолчанию служба может индексировать (а следовательно, осуществлять быстрый поиск) следующие виды файлов: HTML, все документы MS Office, сообщения MIME. Этого вполне достаточно для веб-сайта. Однако если вам необходима большая функциональность вашего поисковика, то СИ может индексировать файлы, для которых имеются специальные фильтры (т.н. IFilter). Фильтр представляет собой dll-библиотеку, которая реализует интерфейс IFilter для определенного типа файлов. Вы можете сами разработать подобную программу или же взять готовую. Последних существует достаточно много. Вот некоторые:
СИ позволяет индексировать документы, находящиеся на локальной машине и на любом доступном удаленном узле.
Запросы к СИ могут осуществляться на различном логическом уровне (OLE, ADO, ISAPI расширения) и при помощи различных средств разработки (C++, VB, VBS, JS). В простейшем случае запрос на поиск можно выполнить из оснастки СИ в меню «Опрос каталога».
При помощи оснастки «Производительность» можно оценить (как локально, так и удаленно) работу СИ по множеству параметров. Вот наиболее интересные из них: размер индекса, число активных пользователей, число запросов (рис. 1).
Рисунок 1
IIS и Служба индексирования
Буду считать, что у вас установлен и запущен сервер IIS, а СИ настроен на индексацию и поиск нужных вам папок.
По умолчанию CИ индексирует содержимое вашего веб-узла.
Для поиска пользователю, как минимум, необходима форма для ввода запросов (например, как стандартная, показанная выше). Форму для запроса, а вместе с ней и методы доступа к СИ можно реализовать двумя путями: ASP или HTML.
В статье я буду рассматривать второй путь. Причин тому две. Во-первых, он на порядок проще как для понимания, так и для реализации. А во-вторых, очень подробные примеры на ASP имеются в Platform SDK и MSDN.
Кроме того, пример формы и запросов на поиск присутствуют в стандартной поставке IIS: Windows\help\iisHelp\ iis\misc\search.asp и Windows\help\iisHelp\iis\misc\query.asp соответственно. Эти примеры имеют подробные комментарии на русском языке.
В случае с HTML форма будет очень простой и до боли знакомой (рис. 2).
Рисунок 2
В HTML это выглядит примерно так.
Листинг 1. search.html – форма для ввода запроса пользователя
<HTML>
<HEAD>
<TITLE>Простая форма для поиска</TITLE>
</HEAD>
<BODY>
<!--Указываем на ссылку, на вход которой пойдут
параметры формы… -->
<FORM ACTION="search.idq" METHOD="GET" ID="Form1">
<!--…а параметр один - строка запроса -->
Я ищу: <INPUT TYPE="TEXT" NAME="CiRestriction" SIZE="30" MAXLENGTH="100" VALUE="" ID="Text1">
<!--Кнопка -->
<INPUT TYPE="SUBMIT" VALUE="Поиск" ID="Submit1" NAME="Submit1">
</FORM>
</BODY>
</HTML>
Файл search.idq является скриптом, который содержит всю необходимую информацию для запроса к СИ посредством ISAPI (Internet Server Application Programming Interface) расширения idq.dll. Для того чтобы IIS распознавал этот текстовый файл как скрипт в свойствах вашего веб-узла, на вкладке «Домашний каталог» нужно нажать кнопку «Настройка…» и сопоставить файлам с расширением *.idq фильтр Windows\System32\idq.dll.
Рисунок 3
Также необходимо, чтобы idq-файл находился в папке, имеющей право на исполнение скриптов (сценариев). После этого IIS будет обрабатывать IDQ (Internet Data Query) файлы так, как мы этого хотим. А хотеть мы можем примерно следующим образом:
Листинг 2. search.idq – скрипт для запроса на поиск
# [Query] – обязательная секция для idq-файла
[Query]
# возможные поля для отображения в результатах поиска
# имя файла, размер, релевантность, описание, полный путь,
# заголовок документа, дата последней модификации
CiColumns=filename, size, rank, characterization, vpath, DocTitle, write
# строка запроса (сужения) – то, что хочет найти пользователь
CiRestriction=%CiRestriction%
# максимально возможное количество документов
CiMaxRecordsInResultSet=100
# число найденных документов на страницу
CiMaxRecordsPerPage=10
# каталог(и) для поиска (относительно корневой папки веб-узла)
CiScope=/DaT, /
# DEEP указывает, что поиск идет во всех подкаталогах
# каталогов из CiScope
CiFlags=DEEP
# шаблонная страница для отображения результатов поиска
CiTemplate=/search.htx
# порядок сортировки найденных документов (здесь по уменьшению релевантности)
# d - уменьшение признака, a - увеличение
CiSort=rank[d]
Как видно, формат файла довольно прост: Переменная = Значение.
Небольшие комментарии относительно некоторых переменных:
- CiRestriction – строка запроса. В данном случае принимает значение переменной %CiRestriction% из файла search.html (см. Листинг 1). Параметры, передаваемые в idq-файл, обрамляются с двух сторон знаками процента. Если хотите, можете передать больше параметров. Например, количество записей на страницу поиска.
- CiSort – признак для сортировки результатов. В этой переменной можно указать любое поле из заданных в CiColumns (доступно около 60 различных полей). Данный параметр можно также сделать настраиваемым пользователем;
- CiTemplate – ссылка на шаблонный htx-файл (HTML extension) для отображения результатов запроса;
- CiFlags – указывает на необходимость обхода всех вложенных папок. Можно использовать для поиска только в указанных папках без обхода всех их подкаталогов. Тогда CiFlags должен быть равен SHALLOW.
В приведенном выше примере использованы далеко не все параметры для запроса. За полным перечнем свойств рекомендую обратиться к MSDN.
HTX
Файл htx является не чем иным, как HTML-страницей. Однако помимо тегов HTML в этом файле доступны специфические идентификаторы, относящиеся к СИ и являющиеся специфичными для введенного пользователем запроса. Эти переменные (идентификаторы), как и в idq-файле, обрамляются c обеих сторон знаком процента + знаки больше и меньше – слева и справа, как у тегов.
Например, имя файла текущей записи находится в переменной <%filename%>. Именно эти идентификаторы позволят вам определить количество найденных документов, их ранг, расположение, а также все остальные параметры. Вместо htx-расширения вы можете без ограничений использовать стандартное расширение html. Предлагаю рассмотреть пример шаблонной страницы, которая представит пользователю результаты поиска.
Листинг 3. search.htx – шаблонная страница для представления результатов поиска
<!--Новый поиск. Применяется возможность подключения
файлов -->
<%include /search.html%>
<HR width="100%" SIZE="1">
<!--в случае если нет никаких документов, т.е.
CiMatchedRecordCount==0, -->
<!--где CiMatchedRecordCount – число найденных документов -->
<%if CiMatchedRecordCount eq 0%>
<H4> Не найдено документов, соответствующих запросу "<%CiRestriction%>". </H4>
<%else%>
<!--Если что-то нашли, то указываем номер начальной и
конечной записи на странице -->
<H4>Документы с <%CiFirstRecordNumber%> по <%CiLastRecordNumber%> из <%CiMatchedRecordCount%> соответствующих запросу "<%CiRestriction%>". </H4>
<%endif%>
<!--%begindetail% выводит записи о найденных документах
с текущей %CiCurrentRecordNumber% -->
<!--до %CiCurrentRecordNumber%+%CiMaxRecordsPerPage%
записи -->
<%begindetail%>
<!--Не забывайте, что клиент получит комментарии
из этой секции много-много раз -->
<br>
<%CiCurrentRecordNumber%>.
<b><a href="<%vpath%>"><%filename%></a></b>
<b><i>Описание: </i></b><%characterization%><br>
<!--выводим релевантность, точную ссылку, размер,
и дату последней модификации -->
<font size=-1 color=DarkGreen> <%rank%> - <%vpath%> - размер <%size%> байт - <%write%> GMT</font>
<br>
<%enddetail%>
<!--Конструируем кнопки для перемещения между страницами
поиска -->
<!--Если в выведенных записях нет первой, значит, можно
вернуться назад, -->
<!--т.е. отображаем кнопку "Предыдущая" -->
<%if CiContainsFirstRecord eq 0%>
<!--Передаем уже знакомому скрипту параметры сдвинуться
на %CiMaxRecordsPerPage% записей назад -->
<!--от первой записи на странице %CiBookmark%>
<FORM ACTION="search.idq" METHOD="GET">
<INPUT TYPE="HIDDEN" NAME="CiBookmark" VALUE="<%CiBookmark%>" >
<INPUT TYPE="HIDDEN" NAME="CiBookmarkSkipCount" VALUE="-<%CiMaxRecordsPerPage%>" >
<!--если на предыдущей странице вам не нужно
значение %CiRestriction%, то можно-->
<!--обойтись и без этой строки-->
<INPUT TYPE="HIDDEN" NAME="CiRestriction" VALUE="<%CiRestriction%>" >
<INPUT TYPE="SUBMIT" VALUE="Предыдущая">
</FORM>
<%endif%>
<!--Аналогично поступаем с кнопкой "Следующая" -->
<%if CiContainsLastRecord eq 0%> -->
<FORM ACTION="search.idq" METHOD="GET">
<INPUT TYPE="HIDDEN" NAME="CiBookmark" VALUE="<%CiBookmark%>" >
<INPUT TYPE="HIDDEN" NAME="CiBookmarkSkipCount" VALUE="<%CiMaxRecordsPerPage%>" >
<INPUT TYPE="HIDDEN" NAME="CiRestriction" VALUE="<%CiRestriction%>" >
<INPUT TYPE="SUBMIT" VALUE="Следующая">
</FORM>
<%endif%>
Тегами <%begindetail%>…<%enddetail%> результат запроса разделяется на страницы с числом записей на каждой странице, равным <%CiMaxRecordsPerPage%>», задаваемым в idq-файле. Думаю, назначение остальных тегов ясно из текста программы.
Кроме тегов-переменных, к результатам поиска применимы условные переходы <% if %>…<% else %>…<% endif %> и логические операторы: EQ (равенство), NE (неравенство), LT/GT (меньше/больше), LE/GE (меньше/больше либо равно), CONTAINS (содержание одной строки в другой), ISTYPEEQ (принадлежность определенному типу).
Файлы htx поддерживают возможность подключения внешних html/htx-файлов (см. Листинг 3) при помощи директивы <%include filename%>. Подключать можно не более 31 файла, включая вложенные.
В этом примере для вывода информации о найденном документе использовано свойство документа %Characte-rization% – краткое описание (аннотация). Это описание автоматически генерируется СИ при индексировании документов. Если вы хотите, чтобы оно генерировалось, то это нужно указать в свойствах СИ на вкладке «Генерация» – «Генерировать аннотации». Там же можно указать размер аннотации.
В исходном HTML-коде были использованы комментарии. Необходимо помнить, что они, в отличие от кода, отвечающего за форматирование, передаются клиенту. Это может быть плохо и с позиции увеличения трафика (здесь идет многократное повторение, что может быть весьма ощутимо), и с позиции конфиденциальности.
Можно сказать, что в минимальном варианте мы имеем рабочую и достаточно функциональную поисковую систему. На следующем рисунке представлена третья страница с результатами поиска на запрос «Производительность & IIS» (рис. 4).
Рисунок 4
Hit-Highlighting
Традиционно в поисковых системах возможно отображение тех частей текста, где встречаются искомые слова или фраза. В СИ эту возможность фирма Microsoft назвала Hit-Highlighting. Для этого используется еще один вид скриптов – htw. Как и в случае с idq-скриптами, нужно «научить» IIS распознавать файлы htw как файлы сценария. Это делается тем же способом, который мы применяли по отношению к idq-файлам (см. выше).
Нужно сопоставить файлам с расширением htw ISAPI-фильтр – библиотеку Windows\system32\webhits.dll. После этого IIS при запросе «somefile.htw?параметры» сгенерирует страницу с результатами «подсветки». Самый элементарный запрос может иметь вид:
null.htw?CiWebhitsFile=pageforhighlight.html&CiRestriction=IIS
В этом запросе два обязательных параметра (все параметры указываются поочередно через знак амперсанда):
- CiWebhitsFile – указывает на файл, для которого мы хотим сделать выделение участков текста.
- CiRestriction – строка запроса. Это как раз та самая фраза, по которой и будет происходить отбор. В показанном запросе будут выделены все части текста из файла pageforhighlight.html, содержащие слово IIS.
Кроме основных параметров, существуют и дополнительные. Практически все они направлены на изменение вида отображаемого текста. Вы можете сделать выделенные слова жирными (CiBold), наклонными (CiItalic), указать цвет подсветки (CiHiliteColor).
Параметр CiHiliteType при передаче ему значения Full выводит не куски страницы, а всю ее целиком, подсвечивая искомые слова.
Файл null.htw является абстрактным файлом и служит указанием серверу для форматирования документа по умолчанию. В документации сообщается, что этот файл может и не существовать, однако без него IIS выдает стандартную ошибку – 404. После создания ничего не содержащего файла с таким именем все становится на свои места. Этот файл должен располагаться в папке, имеющей права на исполнение сценариев.
Показанный в листинге 3 пример можно дополнить ссылкой «подробней», которая и покажет найденные в тексте слова. Сделаем ее красным цветом. В секцию <%begin-detail%>…<%enddetail%> необходимо вставить следующий код:
Листинг 4. Ссылка на подробный отчет о совпадениях в документе
<!--ссылка на документ, содержащий части текста,
которые окружают искомую фразу -->
<a href="Null.htw?CiWebhitsFile=<%escapeURL vpath%>&CiRestriction=<%escapeURL CiRestriction%> ">
<font size=-1 color=Red> подробней </font> </a>
Здесь следует обратить внимание на ключевое слово <%EscapeURL%>. Это необходимо для приведения запросов к стандартному виду. Например, запрос на поиск всех документов с расширением doc «@filename=*.doc» в качестве параметра должен быть передан в виде «%40file-name=%2A.doc», а использованный несколько выше запрос «Производительность & IIS» будет заменен на:
“%EF%F0%EE%E8%E7%E2%EE%E4%E8%F2%E5%EB%FC%ED%EE%F1%F2 %FC%20%26%20IIS”
Похожее назначение и у ключевого слова <%Escape-HTML%>: он заменяет значимые в HTML символы на их аналоги. Таким образом, символ «<» будет заменен на «<».
Несколько слов о формате запросов
Правила, формат, примеры запросов для поиска исчерпывающе представлены во встроенной справке СИ. Руководство написано на удивление хорошо и понятно.
Заключение
Надеюсь, что я убедил вас в простоте организации поиска. Ведь можно организовать очень функциональный поиск при помощи одной HTML-страницы и двух маленьких скриптов.
За формальным описанием ключевых параметров и констант советую обратиться к MSDN (msdn.microsoft.com) и к примерам из Platform SDK.
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|