среда, 2 апреля 2008 г.

php frontend. начало.

Здесь я опишу основные моменты, которые послужат основой для создания php-frontend-а для зонно-атрибутивного поиска по сайту.

За основу для начала работы возьмем класс, приведенный
на одной из страниц мануала по php udm_search.

В конструкторе устанавливаются настройки по умолчанию:
соединение с БД mnogosearch

$conn = 'mysql://' . USER . ':' . PASS . '@' . HOST . '/' . DATABASE . '/?dbmode=blob';
$this -> agent = udm_alloc_agent($conn);

В моем случае была создана БД типа blob, т.к. этот режим обеспечивает самый быстрый поиск.

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

/** устанавливает параметр сессии многосерча */
public function set($k, $v) {
udm_set_agent_param($this -> agent, $k, $v);
}

/** устанавлевает дополнительный параметр сессии многосерча */
public function set_ex($k, $v) {
udm_set_agent_param_ex($this -> agent, $k, $v);
}
Далее устанавливаем значения по умолчанию для поиска по любому из слов запроса
$this -> set(UDM_PARAM_SEARCH_MODE, UDM_MODE_ANY);

Кодировку:
// локальная кодировка
$this -> set(UDM_PARAM_CHARSET, 'utf-8');
// кодировка, отображаемая в браузере
$this -> set(UDM_PARAM_BROWSER_CHARSET, 'utf-8');
Файл стоп-слов:
$this -> set(UDM_PARAM_STOPFILE, '/usr/local/mnogosearch/etc/stopwords/ru.sl');

Подружаем словари Ispell:
if (!udm_load_ispell_data($this -> agent, UDM_ISPELL_TYPE_AFFIX, 'ru', 'koi8-r', '/usr/lib/ispell/russian.aff', 0) ||
!udm_load_ispell_data($this -> agent, UDM_ISPELL_TYPE_SPELL, 'ru', 'koi8-r', '/usr/lib/ispell/russian.dict', 1)
) {
echo "Error loading ispell data from server
\n";
exit;
}
Заметьте, что udm_load_ispell_data() имеет 6 параметров, а не 5, как, на данный момент, указано в мануале php: 1 – ссылка на сессию mnogosearch, 2 – тип подгружаемых данных, 3 – язык, 4 – кодировка, 5 – путь к ресурсу, 6 – флаг, указывающий, нужно ли производить сортировку подргуженных данных (рекомендуется ставить его значение в 1 в самом конце, дабы не производить сортировку каждый раз)

Теперь непосредственно о поиске и параметрах поиска.
Все параметры, описанные на этой странице устанавливаются функцией udm_set_agent_param_ex(). Все константы, описанные здесь устанавливаются функцией udm_set_agent_param(). Т.о., если нам нужно организовать поиск по параметрам, необходимо обработать поступившие параметры из запроса и установить их значения через udm_set_agent_param_ex() или udm_set_agent_param(). Например:


udm_set_agent_param_ex($this -> agent, 'm', $get['m']); udm_set_agent_param($this -> agent, UDM_PARAM_WORD_MATCH , UDM_MATCH_SUBSTR);
Команды
mnogosearch, в зависимости от необходимости находиться в шаблоне отображения, так же устанавливаются функцией udm_set_agent_param_ex(). Помимо установки переменных сессии вышеописанным способом, можно так же в запрос mnogosearch передать дополнительные параметры, например поиск по сецкиям: Простой запрос сожердит одно слово или фразу для поиска:
$query = ‘рога и копыта’;
Запрос с дополнительными параметрами содержит так же названия секций и искомое в них слово или фраза:
$query = ‘рога и копыта author:ильф’
Т.о. в первом случае поиск будет производиться по всем секциям (в зависимости от их весов, о чем будет сказано ниже), во втором случае поиск будет производиться по всем секциям, а так же слово «ильф» будет искаться в секции author.

Функция udm_find().

В нее передается ссылка на сессию
mnogosearch и строка запроса (в данном случае $query). Возвращает ссылку на результат:
$this -> res = udm_find($this -> agent, $query);
Существуют поля по умолчанию, значения которых устанавливает данная функция:
$fields = array('urlid', 'url', 'content', 'title', 'keywords', 'desc', 'text', 'size', 'rating', 'modified', 'order', 'crc', 'category', 'lang', 'charset', 'siteid', 'pop_rank', 'originid');
После вызова udm_find() можно получить эти поля следующим образом, воспользовавшись функцией udm_get_res_field():
$this -> first = udm_get_res_param($this -> res, UDM_PARAM_FIRST_DOC);
$this -> last = udm_get_res_param($this -> res, UDM_PARAM_LAST_DOC);
$rows = $this -> last - $this -> first + 1;
$countFields = count($fields);
for($i = 0; $i < $rows; $i++){ for($j = 0; $j < $countFields; $j++) { $this->matches[$i][$fields[$j]] = udm_get_res_field($this->res, $i, $j+1);
}
}
Чтобы получить поля – значения секций, указанных в конфиге, надо воспользоваться функцией udm_get_res_field_ex($this->res, $i, '<имя_секции>'), можно в том же цикле, проходя по каждой записи.

Веса.

Чтобы "дотюнить" свой поиск до нужных результатов вывода, надо правильно расставить веса для секций, указанных в конфиге. И, в зависимости от переданных параметров, выставлять веса. Например, если у вас 30 секций, вы для каждого запроса (или без изменения) составляете строку, описывающую веса для каждой секции, порядок от первой секции к последней – справа налево, например так:
111111111111111111111111111FADA
первая секция имеет вес А, вторая D, и т.д. И устанавливаем как дополнительный параметр wf
udm_set_agent_param_ex($this->agent, ' wf', '111111111111111111111111111FADA');
Посик по категориям.

Как настраивать категории описано здесь. Для поиска категория, как параметр, выставляется при помощи функции udm_set_agent_param_ex().
udm_set_agent_param_ex ('cat', $get['cat']);