getValue('config.host'); $user = $conf->getValue('config.user'); $password = $conf->getValue('config.password'); $database = $conf->getValue('config.db'); $prefix = $conf->getValue('config.dbprefix'); $driver = $conf->getValue('config.dbtype'); $debug = $conf->getValue('config.debug'); $db_host = $host ; $db_port = '3306'; $db_name = $database; $db_login = $user; $db_pass = $password; // параметры подключения к sphinx $sphHost = 'localhost'; $sphPort = 9312; // Создаем соединение с БД и настраиваем его $dbc = new mysqli($db_host, $db_login, $db_pass, $db_name, $db_port); if (mysqli_connect_errno()) throw new Exception(mysqli_connect_error(), mysqli_connect_errno()); if (!$dbc->set_charset("utf8")) throw new Exception($dbc->error); if (!$virtualName) { // Получаем наименование виртуального продукта. По хорошему тут должен быть // параметризированный запрос, но предполагается что программист, использующий // функцию следит за тем, что передает в нее. $sql = "select title from jos15_edasla_product where id = $virtId limit 1"; if (!($qRes = $dbc->query( $sql ))) throw new Exception($dbc->error); $qR = mysqli_fetch_array($qRes); $virtualName = $qR['title']; } else { } // создаем соединение с sphinx $_sphinx = new SphinxClient(); $_sphinx->SetServer($sphHost, $sphPort); $_sphinx->SetArrayResult(true); // если надо устанавливаем пределы if (!empty($total)){ $_sphinx->SetLimits(0, $limit); } $_sphinx->SetSelect('id'); $_sphinx->SetMatchMode(SPH_MATCH_EXTENDED2); $_sphinx->SetSortMode(SPH_SORT_EXTENDED, '@weight ASC'); //$_sphinx->SetRankingMode(SPH_RANK_EXPR, "sum((4*lcs+2*(min_hit_pos==1)+exact_hit)*user_weight)*1000+bm25"); //$_sphinx->SetRankingMode(SPH_RANK_EXPR, "sum((4*lcs+2*min_hit_pos))+bm25"); //$_sphinx->SetRankingMode(SPH_RANK_EXPR, "sum(lcs+min_hit_pos)+bm25"); $_sphinx->SetRankingMode(SPH_RANK_EXPR, "sum(lcs+min_hit_pos)*1000+bm25"); // устанавливаем фильтры if (!empty($stores)){ $_sphinx->SetFilter('store', $stores); } if (!empty($cats)){ $_sphinx->SetFilter('category', $cats); } // получаем результаты для виртуального товара //$wk = str_word_count($virtualName) + 3; $wordsArray = preg_split('/[\s,:?!]+/u', $virtualName, -1, PREG_SPLIT_NO_EMPTY); $wk = count($wordsArray) + 3; //$query = '@title "%1$s"~%d | "%1$s"/1'; $query = '@title "%1$s"~%2$s'; $query = sprintf( $query, $virtualName, $wk ); $mainRes = $_sphinx->Query($query, "products products_delta"); //$mainRes = $_sphinx->Query("@title \"$virtualName\"", "products products_delta"); //echo var_dump($mainRes); exit(); $products_quantity = 0; $products_by_synonym_quantity = 0; if (isset($mainRes)){ // формируем результат $res['id'] = $virtId; $res['name'] = $virtualName; if (isset($mainRes["matches"])){ foreach ($mainRes["matches"] as $mtch){ $r = array(); $r['shop_product_id'] = $mtch['id']; $r['weight'] = $mtch['weight']; // $sql = "select title from jos15_shop_product where id = {$r['shop_product_id']} limit 1"; if (!($qRes = $dbc->query( $sql ))) throw new Exception($dbc->error); $qR = mysqli_fetch_array($qRes); $r['shop_product_title'] = $qR['title']; // $r['synonym'] = false; $res['products'][$mtch['id']] = (object) $r; $products_quantity++; } // по синонимам $sql = "select synonym from jos15_edasla_products_synonym where product_id = $virtId and is_main = 0"; if (!($qRes = $dbc->query( $sql ))) throw new Exception($dbc->error); // перебираем синонимы while($qR = mysqli_fetch_array($qRes)){ // запрос по синониму $wordsArray = preg_split('/[\s,:?!]+/u', $qR['synonym'], -1, PREG_SPLIT_NO_EMPTY); $wk = count($wordsArray) + 3; //$query = '@title "%1$s"~%d | "%1$s"/1'; $query = '@title "%1$s"~%2$s'; $query = sprintf( $query, $qR['synonym'], $wk ); $synRes = $_sphinx->Query($query, "products products_delta"); //var_export_formated('$synRes:', $synRes); // результат для синонима $r = array(); //var_export_formated('$qR[\'synonym\']', $qR['synonym']); // результаты поиска для синонима if (isset($synRes["matches"])){ foreach ($synRes["matches"] as $mtch){ $sr = array(); $sr['shop_product_id'] = $mtch['id']; $sr['synonym'] = true; $sr['weight'] = $mtch['weight']; // $sql = "select title from jos15_shop_product where id = {$sr['shop_product_id']} limit 1"; if (!($innerQRes = $dbc->query( $sql ))) throw new Exception($dbc->error); $innerQR = mysqli_fetch_array($innerQRes); $sr['shop_product_title'] = $innerQR['title']; // //$r[] = (object) $sr; $res['products'][$mtch['id']] = (object) $sr; $products_by_synonym_quantity ++; } //if (!empty($r)){ // //$res['synonym'][] = $r; // //$res['synonym'] = $r; // $res['products'][$mtch['id']] = $r; //} } } } } //if ($virtualName == "Белые грибы"): // var_export_formated('$res["products"]:', $res['products'] ); // var_export_formated('$res["synonym"] :', $res['synonym'] ); // exit; //endif; //$new = ($products_quantity > 0 || $products_by_synonym_quantity > 0) ? array_merge( // array(), // // ($products_quantity > 0 ? $res['products'] : array()), // ($products_by_synonym_quantity > 0 ? $res['synonym'] : array()) // // ) : array(); $new = isset($res['products']) && $res['products']? $res['products'] : array(); //var_export_formated('$new:', $new); $end = microtime(); list($start) = explode(" ", $start); list($start_firstPart, $start) = explode(".", $start); if ($start_firstPart > 0) { $start = (int) "{$start_firstPart}{$start}"; } list($end) = explode(" ", $end); list($end_firstPart, $end) = explode(".", $end); if ($end_firstPart > 0) { $end = (int) "{$end_firstPart}{$end}"; } echo "
Начало: {$start}
"; echo "
Окончание: {$end}
"; echo "
Длительность: " . ($end - $start) . " микросикундных
"; return $new; } //if (isset($GET["test"])) { // var_export_formated(edaslaSphinxFind(1503)); //}