Глава 8. Поиск документов

Содержание
Использование поисковых фронт-эндов
Как создавать шаблоны результатов поиска
Дизайн search.html
Релевантность
Регистрация поисковых запросов
Кэш результатов поиска
Нечёткий поиск

Использование поисковых фронт-эндов

Осуществление поиска

Откройте предпочитаймый вами фронт-энд в окне броузера:


http://your.web.server/path/to/search.cgi
или
http://your.web.server/path/to/search.php3

Чтобы найти что-то, просто наберите слова, которые хотите найти и нажмите кнопку ОТОСЛАТЬ. Например, "mysql odbc". Вы не должны использовать кавычки " в запросе, они записаны только чтобы отделить запрос от остального текста. mnoGoSearch найдет все документы, содержащие слово "mysql" и/или слово "odbc". Лучшие документы, имеющий более высокую релевантность и популярность будут показаны первыми.

Параметры поиска

Фронт-энды mnoGoSearch поддерживают следующие параметры, указываемыме в CGI-запросе. Вы можете использовать их в HTML форме на странице поиска.

Таблица 8-1. Параметры поиска

qтекстовый параметр, содержащий запрос на поиск
sстрока символов, задающая порядок сортировки результатов поиска. Порадок сортировки задаётся слева направо. Большая буква соответсвует сортировке по убыванию, маленькая - по возрастанию. Возможные символы: R или r - сортировка по релевантности, P или p - сортировка по PopularityRank, D или d - сортировка по дате последнего изменения документа. Значение по умолчанию: RP.
ps число результатов поиска, отображаемых на одной странице, 20 по умолчанию. Максимальное значение равно 100. Это ограничение введено во избежание излишней перегрузки сервера и может быть изменено заменой значения MAX_PS в файле search.c.
npномер страницы, 0 по умолчанию (первая страница)
mРежим поиска. На данный момент поддерживаются значения all, any и bool.
wmСовпадение слова. Вы можете использовать этот параметр для указания способа совпадения слов. Зачения wrd, beg, end и sub соответственно обозначают целое слово, начало слова, окончание слова и подстрока слова.
tЛимит по тэгу. Задаёт поиск только среди документов, помеченых указаным тэгом. Этот параметр имеет то же значение, что и ключ -t у indexer.
catЛимит по категории. См. Разд. Категории в Гл. 6 для описания.
ulЛимит по URL, подстрока URL для ограничения поиска по части базы. Поддерживаются SQL шаблоны % и _. Этот параметр имеет тот же эффект, что и ключ -u у indexer. Если указан неабсолютный URL, search.cgi дообавит знаки % до и после значения этого параметра, если используется SQL база данных для хранения информации. Например, <OPTION VALUE="/manual/"> а не VALUE="%/manual/%". Если указан полный URL (с указанием схемы)б search.cgi добавляет знак % только после значения этого параметра. Например, для <OPTION VALUE="http://localhost/"> search.cgi передаст http://localhost/% в оператор SQL LIKE.
wfЗначения весов. Позволяет изменить значения весов различных секций документов во аремя поиска. Значение должно представлять из себя строку шестнадцатеричных чисел. См. обяснение ниже в Разд. Изменение весов различных частей документов во время поиска.
g или langЛимит по языку. Стандартный двубуквенный код языка по ISO, для ограничения поиска по полю url.lang.
tmpltИмя файла шаблона (без пути). Для указания имени файла шаблона, отличного от стандартного search.htm.
typeЛимит по Content-Type. Для способа хранения cache должно быть точное соответсвие. Для SQL-режимов возможно использование шаблонов SQL.
spОграничение использования словоформ. =1, если необходим поиск по всем словоформам введённых слов. =0, если необходим поиск только введенных форм слов. Значение по умолчанию равно 1.
syОграничение использования синонимов. =1, если необходимо использовать синонимы введённых слов. =0, не использовать синонимы. Значение по умолчанию равно 1.
dt Ограничение по времени. Поддерживается три типа.

Если dt равно back, это означает, что вы хотите ограничить результаты поиска по давности. Давность ограничивается параметром dp.

Если dt равно er, это означает, что поиск поиск будет ограничен страницами старше или новее указаной даты. Старше/новее задаётся параметром dx. Дата задаётся параметрами dm, dy, dd.

Если dt равно range, обозначает, что поиск будет ограничен двумя датами, начала и конца. Даты задаются двумя параметрами, соответственно db и de.

dpОграничение по давности, если значение dt равно back. Задаётся в формате xxxA[yyyB[zzzC]]. Пробелы допускаются между xxx и A и yyy и т.д.). xxx, yyy, zzz - суть числа (могут быть негативными!), A, B, C могут быть одним из следующего (буквы такие же как в функциях strptime/strftime): s - секунда, M - минута, h - час, d - день, m - месяц, y - год. Примеры:

  4h30m 	  - 2 часа и 30 минут
  1Y6M-15d        - 1 год и шесть месяцев минус 15 дней
  1h-60m+1s       - 1 час минус 60 минут плюс 1 секунда
dxФлаг старше/новее, если значение dt равно er. =1 - новее. =-1 - старше.
dmМесяц даты, если значение dt равно er. 0 - январь, 1 - февраль, ... 11 - декабрь.
dyГод даты, если значение dt равно er. Четыре цифры. Например, 1999 или 2001.
ddДень даты, если значение dt равно er. 1...31.
dbНачальная дата интервала, если значение dt равно range. Дата указывается как строка в формате dd/mm/yyyy, где dd - день, mm - месяц, а yyyy - четырёхцифровой год.
deКонечная дата интервала, если значение dt равно range. Дата указывается как строка в формате dd/mm/yyyy, где dd - день, mm - месяц, а yyyy - четырёхцифровой год.

Изменение весов различных частей документов во время поиска

Параметр wf, передаваемый в search.cgi задаёт веса для различных секций документов. См. раздел "Section" в файле indexer.conf-dist.

Для использования этой возможности необходимо иметь уникальные ID для различных секций документов, указываемых в командах Section файла конфигурации indexer.conf command. На данный момент поддерживается до 256 различных секций.

Предположим, что в indexer.conf определены следующие секции:


  Section body        1  256
  Section title       2  128
  Section keywords    3  128
  Section description 4  128

Значение wf - строка шестнадцатиричных цифр ABCD. Каждая цифра - вес соответствующей секции документа. Самая правая цифра соответсвует секции 1. Для указанной выше конфигурации секций:


      D - вес для секции 1 (body)
      C - вес для секции 2 (title)
      B - вес для секции 3 (keywords)
      A - вес для секции 4 (description)

Примеры:


   wf=0001 поиск только по секции body.

   wf=1110 поиск по секциям title,keywords,desctription, но не по секции body.

   wf=F421 поиск по:
          Description с весом 15  (F hex)
          Keywords с весом 4
          Title с весом  2
          Body с весом 1

По умолчанию, все секции имеют вес 1.

Использование фронт-энда на страницах с SSI

При сипользовании динамических shtml страниц, содержащих SSI вызов search.cgi, т.е. search.cgi не вызывается напрямую как CGI программа, необходимо отвергнуть переменную окружения SCRIPT_NAME, т.к. все ссылки на страницах поиска должны вести на динамическую страницу, а не на search.cgi.

Например, если shtml страница содержит строку <--#include virtual="search.cgi">, переменная SCRIPT_NAME будет указывать на search.cgi, а не на shtml страницу.

Для возможности отказа от использования переменной SCRIPT_NAME, мы ввели переменную UDMSEARCH_SELF, которую вам необходимо добавить в конфигурацию сервера Apache httpd.confsearch.cgi сначала проверяет переменную UDMSEARCH_SELF и только потом, при неудаче SCRIPT_NAME. Вот пример использования переменной окружения UDMSEARCH_SELF при помощи команд конфигурирования сервера Apache SetEnv/PassEnv:


SetEnv UDMSEARCH_SELF /path/to/search.cgi
PassEnv UDMSEARCH_SELF

Использование нескольких шаблонов

Зачастую необходимо использовать несколько различных шаблонов с одним и тем же search.cgi. Существует несколько способов сделать это. Они указываются ниже в том порядке, в каком search.cgi определяет имя шаблона:

  1. search.cgi проверяет CGI параметр tmplt. Таким образом вы можете задать имя файла нужного шаблона в этом параметре.

  2. search.cgi проверяет переменную окружения UDMSEARCH_TEMPLATE. Таким образом вы можете установить путь до нужного шаблона в этой переменной.

  3. search.cgi также поддерживает внуттрений релирект Apache. Он проверяет переменных окружения REDIRECT_STATUS и REDIRECT_URL. Для использования этого способа указания шаблона, необходимо добавить следующие строчки в файл конфигурации Apache httpd.conf:

    
               AddType text/html .zhtml
                   AddHandler zhtml .zhtml
                   Action zhtml /cgi-bin/search.cgi
                   

    Поместите search.cgi в вашу /cgi-bin/ директорию. Затем поместите HTML-шаблон на вашем сервере с расширением .zhtml, например, template.zhtml. Теперь вы можете открыть страницу поиска: http://www.site.com/path/to/template.zhtml Конечно, вы можете использовать любое свободное расширение вместо .zhtml.

  4. Если два предыдущих способа не помогли определить имя шаблона, search.cgi откроет шаблон с тем же именем, что и выполняемая CGI-программа, имя которой указано в переменной окружения SCRIPT_NAME. Т.е. search.cgi бужет использовать шаблон ETC/search.htm, search1.cgi будет использовать шаблон ETC/search1.htm и т.д., где ETC - /etc директория mnoGoSearch (обычно это /usr/local/mnogosearch/etc). Таким образом вы можете использовать без перекомпиляции тот же самый search.cgi с различными шаблонами. Просто создайте несколько линков на search.cgi с различными именами, соответствующими нужным шаблонам в директории /etc mnoGoSearch.

    См. также Разд. Создание многоязычных страниц поиска в Гл. 7

Булев поиск

Для задания более сложных запросов, вы можете строить булевы запросы поиска. Необходимо в поисковой форме указать режим поиска bool.

mnoGoSearch понимает следющие булевы операторы:

& - логическое И. Например, mysql & odbc. mnoGoSearch будет искать URL, содержащие оба слова "mysql" и "odbc". Вы также можете использовать знак + для этого оператора.

| - логическое ИЛИ. Например, mysql|odbc. mnoGoSearch будет искать URL, содержащие или слово "mysql" или слово "odbc".

~ - логическое НЕ. Например, mysql & ~odbc. mnoGoSearch будет искать URL, содержащие слово "mysql" и в тоже время не содержащие слово "odbc". Обратите внимание, что ~ всего лишь исключает некоторые документы из результата поиска. Запрос "~odbc" ничего не найдёт!

() - оператор группирования для создания более сложных запросов поиска. Например, (mysql | msql) & ~postgres.

" - оператор выделения фраз. Например, "russian apache" & "web server". Вы также можете использовать знак ' для этого оператора.

Язык запросов хоть и прост, но достаточно мощный. Рассматривайте такой запрос как обычное булево выражение.

Как используются при поиске устаревшие документы

Устаревшие документы продолжают включаться в результаты поиска по их старому содержимому до тех пор, пока эти документы не будут удалены или обновлены с очередным переиндексированием.