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

Содержание
8.1. Использование поисковых фронт-эндов
8.2. Модуль mod_dpsearch для Apache httpd
8.3. Как создавать шаблоны результатов поиска
8.4. Дизайн search.html
8.5. Релевантность
8.6. Регистрация поисковых запросов
8.7. Кэш результатов поиска
8.8. Нечёткий поиск

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

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

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

http://your.web.server/path/to/search.cgi

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

Чтобы найти фразу, просто заключите её в кавычки. Например: "uncontrollable sphere".

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

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

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

qтекстовый параметр, содержащий запрос на поиск
vqтекстовый параметр, содержащий поисковый запрос на языке Verity Query Language (префиксный вариант), см Разд. 8.1.8>. Чтобы использовать этот параметр, необходимо омтавить пустым параметр q.
sстрока символов, задающая порядок сортировки результатов поиска. Порадок сортировки задаётся слева направо. Большая буква соответсвует сортировке по убыванию, маленькая - по возрастанию. Возможные символы: R или r - сортировка по релевантности, P или p - сортировка по PopularityRank, I или i - сортировка по важности (произведению релевантности и PopularityRank), A или a - сортировка по сумме релевантности и PopularityRank, D или d - сортировка по дате последнего изменения документа. Значение по умолчанию: RP.
psчисло результатов поиска, отображаемых на одной странице, 20 по умолчанию. Максимальное значение равно 100. Это ограничение введено во избежание излишней перегрузки сервера и может быть изменено заменой значения MAX_PS в файле search.c.
npномер страницы начиная с 0, 0 по умолчанию (первая страница)
pномер страницы начиная с 1, для использования с OpenSearch
mРежим поиска. На данный момент поддерживаются значения all, any, near и bool.
wmСовпадение слова. Вы можете использовать этот параметр для указания способа совпадения слов. Зачения wrd, beg, end и sub соответственно обозначают целое слово, начало слова, окончание слова и подстрока слова.
tЛимит по тэгу. Задаёт поиск только среди документов, помеченых указаным тэгом. Этот параметр имеет то же значение, что и ключ -t у indexer.
cЛимит по категории. См. Разд. 6.2> для описания.
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.
Не поддерживается для способа хранения cache.
wfЗначения весов. Позволяет изменить значения весов различных секций документов во аремя поиска. Значение должно представлять из себя строку шестнадцатеричных чисел. См. обяснение ниже в Разд. 8.1.3>.
g или langЛимит по языку. Стандартный двубуквенный код языка по ISO, для ограничения поиска по полю url.lang.
tmpltИмя файла шаблона (без пути). Для указания имени файла шаблона, отличного от стандартного search.htm.
typeЛимит по Content-Type. Для способа хранения cache должно быть точное соответсвие. Для SQL-режимов возможно использование шаблонов SQL.
spОграничение использования словоформ. =1, если необходим поиск по всем словоформам (включая корректировку правописания, если включена поддержка aspell) введённых слов. =0, если необходим поиск только введенных форм слов. Значение по умолчанию равно 1. Вы можете указать значение 0 для ускорения поиска.
syОграничение использования синонимов. =1, если необходимо использовать синонимы введённых слов. =0, не использовать синонимы. Значение по умолчанию равно 1. Вы можете указать значение 0 для ускорения поиска.
emptyИспользовать ли лимиты для вывода результатов, если не задано ни одного слова в запросе. =yes, использовать лиминты для вывода результатов, если не задано ни одного слова в запросе (по умолчанию). =no, не использовать.
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 - четырёхцифровой год.

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

Параметр 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. Если число секций, указанных в wf, меньше числа определенных секций, то для всех оставшихся секций устанавливается вес, равный весу секции с макимальным номером из wf. Т.е.:

   wf=01 также ищет только по секции body.

Если DataparkSearch собирается с быстрым вариантом расчёта релевантности (указана опция --enable-rel=fast для configure), в этом случае только нулевое или ненулевое значение веса имеет смысл (это позволяет только включать/исключать заданные секции из результатов поиска). Чтобы использовать полную поддержку динамических весов секций, необходимо задать опцию --enable-rel=full для configure во время сборки DataparkSearch.

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

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

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

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

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

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

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

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

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

  3. search.cgi проверяет path info часть URL, доступную через переменную окружения PATH_INFO. Например, http://localhost/cgi-bin/search.cgi/search1.html в качестве шаблона использует search1.htm, а http://localhost/cgi-bin/search.cgi/search2.html использует search2.htm, и т.д.

  4. 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.

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

    См. также Разд. 7.2>

8.1.6. Операторы происка

Оператор allin<section>:, где <section> - имя любой секции, определенной в файле конфигурации sections.conf (или командами Section в indexer.conf или в search.htm/searchd.conf) и имеющей ненулевой номер секции (см. Разд. 3.10.43>), позволяет ограничить область поиска указываемого слова в поисковом запросе только заданой секцией.

От ограничения поиска по секциям при помощи CGI-параметра &wf= отличается тем, что ограничение действует только на слова поискового запроса, указываемые после данного оператора.

Например, если sections.conf содержит команды

 
Section body 1 256
Section title 2 128
Section url 3 0 strict
то в поисковом запросе можно использовать операторы allinbody:, allintitle: и allinurl:.

По запросу computer allintitle: science будут найдены документы, содержащие слово "science" в заголовке и слово "computer" в любой секции документа.

8.1.7. Булев поиск

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

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

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

NEAR - Оператор NEAR принимает истиное значение если оба слова находятся не далее, чем в 16 словах друг от друга. Например, mysql NEAR odbc. DataparkSearch будет искать URL, содержащие оба слова "mysql" и "odbc", расположеные на расстоянии не далее 16 слов друг от друга.

ANYWORD или * - Оператор ANYWORD аналогичен оператору И, но принимает истиное значение, если между обеими словами находится одно любое слово и левый операнд имеет меньшую позицию, нежели правый. Например, "mysql * odbc" - DataparkSearch найдёт все документы, содержащие оба слова "mysql" и "odbc", и меющие любое слово между ними, например, документы с фразой "mysql via odbc".

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

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

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

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

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

8.1.8. Язык запросов Verity Query Language, VQL

DataparkSearch поддерживает только префиксный вариант Verity Query Language.

Также поддерживается только следующее подмножество операторов VQL:

Таблица 8-2. Операторы VQL, поддерживаемые DataparkSearch

<ACCRUE>эквивалентен оператору OR булевого запроса.
<AND>эквивалентен оператору AND булевого запроса.
<ANY>эквивалентен оператору OR булевого запроса.
<NEAR>эквивалентен оператору NEAR булевого запроса.
<NOT>эквивалентен оператору NOT булевого запроса.
<OR>эквивалентен оператору OR булевого запроса.
<PHRASE>эквивалентен фразе в булевом запросе.
<WORD>рассматривается как пустой оператор.

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

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