Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Aggregate functions (SUM(), MIN(), MAX(), COUNT(), and so forth)
DISTINCT
GROUP BY
HAVING
LIMIT
UNION or UNION ALL
Subquery in the select list
Refers only to literal values (in this case, there is no underlying table)$sphinx->select('@weight*priority as relevance')
->matchingMode(sphinx::matchExtended2)
->sortingMode(sphinx::sortExtended, 'relevance DESC');$oSphinxClient->SetGroupBy("id_price_group", SPH_GROUPBY_ATTR, "@count desc" );
public function AllPriceGrouped()
{
if ($this->sQuery) {
require(SERVER_PATH.'/lib/sphinx/sphinxapi.php');
$sSphinxKeyword=$this->GetSphinxKeyword($this->sQuery);
$oSphinxClient = new SphinxClient();
$this->SetDefaultSetting($oSphinxClient);
$oSphinxClient->SetGroupBy("id_price_group", SPH_GROUPBY_ATTR, "@count desc" );
$aResult = $oSphinxClient->Query($sSphinxKeyword, 'price_group');
Base::$sText.=$sSphinxKeyword."
";
if ( $aResult === false ) {
Base::$sText.="Query failed: ".$oSphinxClient->GetLastError()."
";
}
else {
if ($oSphinxClient->GetLastWarning() ) {
Base::$sText.="WARNING: ".$oSphinxClient->GetLastWarning()."
";
}
if ($aResult['matches']) {
$sPriceGroupAssoc=Db::GetAssoc('Assoc/PriceGroup',array(
'visible'=>1,
'multiple'=>1,
));
foreach ($aResult['matches'] as $aValue){
$PriceGroupRow=$sPriceGroupAssoc[$aValue['attrs']['id_price_group']];
if ($PriceGroupRow) {
$PriceGroupRow['total_found']=$aValue['attrs']['@count'];
$PriceGroupRow['price_group']=$PriceGroupRow;
$PriceGroupRow['price_group']['id']=$aValue['attrs']['id_price_group'];
$aResultPriceGroup[]=$PriceGroupRow;
}
}
Base::$tpl->assign('aResultPriceGroup',$aResultPriceGroup);
Base::$sText.=Base::$tpl->fetch($this->sPrefix.'/all_price_group.tpl');
}
Base::$sText.=Debug::PrintPre($aResult,false,true);
}
}
}
setFilter() setGroupBy() setMatchMode() для задания критериев сортировки и фильтрацииsetFilter() setGroupBy() и т.п., потому что они при addQuery() не обнуляются. Пришлось придумывать какие-то обертки для этого, в общем времени потратил прилично.Есть же ResetFilters() и ResetGroupBy() для обнуления, а по-умолчанию они и не должны обнуляться — я написал в статье о них. Или может я что-то пропустил и все такие есть какие грабли с мультизапросами?Я, честно говоря, не очень хорошо помню деталей проблемы, но точно помню что они были и были по этой причине.
По вашему примеру сайта: найдено 767 results — честно говоря, я когда себе фару буду искать, врятли меня устроит такой широкий выбор :) Для фар, бамперов, и других 90% запчастей машины поиск сфинкс не подходит — и об этом тоже написано в статье. Или вы считаете что ваш поиск по фарам востребован пользователями?Во первых, я и запрос то привел чересчур общий. Вряд ли юзер прям будет искать любую фару для любой тойоты. Наверняка наберет типа «правая фара для тойота камри». Во вторых, фасеточные фильтры как раз служат для решения этой проблемы.
Пример Sphinx поиска на реальном проекте — магазин автозапчастей Tecdoc