За основу для начала работы возьмем класс, приведенный на одной из страниц мануала по 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() имеет 6 параметров, а не 5, как, на данный момент, указано в мануале php: 1 – ссылка на сессию mnogosearch, 2 – тип подгружаемых данных, 3 – язык, 4 – кодировка, 5 – путь к ресурсу, 6 – флаг, указывающий, нужно ли производить сортировку подргуженных данных (рекомендуется ставить его значение в 1 в самом конце, дабы не производить сортировку каждый раз)
!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_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);Чтобы получить поля – значения секций, указанных в конфиге, надо воспользоваться функцией udm_get_res_field_ex($this->res, $i, '<имя_секции>'), можно в том же цикле, проходя по каждой записи.
$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);
}
}
Веса.
Чтобы "дотюнить" свой поиск до нужных результатов вывода, надо правильно расставить веса для секций, указанных в конфиге. И, в зависимости от переданных параметров, выставлять веса. Например, если у вас 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']);
Комментариев нет:
Отправить комментарий