2009-05-10 10:50:39 +03:00
|
|
|
|
<?php
|
2009-08-20 10:43:06 +03:00
|
|
|
|
require_once(Config::Get('path.root.engine').'/lib/external/Sphinx/sphinxapi.php');
|
2008-12-21 16:36:00 +02:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Модуль для работы с машиной полнотекстового поиска Sphinx
|
|
|
|
|
*
|
|
|
|
|
*/
|
2009-03-21 15:48:00 +02:00
|
|
|
|
class LsSphinx extends Module {
|
2008-12-21 16:36:00 +02:00
|
|
|
|
private $oSphinx = null;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Инициализация
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
public function Init() {
|
2010-02-04 17:39:11 +02:00
|
|
|
|
$this->InitSphinx();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected function InitSphinx() {
|
2008-12-21 16:36:00 +02:00
|
|
|
|
/**
|
|
|
|
|
* Получаем объект Сфинкса(из Сфинкс АПИ)
|
|
|
|
|
*/
|
2009-05-10 17:54:07 +03:00
|
|
|
|
$this->oSphinx = new SphinxClient();
|
2009-08-20 10:43:06 +03:00
|
|
|
|
$this->oSphinx->SetServer(Config::Get('module.search.sphinx.host'), intval(Config::Get('module.search.sphinx.port')));
|
2008-12-21 16:36:00 +02:00
|
|
|
|
/**
|
|
|
|
|
* Устанавливаем тип сортировки
|
|
|
|
|
*/
|
|
|
|
|
$this->oSphinx->SetSortMode(SPH_SORT_EXTENDED, "@weight DESC, @id DESc");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function Shutdown() {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Возвращает число найденых элементов в зависимоти от их типа
|
|
|
|
|
*
|
|
|
|
|
* @param unknown_type $sTerms
|
|
|
|
|
* @param unknown_type $sObjType
|
|
|
|
|
* @param unknown_type $aExtraFilters
|
|
|
|
|
* @return unknown
|
|
|
|
|
*/
|
|
|
|
|
public function GetNumResultsByType($sTerms, $sObjType = 'topics', $aExtraFilters){
|
|
|
|
|
$aResults = $this->FindContent($sTerms, $sObjType, 1, 1, $aExtraFilters);
|
|
|
|
|
return $aResults['total_found'];
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Непосредственно сам поиск
|
|
|
|
|
*
|
|
|
|
|
* @param unknown_type $sTerms
|
|
|
|
|
* @param unknown_type $sObjType
|
|
|
|
|
* @param unknown_type $iOffset
|
|
|
|
|
* @param unknown_type $iLimit
|
|
|
|
|
* @param unknown_type $aExtraFilters
|
|
|
|
|
* @return unknown
|
|
|
|
|
*/
|
|
|
|
|
public function FindContent($sTerms, $sObjType, $iOffset, $iLimit, $aExtraFilters){
|
|
|
|
|
/**
|
|
|
|
|
* используем кеширование при поиске
|
|
|
|
|
*/
|
2009-08-20 10:43:06 +03:00
|
|
|
|
$cacheKey = Config::Get('module.search.entity_prefix')."searchResult_{$sObjType}_{$sTerms}_{$iOffset}_{$iLimit}";
|
2010-03-06 14:02:01 +02:00
|
|
|
|
if (false === ($data = $this->Cache_Get($cacheKey))) {
|
2008-12-21 16:36:00 +02:00
|
|
|
|
/**
|
|
|
|
|
* Параметры поиска
|
|
|
|
|
*/
|
|
|
|
|
$this->oSphinx->SetMatchMode(SPH_MATCH_ALL);
|
|
|
|
|
$this->oSphinx->SetLimits($iOffset, $iLimit);
|
|
|
|
|
/**
|
|
|
|
|
* Устанавливаем атрибуты поиска
|
|
|
|
|
*/
|
2010-03-06 14:02:01 +02:00
|
|
|
|
$this->oSphinx->ResetFilters();
|
2008-12-21 16:36:00 +02:00
|
|
|
|
if(!is_null($aExtraFilters)){
|
|
|
|
|
foreach($aExtraFilters AS $sAttribName => $sAttribValue){
|
|
|
|
|
$this->oSphinx->SetFilter(
|
|
|
|
|
$sAttribName,
|
|
|
|
|
(is_array($sAttribValue)) ? $sAttribValue : array($sAttribValue)
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Ищем
|
|
|
|
|
*/
|
2009-08-20 10:43:06 +03:00
|
|
|
|
if(!is_array($data = $this->oSphinx->Query($sTerms, Config::Get('module.search.entity_prefix').$sObjType.'Index'))) {
|
2008-12-21 16:36:00 +02:00
|
|
|
|
return FALSE; // Скорее всего недоступен демон searchd
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Если результатов нет, то и в кеш писать не стоит...
|
|
|
|
|
* хотя тут момент спорный
|
|
|
|
|
*/
|
|
|
|
|
if ($data['total'] > 0) {
|
|
|
|
|
$this->Cache_Set($data, $cacheKey, array(), 60*15);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return $data;
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Получить ошибку при последнем обращении к поиску
|
|
|
|
|
*
|
|
|
|
|
* @return unknown
|
|
|
|
|
*/
|
|
|
|
|
public function GetLastError(){
|
|
|
|
|
return $this->oSphinx->GetLastError();
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Получаем сниппеты(превью найденых элементов)
|
|
|
|
|
*
|
|
|
|
|
* @param unknown_type $sText
|
|
|
|
|
* @param unknown_type $sIndex
|
|
|
|
|
* @param unknown_type $sTerms
|
|
|
|
|
* @param unknown_type $before_match
|
|
|
|
|
* @param unknown_type $after_match
|
|
|
|
|
* @return unknown
|
|
|
|
|
*/
|
|
|
|
|
public function GetSnippet($sText, $sIndex, $sTerms, $before_match, $after_match){
|
2009-08-20 10:43:06 +03:00
|
|
|
|
$aReturn = $this->oSphinx->BuildExcerpts(array($sText), Config::Get('module.search.entity_prefix').$sIndex.'Index', $sTerms, array(
|
2008-12-21 16:36:00 +02:00
|
|
|
|
'before_match' => $before_match,
|
|
|
|
|
'after_match' => $after_match,
|
|
|
|
|
)
|
|
|
|
|
);
|
|
|
|
|
return $aReturn[0];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
?>
|