На главную

RiSearch Pro v.3.2 Manual

© С. Тарасов

Расширенный поиск

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

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

Настройка

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

<META NAME="Author" CONTENT="Ivanov Ivan">
<META NAME="Subject" CONTENT="biology">
<META NAME="Date" CONTENT="22/03/1998">>

Для данного примера в конфигурационном файле нужно написать (номера атрибутов начинаются с нуля):

$attr_def[0] = [ '<META NAME="Author" CONTENT="', '">' ];
$attr_def[1] = [ '<META NAME="Subject" CONTENT="', '">' ];
$attr_def[2] = [ '<META NAME="Date" CONTENT="', '">' ];
$attr_def[3] = [ '<META NAME="Price" CONTENT="', '">' ];

Кроме того есть еще два особых атрибута:

$attr_def[4] = [ 'SIZE' ]; - размер документа.
$attr_def[5] = [ 'DATE' ]; - время последней молификации документа.

      Если в вашем случае невозможно получить значения атрибутов используя вышеописанный способ (например, они хранятся в отдельном файле), тогда вам нужно будет самим написать процедуру чтения атрибутов и заменить ею стандартную функцию lib::common_lib::get_attribute().

      Затем необходимо указать, как именно будут проиндексированны атрибуты. Возможные варианты:

  • 1 - атрибут будет проиндексирован наравне с текстом документа.
  • 2 - атрибут будет сохранен в индексе рядом с описанием документа (там же, где сохраняется заголовок, краткое описание, УРЛ), что позволит выводить его значение в результатах поиска.
  • 4 - атрибут является целым числом. Для таких атрибутов возможны операции сравнения (то есть можно искать документы, в которых данный атрибут имеет значение более 1000 и т.п.).
  • 8 - атрибут является вещественным числом. Как и для предыдущего случая возможны операции сравнения. Учтите, что индекс, созданный для данного атрибута не будет обладать переносимостью между различными платформами (хотя остальные файлы останутся переносимыми и все другие функции поиска будут работать).
  • 16 - атрибут является строкой с датой. Скрипт попытается распознать дату и перевести ее в другой формат, пригодный для сравнения. Дата может быть представлена одним из следующих видов: 23.03.98, 23/03/98, 23.03.1998, Mar 23 1998. Другие форматы могут быть добавлены при необходимости. Порядок следования числа и месяца (сначала число, затем месяц или наоборот) определяется параметром date_format в конфигурационном файле.

      Для каждого атрибута выберите желаемые варианты, просуммируйте числа и укажите их в конфиге следующим образом:

$attr_conf[0] = 1+2;
$attr_conf[1] = 1+2;
$attr_conf[2] = 1+2+16;
$attr_conf[3] = 8;
$attr_conf[4] = 4;

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

$attr_weight[0] = 2;
$attr_weight[1] = 1;
$attr_weight[2] = 0;

Язык запросов

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

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

  • Поиск в определенных атрибутах - необходимо добавить в строку запроса номера атрибутов, в которых должно содержаться заданное слово (например "&a=1&a=3", то есть аналогично поиску в зонах). Если воспользоваться предыдущими примерами, то для поиска всех статей автора по фамилии Ivanov необходимо задать следующий запрос:

    search.pl?q=ivanov&a=0

  • Если требуется найти одно слово в одном атрибуте и другое слово в другом атрибуте, это можно сделать следующим образом:

    search.pl?q0=ivanov&q1=biology - все статьи Иванова по биологии
    search.pl?q0=ivanov&q2=1998 - все статьи Иванова за 1998 год

    (если еще добавить "q=word", то это слово будет искаться во всех проиндексированных атрибутах, включая текст документа).

  • Операции сравнения для числовых атрибутов:

    • a4lt=10 - значение атрибута 4 меньше 10;
    • a4le=10 - значение атрибута 4 меньше или равно 10;
    • a4gt=10 - значение атрибута 4 больше 10;
    • a4ge=10 - значение атрибута 4 больше или равно 10;
    • a4eq=10 - значение атрибута 4 равно 10;
    • a4ne=10 - значение атрибута 4 не равно 10;

    Например, все статьи Иванова, стоимостью менее 10 USD:

    search.pl?q0=ivanov&a3lt=10

    Если в одном запросе используется несколько операций сравнения, они обрабатываются используя логику "AND", то есть "a1lt=10&a2gt=10" найдет документы, где атрибут 1 меньше 10 и атрибут 2 больше 10. Добавьте параметр "ctype=OR", чтобы изменить логику на "ИЛИ" ("a1lt=10&a2gt=10&ctype=OR").

    Для атрибутов, являющихся датой, операции сравнения записываются следующим образом:

    search.pl?q0=ivanov&a2gt=01.01.2000

    Кроме того, возможно отдельно задавать день, месяц и год, таким образом:

    search.pl?q0=ivanov&y2gt=2000&m2gt=01&d2gt=01

    В тех случаях, когда используется сравнение на равенство, можно не указывать день или месяц, скрипт сам преобразует запрос в поиск по интервалу дат, например запрос "y2eq=2000" найдет все данные за 2000-ый год, а запрос "y2eq=2000&m2eq=2" найдет все данные за февраль 2000-ного года.

Сортировка результатов

      Результаты поиска могут быть отсортированы по какому-либо атрибуту. Для этого нужно использовать параметр "s" с номером атрибута (например "search.pl?q0=ivanov&a2gt=01.01.2000&s=2"). Учтите, что сортировка по текстовому атрибуту может потребовать значительное количество времени, если поиск вернул много совпадений.

      Результаты можно сортировать сразу по нескольким атрибутам (работает только с текстовыми атрибутами). Например: "q=word&s=2_3" - результаты будут отсортрованы по второму атрибуту, а если второй атрибут совпадает у нескольких документов, то по третьему.

Печать результатов

      Значения атрибутов, в конфигурации которых был использован вариант "2" (то есть значение атрибута было сохранено в индексе) можно напечатать в результатах поиска наряду с заголовком документа, URL, кратким описанием. Для этого в шаблоне нужно вставить %attr_N%, где N - номер атрибута.



http://risearch.org С.Тарасов, © 2000-2003