private function get_sugg_trigrams($word, SearchEngineOptions $options) { $trigrams = $this->BuildTrigrams($word); $query = "\"{$trigrams}\"/1"; $len = strlen($word); $this->resetSphinx(); $this->suggestionClient->SetMatchMode(SPH_MATCH_EXTENDED2); $this->suggestionClient->SetRankingMode(SPH_RANK_WORDCOUNT); $this->suggestionClient->SetFilterRange("len", $len - 2, $len + 4); $this->suggestionClient->SetSortMode(SPH_SORT_EXTENDED, "@weight DESC"); $this->suggestionClient->SetLimits(0, 10); $indexes = []; foreach ($options->getDataboxes() as $databox) { $indexes[] = 'suggest' . $this->CRCdatabox($databox); } $index = implode(',', $indexes); $res = $this->suggestionClient->Query($query, $index); if ($this->suggestionClient->Status() === false) { return []; } if (!$res || !isset($res["matches"])) { return []; } $words = []; foreach ($res["matches"] as $match) { $words[] = $match['attrs']['keyword']; } return $words; }
/** * * @param string $query * @return array of integers - taskIds */ public static function searchTasks($query) { $fieldWeights = array('description' => 10, 'note' => 6); $indexName = 'plancake_tasks'; $client = new SphinxClient(); // $client->SetServer (sfConfig::get('app_sphinx_host'), sfConfig::get('app_sphinx_port')); $client->SetFilter("author_id", array(PcUserPeer::getLoggedInUser()->getId())); $client->SetConnectTimeout(1); $client->SetMatchMode(SPH_MATCH_ANY); $client->SetSortMode(SPH_SORT_RELEVANCE); $client->SetRankingMode(SPH_RANK_PROXIMITY_BM25); $client->SetArrayResult(true); $client->SetFieldWeights($fieldWeights); $client->setLimits(0, 100); $results = $client->query($client->EscapeString($query), $indexName); if ($results === false) { $error = "Sphinx Error - " . $client->GetLastError(); sfErrorNotifier::alert($error); } $ids = array(); if (isset($results['matches']) && count($results['matches'])) { foreach ($results['matches'] as $match) { $ids[] = $match['id']; } } return PcTaskPeer::retrieveByPKs($ids); }
function hook_search($search) { $offset = 0; $limit = 500; $sphinxClient = new SphinxClient(); $sphinxpair = explode(":", SPHINX_SERVER, 2); $sphinxClient->SetServer($sphinxpair[0], (int) $sphinxpair[1]); $sphinxClient->SetConnectTimeout(1); $sphinxClient->SetFieldWeights(array('title' => 70, 'content' => 30, 'feed_title' => 20)); $sphinxClient->SetMatchMode(SPH_MATCH_EXTENDED2); $sphinxClient->SetRankingMode(SPH_RANK_PROXIMITY_BM25); $sphinxClient->SetLimits($offset, $limit, 1000); $sphinxClient->SetArrayResult(false); $sphinxClient->SetFilter('owner_uid', array($_SESSION['uid'])); $result = $sphinxClient->Query($search, SPHINX_INDEX); $ids = array(); if (is_array($result['matches'])) { foreach (array_keys($result['matches']) as $int_id) { $ref_id = $result['matches'][$int_id]['attrs']['ref_id']; array_push($ids, $ref_id); } } $ids = join(",", $ids); if ($ids) { return array("ref_id IN ({$ids})", array()); } else { return array("ref_id = -1", array()); } }
/** * __construct() * 构造函数 */ public function __construct() { parent::__construct(); parent::SetServer(SPH_HOST, 9312); //parent::SetServer("localhost",9312); //parent::SetConnectTimeout(10); parent::SetMatchMode(SPH_MATCH_EXTENDED2); //parent::SetFieldWeights($this->weights); parent::SetRankingMode(SPH_RANK_WORDCOUNT); // parent::SetSortMode(SPH_SORT_EXTENDED, '@weight desc'); parent::SetArrayResult(TRUE); $this->SetLimits($this->offset, $this->limit); }
protected function resetClient() { $this->sphinxClient->ResetFilters(); $this->sphinxClient->ResetGroupBy(); $this->sphinxClient->ResetOverrides(); $this->sphinxClient->SetLimits(0, 20); $this->sphinxClient->SetArrayResult(true); $this->sphinxClient->SetFieldWeights(array()); $this->sphinxClient->SetIDRange(0, 0); $this->sphinxClient->SetIndexWeights(array()); $this->sphinxClient->SetMatchMode(SPH_MATCH_EXTENDED2); $this->sphinxClient->SetRankingMode(SPH_RANK_NONE); $this->sphinxClient->SetSortMode(SPH_SORT_RELEVANCE, ""); $this->sphinxClient->SetSelect("*"); }
function MakeSuggestion($keyword) { $trigrams = BuildTrigrams($keyword); $query = "\"{$trigrams}\"/1"; $len = strlen($keyword); $delta = LENGTH_THRESHOLD; $cl = new SphinxClient(); $cl->SetMatchMode(SPH_MATCH_EXTENDED2); $cl->SetRankingMode(SPH_RANK_WORDCOUNT); $cl->SetFilterRange("len", $len - $delta, $len + $delta); $cl->SetSelect("*, @weight+{$delta}-abs(len-{$len}) AS myrank"); $cl->SetSortMode(SPH_SORT_EXTENDED, "myrank DESC, freq DESC"); $cl->SetArrayResult(true); // pull top-N best trigram matches and run them through Levenshtein $cl->SetLimits(0, TOP_COUNT); $res = $cl->Query($query, "suggest"); if (!$res || !$res["matches"]) { return false; } if (SUGGEST_DEBUG) { print "--- DEBUG START ---\n"; foreach ($res["matches"] as $match) { $w = $match["attrs"]["keyword"]; $myrank = @$match["attrs"]["myrank"]; if ($myrank) { $myrank = ", myrank={$myrank}"; } // FIXME? add costs? // FIXME! does not work with UTF-8.. THIS! IS!! PHP!!! $levdist = levenshtein($keyword, $w); print "id={$match['id']}, weight={$match['weight']}, freq={$match[attrs][freq]}{$myrank}, word={$w}, levdist={$levdist}\n"; } print "--- DEBUG END ---\n"; } // further restrict trigram matches with a sane Levenshtein distance limit foreach ($res["matches"] as $match) { $suggested = $match["attrs"]["keyword"]; if (levenshtein($keyword, $suggested) <= LEVENSHTEIN_THRESHOLD) { return $suggested; } } return $keyword; }
public function getSphinxAdapter() { require_once Mage::getBaseDir('lib') . DIRECTORY_SEPARATOR . 'sphinxapi.php'; // Connect to our Sphinx Search Engine and run our queries $sphinx = new SphinxClient(); $host = Mage::getStoreConfig('sphinxsearch/server/host'); $port = Mage::getStoreConfig('sphinxsearch/server/port'); if (empty($host)) { return $sphinx; } if (empty($port)) { $port = 9312; } $sphinx->SetServer($host, $port); $sphinx->SetMatchMode(SPH_MATCH_EXTENDED2); $sphinx->setFieldWeights(array('name' => 7, 'category' => 1, 'name_attributes' => 1, 'data_index' => 3)); $sphinx->setLimits(0, 200, 1000, 5000); // SPH_RANK_PROXIMITY_BM25 ist default $sphinx->SetRankingMode(SPH_RANK_SPH04, ""); // 2nd parameter is rank expr? return $sphinx; }
private function doSearch($q, $page) { global $wgOut; $mode = SPH_MATCH_ALL; $index = 'suggested_titles'; $page_size = 20; $limit = 1000; $ranker = SPH_RANK_PROXIMITY_BM25; $host = 'localhost'; $port = 9312; $cl = new SphinxClient(); $cl->SetServer($host, $port); //$cl->SetConnectTimeout(1); $cl->SetSortMode(SPH_SORT_RELEVANCE); $cl->SetArrayResult(true); $cl->SetWeights(array('wst_title' => 5, 'wst_text' => 2)); $cl->SetMatchMode($mode); $cl->SetRankingMode($ranker); $cl->SetLimits(($page - 1) * $page_size, $page_size, $limit); // don't search w/ leading "how to" if user added it $q_prime = preg_replace('@^\\s*how\\s+to\\s+@i', '', $q); $res = $cl->Query($q_prime, $index); $error = $res === false ? $cl->GetLastError() : ''; $warning = $cl->GetLastWarning(); /*$spelling = $this->getSpellingInfo($q); if ($spelling) { $res['spelling'] = $spelling; } else { $res['spelling'] = ''; }*/ if (count($res['matches']) > 0) { $titles = $this->getInfo($res['matches']); $keys = array_keys($titles); $excerpts = $cl->BuildExcerpts($titles, 'suggested_titles', $q); foreach ($excerpts as $i => $excerpt) { $excerpts[$keys[$i]] = $excerpt; unset($excerpts[$i]); } foreach ($res['matches'] as $i => &$docinfo) { $id = $docinfo['id']; $docinfo['attrs']['excerpt'] = $excerpts[$id]; } } else { $error = wfMsg('search-keywords-not-found', $q); } // construct paging bar $total = (int) ceil(1.0 * $res['total_found'] / $page_size); $paging = array(); if ($page > 1) { $paging[] = 'prev'; } if ($page > 1) { $paging[] = 1; } if ($page >= 5) { $paging[] = '...'; } if ($page >= 4) { $paging[] = $page - 2; } if ($page >= 3) { $paging[] = $page - 1; } $paging[] = $page; if ($page < $total) { $paging[] = $page + 1; } if ($page + 1 < $total) { $paging[] = $page + 2; } if ($page + 2 < $total) { $paging[] = '...'; } if ($page < $total) { $paging[] = 'next'; } $vars = array('results' => $res, 'q' => $q, 'error' => $error, 'warning' => $warning, 'page' => $page, 'page_size' => $page_size, 'paging' => $paging); return $vars; }
public function run($subject_id, $clean = true, $query_offset = 0, $from, $to) { $this->load->helper('sphinxapi'); $this->load->helper('mood'); // skip if matching_status is "matching" $matching_status = $this->custom_model->get_value('subject', 'matching_status', $subject_id); if ($matching_status == 'matching') { echo "subject is matching"; return false; } // flag subject as matching.. do other bot runs this queue. $this->db->update('subject', array('matching_status' => 'matching'), array('id' => $subject_id)); // clear all match record for this subject if ($clean) { $this->db->delete('matchs', array('subject_id' => $subject_id)); } // // begin re-matching this subject // // get search string from subject_id $query = $this->custom_model->get_value('subject', 'query', $subject_id); // sphinx init $cl = new SphinxClient(); $q = $query; $sql = ""; $mode = SPH_MATCH_EXTENDED; $host = "192.168.1.102"; $port = 9312; $index = "*"; $groupby = ""; $groupsort = "@group desc"; $filter = "group_id"; $filtervals = array(); $distinct = ""; $sortby = "@id ASC"; $sortexpr = ""; $offset = $query_offset; $limit = 1000000; $ranker = SPH_RANK_PROXIMITY_BM25; $select = ""; echo 'limit=' . $limit . ' offset=' . $offset . PHP_EOL; //Extract subject keyword from search string $keywords = get_keywords($q); //////////// // do query //////////// $cl->SetServer($host, $port); $cl->SetConnectTimeout(1); $cl->SetArrayResult(true); $cl->SetWeights(array(100, 1)); $cl->SetMatchMode($mode); // if ( count($filtervals) ) $cl->SetFilter ( $filter, $filtervals ); // if ( $groupby ) $cl->SetGroupBy ( $groupby, SPH_GROUPBY_ATTR, $groupsort ); if ($sortby) { $cl->SetSortMode(SPH_SORT_EXTENDED, $sortby); } // if ( $sortexpr ) $cl->SetSortMode ( SPH_SORT_EXPR, $sortexpr ); if ($distinct) { $cl->SetGroupDistinct($distinct); } if ($select) { $cl->SetSelect($select); } if ($limit) { $cl->SetLimits(0, $limit, $limit > 1000000 ? $limit : 1000000); } $cl->SetRankingMode($ranker); $res = $cl->Query($q, $index); //////////// // do Insert to DB //////////// // Current matching $current_matching = array(); $query_matchs = $this->db->get_where('matchs', array('subject_id' => $subject_id)); if ($query_matchs->num_rows() > 0) { echo PHP_EOL . 'currents matching :' . $query_matchs->num_rows(); foreach ($query_matchs->result() as $match) { $current_matching[] = $match->post_id; } } // set matching date range from-to $from = strtotime($from); $to = strtotime($to); // Search and Update if ($res === false) { echo "Query failed: " . $cl->GetLastError() . ".\n"; } else { if ($cl->GetLastWarning()) { echo "WARNING: " . $cl->GetLastWarning() . "\n\n"; } echo "Query '{$q}' \nretrieved {$res['total']} of {$res['total_found']} matches in {$res['time']} sec.\n"; if ($res['total'] == 0) { echo "no result<br/>\n"; } else { if ($res['total'] > $limit + $offset) { $this->run($subject_id, $limit + $offset); } else { echo "Updating..."; foreach ($res["matches"] as $k => $docinfo) { // echo '('.$k.')'.$docinfo["id"]." "; // Reset PHP Timeout to 1min // if found in $current_matching then skip if (in_array($docinfo["id"], $current_matching)) { continue; } else { // else insert new match set_time_limit(60); $post = new Post_model(); $post->init($docinfo["id"]); // if post_date is our of range then skip $post_date = strtotime($post->post_date); if ($post_date < $from || $post_date > $to) { continue; } $mood = get_mood($post->body, $keywords); $data = array('post_id' => $post->id, 'subject_id' => $subject_id, 'matching_date' => null, 'sentiment' => $mood, 'by' => 'system', 'system_correct' => $mood, 'system_correct_date' => mdate('%Y-%m-%d %H:%i', time())); $this->db->insert('matchs', $data); } } } } } // flag subject as update.. $data = array('matching_status' => 'update', 'latest_matching' => mdate('%Y-%m-%d %H:%i:%s', time()), 'from' => mdate('%Y-%m-%d %H:%i:%s', $from), 'to' => mdate('%Y-%m-%d %H:%i:%s', $to), 'bot_id' => 0); $this->db->update('subject', $data, array('id' => $subject_id)); }
$sphinx = new SphinxClient(); // $sphinx->SetServer("localhost", 9312); $sphinx->SetServer('81.17.140.234', 9312); $sphinx->SetConnectTimeout(1); $sphinx->SetArrayResult(true); $sphinx->setMaxQueryTime(3); $sphinx->setLimits(0, 5000); $sphinx->SetSortMode(SPH_SORT_RELEVANCE); // разбор строки запроса if(ctype_digit($query)){ $result = $sphinx->Query($query, 'art'.$GLOBALS['CONFIG']['search_index_prefix']); }else{ $query = preg_replace('/[()*|,.*^"&@#$%]/', ' ', $query); $words = explode(' ', $query); $sphinx->SetMatchMode(SPH_MATCH_BOOLEAN); $sphinx->SetRankingMode(SPH_RANK_BM25); $wo = ''; foreach($words as $k=>$word){ if(strlen($word) > 2){ if($k == 0){ $wo .= '( '.$word.' | '.$word.'* | *'.$word.'* | *'.$word.' )'; }else{ $wo .= ' & ( '.$word.' | '.$word.'* | *'.$word.'* | *'.$word.' )'; } } } if($wo != ''){ $result = $sphinx->Query($wo, 'name'.$GLOBALS['CONFIG']['search_index_prefix']); } if(!isset($result['total']) || $result['total'] == 0){ $wo = '';
} elseif (isset($srchfid) && !empty($srchfid) && $srchfid != 'all' && !(is_array($srchfid) && in_array('all', $srchfid)) && empty($forumsarray)) { showmessage('search_forum_invalid', 'search.php?mod=forum'); } elseif (!$fids) { showmessage('group_nopermission', NULL, array('grouptitle' => $_G['group']['grouptitle']), array('login' => 1)); } if ($_G['adminid'] != '1' && $_G['setting']['search']['forum']['maxspm']) { if (DB::result_first("SELECT COUNT(*) FROM " . DB::table('common_searchindex') . " WHERE srchmod='{$srchmod}' AND dateline>'{$_G['timestamp']}'-60") >= $_G['setting']['search']['forum']['maxspm']) { showmessage('search_toomany', 'search.php?mod=forum', array('maxspm' => $_G['setting']['search']['forum']['maxspm'])); } } if ($srchtype == 'fulltext' && $_G['setting']['sphinxon']) { require_once libfile('class/sphinx'); $s = new SphinxClient(); $s->setServer($_G['setting']['sphinxhost'], intval($_G['setting']['sphinxport'])); $s->setMaxQueryTime(intval($_G['setting']['sphinxmaxquerytime'])); $s->SetRankingMode($_G['setting']['sphinxrank']); $s->setLimits(0, intval($_G['setting']['sphinxlimit']), intval($_G['setting']['sphinxlimit'])); $s->setGroupBy('tid', SPH_GROUPBY_ATTR); if ($srchfilter == 'digest') { $s->setFilterRange('digest', 1, 3, false); } if ($srchfilter == 'top') { $s->setFilterRange('displayorder', 1, 2, false); } else { $s->setFilterRange('displayorder', 0, 2, false); } if (!empty($srchfrom) && empty($srchtxt) && empty($srchuid) && empty($srchuname)) { $expiration = TIMESTAMP + $cachelife_time; $keywords = ''; if ($before) { $spx_timemix = 0;
function getCategory($keywords) { $q = $keywords; $mode = SPH_MATCH_EXTENDED; $item = array(); $comma_separated = ""; //Init config $host = SPHINX_SERVER; $port = SPHINX_PORT; $index = '*'; $ranker = SPH_RANK_PROXIMITY_BM25; $cl = new SphinxClient(); $cl->SetServer($host, $port); $cl->SetConnectTimeout(1); $cl->SetWeights(array(100, 1)); $cl->SetMatchMode($mode); $cl->SetRankingMode($ranker); $cl->SetArrayResult(true); $cl->SetFilter('status', array('1')); $cl->SetGroupBy("level_1_category_id", SPH_GROUPBY_ATTR, "@count DESC"); $res = $cl->Query($q, $index); $arr = array(); if ($res && isset($res["matches"])) { if (is_array($res["matches"])) { foreach ($res["matches"] as $results) { $arr[] = $results["attrs"]; } } } return $arr; }
public function index() { C('TOKEN_ON', false); $seo = seo(); $this->assign("seo", $seo); if (isset($_GET['q'])) { G('search'); //关键字 $q = Input::forSearch(safe_replace($this->_get("q"))); $q = htmlspecialchars(strip_tags($q)); //时间范围 $time = $this->_get("time"); //模型 $mid = (int) $this->_get("modelid"); //栏目 $catid = (int) $this->_get("catid"); //排序 $order = array("adddate" => "DESC", "searchid" => "DESC"); //搜索历史记录 $shistory = cookie("shistory"); if (!$shistory) { $shistory = array(); } $model = F("Model"); $category = F("Category"); if (trim($_GET['q']) == '') { header('Location: ' . U("Search/Index/index")); exit; } array_unshift($shistory, $q); $shistory = array_slice(array_unique($shistory), 0, 10); //加入搜索历史 cookie("shistory", $shistory); $where = array(); //每页显示条数 $pagesize = $this->config['pagesize'] ? $this->config['pagesize'] : 10; //缓存时间 $cachetime = (int) $this->config['cachetime']; //按时间搜索 if ($time == 'day') { //一天 $search_time = time() - 86400; $where['adddate'] = array("GT", $search_time); } elseif ($time == 'week') { //一周 $search_time = time() - 604800; $where['adddate'] = array("GT", $search_time); } elseif ($time == 'month') { //一月 $search_time = time() - 2592000; $where['adddate'] = array("GT", $search_time); } elseif ($time == 'year') { //一年 $search_time = time() - 31536000; $where['adddate'] = array("GT", $search_time); } else { $search_time = 0; } //可用数据源 $this->config['modelid'] = $this->config['modelid'] ? $this->config['modelid'] : array(); //按模型搜索 if ($mid && in_array($mid, $this->config['modelid'])) { $where['modelid'] = array("EQ", (int) $mid); } //按栏目搜索 if ($catid) { //不支持多栏目搜索,和父栏目搜索。 $where['catid'] = array("EQ", (int) $catid); } //分页模板 $TP = '共有{recordcount}条信息 {pageindex}/{pagecount} {first}{prev}{liststart}{list}{listend}{next}{last}'; //如果开启sphinx if ($this->config['sphinxenable']) { import("Sphinxapi", APP_PATH . C("APP_GROUP_PATH") . '/Search/Class/'); $sphinxhost = $this->config['sphinxhost']; $sphinxport = $this->config['sphinxport']; $cl = new SphinxClient(); //设置searchd的主机名和TCP端口 $cl->SetServer($sphinxhost, $sphinxport); //设置连接超时 $cl->SetConnectTimeout(1); //控制搜索结果集的返回格式 $cl->SetArrayResult(true); //设置全文查询的匹配模式 api http://docs.php.net/manual/zh/sphinxclient.setmatchmode.php $cl->SetMatchMode(SPH_MATCH_EXTENDED2); //设置排名模式 api http://docs.php.net/manual/zh/sphinxclient.setrankingmode.php $cl->SetRankingMode(SPH_RANK_PROXIMITY_BM25); //按一种类似SQL的方式将列组合起来,升序或降序排列。用weight是权重排序 $cl->SetSortMode(SPH_SORT_EXTENDED, "@weight desc"); //设置返回结果集偏移量和数目 $page = (int) $this->_get(C("VAR_PAGE")); $page = $page < 1 ? 1 : $page; $offset = $pagesize * ($page - 1); $cl->SetLimits($offset, $pagesize, $pagesize > 1000 ? $pagesize : 1000); if (in_array($time, array("day", "week", "month", "year"))) { //过滤时间 $cl->SetFilterRange('adddate', $search_time, time(), false); } if ($mid && in_array($mid, $this->config['modelid'])) { //过滤模型 $cl->SetFilter('modelid', (int) $mid); } if ($catid) { //过滤栏目 $cl->SetFilter('catid', (int) $catid); } //执行搜索 api http://docs.php.net/manual/zh/sphinxclient.query.php $res = $cl->Query($q, "*"); //信息总数 $count = $res['total']; //如果结果不为空 if (!empty($res['matches'])) { $result_sphinx = $res['matches']; } $result = array(); //数组重新组合 foreach ($result_sphinx as $k => $v) { $result[$k] = array("searchid" => $v['id'], "adddate" => $v['attrs']['adddate'], "catid" => $v['attrs']['catid'], "id" => $v['attrs']['id'], "modelid" => $v['attrs']['modelid']); } $words = array(); //搜索关键字 foreach ($res['words'] as $k => $v) { $words[] = $k; } $page = page($count, $pagesize); $page->SetPager('default', $TP, array("listlong" => "6", "first" => "首页", "last" => "尾页", "prev" => "上一页", "next" => "下一页", "list" => "*", "disabledclass" => "")); $this->assign("Page", $page->show('default')); } else { import("Segment", APP_PATH . C("APP_GROUP_PATH") . '/Search/Class/'); $Segment = new Segment(); //分词结果 $segment_q = $Segment->get_keyword($Segment->split_result($q)); $words = explode(" ", $segment_q); if (!empty($segment_q)) { $where['_string'] = " MATCH (`data`) AGAINST ('{$segment_q}' IN BOOLEAN MODE) "; } else { //这种搜索最不行 $where['data'] = array('like', "%{$q}%"); } //查询结果缓存 if ($cachetime) { //统计 $count = M("Search")->cache(true, $cachetime)->where($where)->count(); $page = page($count, $pagesize); $result = M("Search")->cache(true, $cachetime)->where($where)->limit($page->firstRow . ',' . $page->listRows)->order($order)->select(); } else { $count = M("Search")->where($where)->count(); $page = $this->page($count, $pagesize); $result = M("Search")->where($where)->limit($page->firstRow . ',' . $page->listRows)->order($order)->select(); } $page->SetPager('default', $TP, array("listlong" => "6", "first" => "首页", "last" => "尾页", "prev" => "上一页", "next" => "下一页", "list" => "*", "disabledclass" => "")); $this->assign("Page", $page->show('default')); } //搜索结果处理 if ($result && is_array($result)) { foreach ($result as $k => $r) { $modelid = $r['modelid']; $id = $r['id']; $tablename = ucwords($model[$modelid]['tablename']); if ($tablename) { $result[$k] = M($tablename)->where(array("id" => $id))->find(); } } } //搜索记录 if (strlen($q) < 17 && strlen($q) > 1 && $result) { $res = M("SearchKeyword")->where(array('keyword' => $q))->find(); if ($res) { //关键词搜索数+1 M("SearchKeyword")->where(array('keyword' => $q))->setInc("searchnums"); } else { //关键词转换为拼音 load("@.iconvfunc"); $pinyin = gbk_to_pinyin(iconv('utf-8', 'gbk//IGNORE', $q)); if (is_array($pinyin)) { $pinyin = implode('', $pinyin); } M("SearchKeyword")->add(array('keyword' => $q, 'searchnums' => 1, 'data' => $segment_q, 'pinyin' => $pinyin)); } } //相关搜索功能 if ($this->config['relationenble']) { $map = array(); //相关搜索 if (!empty($segment_q)) { $relation_q = str_replace(' ', '%', $segment_q); } else { $relation_q = $q; } $map['_string'] = " MATCH (`data`) AGAINST ('%{$relation_q}%' IN BOOLEAN MODE) "; $relation = M("SearchKeyword")->where($map)->select(); $this->assign("relation", $relation); } foreach ($this->config['modelid'] as $modelid) { $source[$modelid] = array("name" => $model[$modelid]['name'], "modelid" => $modelid); } //搜索结果 $this->assign("result", $result); //运行时间 $search_time = G('search', 'end', 6); $this->assign("count", $count ? $count : 0); $this->assign("search_time", $search_time); $this->assign("keyword", $q); $this->assign("category", $category); $this->assign("source", $source); $this->assign("time", $time); $this->assign("modelid", $mid); $this->assign("shistory", $shistory); //分词后的搜索关键字 $this->assign("words", $words); $this->display("search"); } else { $this->display(); } }
/** * Does an index search via Sphinx and returns the results * * @param string $type Search type. Valid types are: author, title, series, subject, keyword (default) * @param string $term Search term/phrase * @param int $limit Number of results to return * @param int $offset Where to begin result set -- for pagination purposes * @param array $sort_array Numerically keyed array of sort parameters. Valid options are: newest, oldest * @param array $location_array Numerically keyed array of location params. NOT IMPLEMENTED YET * @param array $facet_args String-keyed array of facet parameters. See code below for array structure * @return array String-keyed result set */ public function search($type, $term, $limit, $offset, $sort_opt = NULL, $format_array = array(), $location_array = array(), $facet_args = array(), $override_search_filter = FALSE, $limit_available = FALSE, $show_inactive = FALSE) { if (is_callable(array(__CLASS__ . '_hook', __FUNCTION__))) { eval('$hook = new ' . __CLASS__ . '_hook;'); return $hook->{__FUNCTION__}($type, $term, $limit, $offset, $sort_opt, $format_array, $location_array, $facet_args, $override_search_filter, $limit_available); } require_once $this->locum_config['sphinx_config']['api_path'] . '/sphinxapi.php'; $db =& MDB2::connect($this->dsn); $term_arr = explode('?', trim(preg_replace('/\\//', ' ', $term))); $term = trim($term_arr[0]); if ($term == '*' || $term == '**') { $term = ''; } else { $term_prestrip = $term; //$term = preg_replace('/[^A-Za-z0-9*\- ]/iD', '', $term); $term = preg_replace('/\\*\\*/', '*', $term); //fix for how iii used to do wildcards } $final_result_set['term'] = $term; $final_result_set['type'] = trim($type); $cl = new SphinxClient(); $cl->SetServer($this->locum_config['sphinx_config']['server_addr'], (int) $this->locum_config['sphinx_config']['server_port']); // Defaults to 'keyword', non-boolean $bool = FALSE; $cl->SetMatchMode(SPH_MATCH_ALL); if (!$term) { // Searches for everything (usually for browsing purposes--Hot/New Items, etc..) $cl->SetMatchMode(SPH_MATCH_EXTENDED2); } else { $picturebook = array('picturebook', 'picture book'); $picbk_search = '(@callnum ^E)'; $term = str_ireplace($picturebook, $picbk_search, $term); if ($type == 'keyword') { // Custom fiction and non-fiction search $nonfic_search = ' (@callnum "0*" | @callnum "1*" | @callnum "2*" | @callnum "3*" | @callnum "4*" | @callnum "5*" | @callnum "6*" | @callnum "7*" | @callnum "8*" | @callnum "9*")'; $fiction_search = ' (@title fiction | @subjects fiction | @callnum mystery | @callnum fantasy | @callnum fiction | @callnum western | @callnum romance)'; if (stripos($term, 'nonfiction') !== FALSE) { $term = '@@relaxed ' . str_ireplace('nonfiction', '', $term) . $nonfic_search; } else { if (strpos($term, 'non-fiction') !== FALSE) { $term = '@@relaxed ' . str_ireplace('non-fiction', '', $term) . $nonfic_search; } else { if (strpos($term, 'fiction') !== FALSE) { $term = '@@relaxed ' . str_ireplace('fiction', '', $term) . $fiction_search; } } } } // Is it a boolean search? if (preg_match("/ \\| /i", $term) || preg_match("/ \\-/i", $term) || preg_match("/ \\!/i", $term)) { $cl->SetMatchMode(SPH_MATCH_BOOLEAN); $bool = TRUE; } if (preg_match("/ OR /i", $term)) { $cl->SetMatchMode(SPH_MATCH_BOOLEAN); $term = preg_replace('/ OR /i', ' | ', $term); $bool = TRUE; } // Is it a phrase search? if (preg_match("/\"/i", $term) || preg_match("/\\@/i", $term)) { $cl->SetMatchMode(SPH_MATCH_EXTENDED2); $bool = TRUE; } } // Set up for the various search types switch ($type) { case 'author': $cl->SetFieldWeights(array('author' => 50, 'addl_author' => 30)); $idx = 'bib_items_author'; break; case 'title': $cl->SetFieldWeights(array('title' => 50, 'title_medium' => 50, 'series' => 30)); $idx = 'bib_items_title'; break; case 'series': $cl->SetFieldWeights(array('title' => 5, 'series' => 80)); $idx = 'bib_items_title'; break; case 'subject': $idx = 'bib_items_subject'; break; case 'callnum': $cl->SetFieldWeights(array('callnum' => 100)); $idx = 'bib_items_callnum'; //$cl->SetMatchMode(SPH_MATCH_ANY); break; case 'tags': $cl->SetFieldWeights(array('tag_idx' => 100)); $idx = 'bib_items_tags'; //$cl->SetMatchMode(SPH_MATCH_PHRASE); break; case 'reviews': $cl->SetFieldWeights(array('review_idx' => 100)); $idx = 'bib_items_reviews'; break; case 'keyword': default: $cl->SetFieldWeights(array('title' => 400, 'title_medium' => 30, 'author' => 70, 'addl_author' => 40, 'tag_idx' => 25, 'series' => 25, 'review_idx' => 10, 'notes' => 10, 'subjects' => 5)); $idx = 'bib_items_keyword'; break; } // Filter out the records we don't want shown, per locum.ini if (!$override_search_filter) { if (trim($this->locum_config['location_limits']['no_search'])) { $cfg_filter_arr = $this->csv_parser($this->locum_config['location_limits']['no_search']); foreach ($cfg_filter_arr as $cfg_filter) { $cfg_filter_vals[] = $this->string_poly($cfg_filter); } $cl->SetFilter('loc_code', $cfg_filter_vals, TRUE); } } // Valid sort types are 'newest' and 'oldest'. Default is relevance. switch ($sort_opt) { case 'newest': $cl->SetSortMode(SPH_SORT_EXTENDED, 'pub_year DESC, @relevance DESC'); break; case 'oldest': $cl->SetSortMode(SPH_SORT_EXTENDED, 'pub_year ASC, @relevance DESC'); break; case 'catalog_newest': $cl->SetSortMode(SPH_SORT_EXTENDED, 'bib_created DESC, @relevance DESC'); break; case 'catalog_oldest': $cl->SetSortMode(SPH_SORT_EXTENDED, 'bib_created ASC, @relevance DESC'); break; case 'title': $cl->SetSortMode(SPH_SORT_ATTR_ASC, 'title_ord'); break; case 'author': $cl->SetSortMode(SPH_SORT_EXTENDED, 'author_null ASC, author_ord ASC'); break; case 'top_rated': $cl->SetSortMode(SPH_SORT_ATTR_DESC, 'rating_idx'); break; case 'popular_week': $cl->SetSortMode(SPH_SORT_ATTR_DESC, 'hold_count_week'); break; case 'popular_month': $cl->SetSortMode(SPH_SORT_ATTR_DESC, 'hold_count_month'); break; case 'popular_year': $cl->SetSortMode(SPH_SORT_ATTR_DESC, 'hold_count_year'); break; case 'popular_total': $cl->SetSortMode(SPH_SORT_ATTR_DESC, 'hold_count_total'); break; case 'atoz': $cl->SetSortMode(SPH_SORT_ATTR_ASC, 'title_ord'); break; case 'ztoa': $cl->SetSortMode(SPH_SORT_ATTR_DESC, 'title_ord'); break; default: $cl->SetSortMode(SPH_SORT_EXPR, "@weight + (hold_count_total)*0.02"); break; } // Filter by material types if (is_array($format_array)) { foreach ($format_array as $format) { if (strtolower($format) != 'all') { $filter_arr_mat[] = $this->string_poly(trim($format)); } } if (count($filter_arr_mat)) { $cl->SetFilter('mat_code', $filter_arr_mat); } } // Filter by location if (count($location_array)) { foreach ($location_array as $location) { if (strtolower($location) != 'all') { $filter_arr_loc[] = $this->string_poly(trim($location)); } } if (count($filter_arr_loc)) { $cl->SetFilter('loc_code', $filter_arr_loc); } } // Filter by pub_year if ($facet_args['facet_year']) { if (strpos($facet_args['facet_year'][0], '-') !== FALSE) { $min_year = 1; $max_year = 9999; $args = explode('-', $facet_args['facet_year'][0]); $min_arg = (int) $args[0]; $max_arg = (int) $args[1]; if ($min_arg && $min_arg > $min_year) { $min_year = $min_arg; } if ($max_arg && $max_arg < $max_year) { $max_year = $max_arg; } $cl->setFilterRange('pub_year', $min_year, $max_year); } else { $cl->SetFilter('pub_year', $facet_args['facet_year']); } } // Filter by pub_decade if ($facet_args['facet_decade']) { $cl->SetFilter('pub_decade', $facet_args['facet_decade']); } // Filter by lexile if ($facet_args['facet_lexile']) { $cl->SetFilter('lexile', $facet_args['facet_lexile']); } // Filter by Series if (count($facet_args['facet_series'])) { foreach ($facet_args['facet_series'] as &$facet_series) { $facet_series = $this->string_poly($facet_series); } $cl->SetFilter('series_attr', $facet_args['facet_series']); } // Filter by Language if (count($facet_args['facet_lang'])) { foreach ($facet_args['facet_lang'] as &$facet_lang) { $facet_lang = $this->string_poly($facet_lang); } $cl->SetFilter('lang', $facet_args['facet_lang']); } // Filter inactive records if (!$show_inactive) { $cl->SetFilter('active', array('0'), TRUE); } // Filter by age if (count($facet_args['age'])) { foreach ($facet_args['age'] as $age_facet) { $cl->SetFilter('ages', array($this->string_poly($age_facet))); } } // Filter by availability if ($limit_available) { $cl->SetFilter('branches', array($this->string_poly($limit_available))); } $cl->SetRankingMode(SPH_RANK_SPH04); $proximity_check = $cl->Query($term, $idx); // Quick check on number of results // If original match didn't return any results, try a proximity search if (empty($proximity_check['matches']) && $bool == FALSE && $term != "*" && $type != "tags") { $term = '"' . $term . '"/1'; $cl->SetMatchMode(SPH_MATCH_EXTENDED); $forcedchange = 'yes'; } // Paging/browsing through the result set. $sort_limit = 2000; if ($offset + $limit > $sort_limit) { $sort_limit = $offset + $limit; } $cl->SetLimits((int) $offset, (int) $limit, (int) $sort_limit); // And finally.... we search. $cl->AddQuery($term, $idx); // CREATE FACETS $cl->SetLimits(0, 1000); // Up to 1000 facets $cl->SetArrayResult(TRUE); // Allow duplicate documents in result, for facet grouping $cl->SetGroupBy('pub_year', SPH_GROUPBY_ATTR); $cl->AddQuery($term, $idx); $cl->ResetGroupBy(); $cl->SetGroupBy('pub_decade', SPH_GROUPBY_ATTR); $cl->AddQuery($term, $idx); $cl->ResetGroupBy(); $cl->SetGroupBy('mat_code', SPH_GROUPBY_ATTR, '@count desc'); $cl->AddQuery($term, $idx); $cl->ResetGroupBy(); $cl->SetGroupBy('branches', SPH_GROUPBY_ATTR, '@count desc'); $cl->AddQuery($term, $idx); $cl->ResetGroupBy(); $cl->SetGroupBy('ages', SPH_GROUPBY_ATTR, '@count desc'); $cl->AddQuery($term, $idx); $cl->ResetGroupBy(); $cl->SetGroupBy('lang', SPH_GROUPBY_ATTR, '@count desc'); $cl->AddQuery($term, $idx); $cl->ResetGroupBy(); $cl->SetGroupBy('series_attr', SPH_GROUPBY_ATTR, '@count desc'); $cl->AddQuery($term, $idx); $cl->ResetGroupBy(); $cl->SetGroupBy('lexile', SPH_GROUPBY_ATTR); $cl->AddQuery($term, $idx); $cl->ResetGroupBy(); $results = $cl->RunQueries(); // Include descriptors $final_result_set['num_hits'] = $results[0]['total_found']; if ($results[0]['total'] <= $this->locum_config['api_config']['suggestion_threshold'] || $forcedchange == 'yes') { if ($this->locum_config['api_config']['use_yahoo_suggest'] == TRUE) { $final_result_set['suggestion'] = $this->yahoo_suggest($term_prestrip); } } // Pull full records out of Couch if ($final_result_set['num_hits']) { $skip_avail = $this->csv_parser($this->locum_config['format_special']['skip_avail']); $bib_hits = array(); foreach ($results[0]['matches'] as $match) { $bib_hits[] = (string) $match['id']; } $final_result_set['results'] = $this->get_bib_items_arr($bib_hits); foreach ($final_result_set['results'] as &$result) { $result = $result['value']; if ($result['bnum']) { // Get availability (Only cached) $result['status'] = $this->get_item_status($result['bnum'], FALSE, TRUE); } } } $final_result_set['facets'] = $this->sphinx_facetizer($results); if ($forcedchange == 'yes') { $final_result_set['changed'] = 'yes'; } return $final_result_set; }
<?php require "sphinxapi.php"; $cl = new SphinxClient(); $cl->SetServer('127.0.0.1', 9312); $cl->SetConnectTimeout(1); $cl->SetArrayResult(true); // $cl->SetWeights ( array ( 100, 1 ) ); $cl->SetMatchMode(SPH_MATCH_EXTENDED2); $cl->SetRankingMode(SPH_RANK_WORDCOUNT); // $cl->SetSortMode ( SPH_SORT_EXTENDED, '@weight DESC' ); // $cl->SetSortMode ( SPH_SORT_EXPR, $sortexpr ); // $cl->SetFieldWeights(array('title'=>10,'content'=>1)); $res = $cl->Query('sphinxse', "*"); print_r($res['matches']);
<?php require "spec/fixtures/sphinxapi.php"; $cl = new SphinxClient(); $cl->SetRankingMode(SPH_RANK_NONE); $cl->Query('query');
function draw() { //$tbl_source = "category_bk"; $tbl_source = "category"; global $display; $keywords = AZLib::getParam('searchKeyword'); $src_catid = (int) Url::get('sourceCategories'); $src_l1_catid = 0; $src_l2_catid = 0; $src_l3_catid = 0; if ($src_catid) { //Kiểm tra danh mục nguồn $src_cat = DB::select("{$tbl_source}", "id={$src_catid}"); if ($src_cat) { if ($src_cat && $src_cat['parent_id']) { //DM cấp 2 /*$src_l1_catid = $src_cat['parent_id']; $src_l2_catid = $src_catid; */ $src_cat_parent = DB::select("{$tbl_source}", "id={$src_cat['id']}"); if (!$src_cat_parent || $src_cat_parent && $src_cat_parent['parent_id']) { //DM cấp 3 $src_l1_catid = $src_cat_parent['parent_id']; $src_l2_catid = $src_cat['parent_id']; $src_l3_catid = $src_catid; } else { $src_l1_catid = $src_cat['parent_id']; $src_l2_catid = $src_catid; } } else { $src_l1_catid = $src_catid; } } } $des_catid = (int) AZLib::getParam('desCategories'); $search_result = false; $items = array(); $total = 0; if ($keywords) { //Nếu tìm theo từ khóa $q = $keywords; $mode = SPH_MATCH_ALL; //Init config $host = SPHINX_SERVER; $port = SPHINX_PORT; $index = SPHINX_INDEX; $ranker = SPH_RANK_PROXIMITY_BM25; $cl = new SphinxClient(); $cl->SetServer($host, $port); $cl->SetConnectTimeout(1); $cl->_limit = 50000; $cl->_maxmatches = 50000; $cl->SetWeights(array(100, 1)); $cl->SetMatchMode($mode); if ($src_l2_catid) { $cl->SetFilter('category_id', array($src_catid)); } elseif ($src_l1_catid) { $cl->SetFilter('level_1_catid', array($src_catid)); } //$cl->SetLimits( $offset , $limit, 10000 ); $cl->SetRankingMode($ranker); $cl->SetArrayResult(true); $res = $cl->Query($q, $index); if ($res && isset($res["matches"])) { if (is_array($res["matches"])) { $itemIDs = ''; $count = 0; foreach ($res["matches"] as $results) { $itemIDs .= ($itemIDs != '' ? ',' : '') . $results['id']; } if ($itemIDs != '') { //Đếm lại số bản ghi chính xác $sql = 'SELECT count(*) AS totalItem FROM item WHERE id IN(' . $itemIDs . ')'; if ($src_catid) { if ($src_l3_catid) { // Nếu tìm kiếm theo từ khóa trong danh mục cấp 3 $sql .= ' AND category_id = ' . $src_l3_catid; } elseif ($src_l2_catid) { // Nếu tìm kiếm theo từ khóa trong danh mục nào đó $sql .= ' AND level_2_catid = ' . $src_l2_catid; } elseif ($src_l1_catid) { $sql .= ' AND level_1_catid = ' . $src_l1_catid; } } if ($des_catid) { $sql .= ' AND category_id != ' . $des_catid; } $re = DB::Query($sql); if ($re) { $row = mysql_fetch_assoc($re); $total += (int) $row['totalItem']; } $display->add('itemids', $itemIDs); } } } } elseif ($src_catid) { // Nếu giới hạn theo danh mục $sql = "SELECT count(*) AS itemTotal FROM item"; if ($src_l3_catid) { $sql .= ' WHERE category_id = ' . $src_l3_catid; } elseif ($src_l2_catid) { $sql .= ' WHERE level_3_category_id = ' . $src_l2_catid; } elseif ($src_l1_catid) { $sql .= ' WHERE level_1_catid = ' . $src_l1_catid; } $re = DB::query($sql); if ($re) { $row = mysql_fetch_assoc($re); $total = $row['itemTotal']; } } $this->beginForm(); //Build source categories list $cat_search_name = ''; $re = DB::query("SELECT id,name,parent_id ,position,status FROM {$tbl_source} ORDER BY parent_id,position"); $all_cats = array(); $all_subcats = array(); if ($re) { while ($cat = mysql_fetch_assoc($re)) { if ($cat['parent_id']) { //Là danh mục cấp 2 if (isset($all_cats[$cat['parent_id']]) && $all_cats[$cat['parent_id']]['parent_id'] == 0) { //Là danh mục cấp 2 $all_subcats[$cat['parent_id']][$cat['id']] = $cat; } } else { if (!isset($all_subcats[$cat['id']])) { $all_subcats[$cat['id']] = array(); } } $all_cats[$cat['id']] = $cat; } } $all_top_cat = array(); $all_top_cat[0] = 'Tất cả các danh mục'; foreach ($all_subcats as $topid => $subcats) { if ($src_catid && $src_catid == $topid) { $cat_search_name = $all_cats[$topid]['name']; } if ($all_cats[$topid]['status'] == 'HIDE') { $all_cats[$topid]['name'] .= ' (ẨN)'; } $all_top_cat[$topid] = $all_cats[$topid]['name']; foreach ($subcats as $subcat) { if ($src_catid && $src_catid == $subcat['id']) { $cat_search_name = $subcat['name']; } if ($subcat['status'] == 'HIDE') { $subcat['name'] .= ' (ẨN)'; } $all_top_cat[$subcat['id']] = " - " . $subcat['name']; } } //print_r($all_top_cat); $display->add('msg', $this->showFormSuccesMessages(1)); $display->add('sourceCategories', $all_top_cat); //Build destination categories list $re = DB::query("SELECT id,name,parent_id,status,position FROM category ORDER BY parent_id,position"); $all_cats = array(); $all_subcats = array(); $level1_cats = array(); $level2_cats = array(); $level3_cats = array(); if ($re) { while ($cat = mysql_fetch_assoc($re)) { if ($cat['parent_id']) { //Là danh mục cấp 2 hoặc 3 if (isset($all_cats[$cat['parent_id']]) && $all_cats[$cat['parent_id']]['parent_id'] == 0) { //Là danh mục cấp 2 $all_subcats[$cat['parent_id']][$cat['id']] = $cat; $cat['max'] = 0; if ($cat['position'] > $level1_cats[$cat['parent_id']]['max']) { $level1_cats[$cat['parent_id']]['max'] = $cat['position']; } $level2_cats[$cat['id']] = $cat; } else { //là danh mục cấp 3 if ($cat['position'] > $level2_cats[$cat['parent_id']]['max']) { $level2_cats[$cat['parent_id']]['max'] = $cat['position']; } $level3_cats[$all_cats[$cat['parent_id']]['parent_id']][$cat['parent_id']][$cat['id']] = $cat; } } else { $cat['max'] = 0; $level1_cats[$cat['id']] = $cat; if (!isset($all_subcats[$cat['id']])) { $all_subcats[$cat['id']] = array(); } } $all_cats[$cat['id']] = $cat; } } $all_top_cat = array(); $categories = array(); foreach ($all_subcats as $topid => $subcats) { if ($all_cats[$topid]['status'] == 'HIDE') { $all_cats[$topid]['name'] .= ' (ẨN)'; } $categories[$topid] = $all_cats[$topid]; $all_top_cat[$topid] = $all_cats[$topid]['name']; foreach ($subcats as $subcat) { if ($subcat['status'] == 'HIDE') { $subcat['name'] .= ' (ẨN)'; } $all_top_cat[$subcat['id']] = " - " . $subcat['name']; $categories[$subcat['id']] = $subcat; if (isset($level2_cats[$subcat['id']]) && $level2_cats[$subcat['id']]['max']) { $subcatsl3 = $level3_cats[$subcat['parent_id']][$subcat['id']]; foreach ($subcatsl3 as $subcatl3) { if ($subcatl3['status'] == 'HIDE') { $subcatl3['name'] .= ' (ẨN)'; } $all_top_cat[$subcatl3['id']] = " + " . $subcatl3['name']; $subcatl3['parent_id'] .= ',' . $subcat['parent_id']; $categories[$subcatl3['id']] = $subcatl3; } } } } $display->add('desCategories', $all_top_cat); $display->add('desJSONCategories', json_encode($categories)); $display->add("allrecord", $total); $display->add('keywords', $keywords); $display->add('cat_search_id', $src_catid); $display->add('cat_search_name', $cat_search_name); $display->add('category_id', $des_catid); $display->output("ManageContentCategory"); $this->endForm(); }
$prices[$k] = number_format($r['price_mopt'], 0, ".", ""); } } } // Поиск Sphinx ============================================ } elseif ($GLOBALS['CONFIG']['search_engine'] == 'sphinx') { // Инициализация соединения со Sphinx $sphinx = new SphinxClient(); // $sphinx->SetServer("localhost", 9312); $sphinx->SetServer('31.131.16.159', 9312); $sphinx->SetConnectTimeout(1); $sphinx->SetArrayResult(true); $sphinx->setMaxQueryTime(100); $sphinx->setLimits(0, 10000); $sphinx->SetSortMode(SPH_SORT_RELEVANCE); $sphinx->SetRankingMode(SPH_RANK_PROXIMITY_BM25); // разбор строки запроса if (ctype_digit($query)) { $result = $sphinx->Query($query, 'art' . $GLOBALS['CONFIG']['search_index_prefix']); } else { $words = explode(' ', $query); $i = 0; foreach ($words as &$w) { if (strlen($w) > 2) { $sphinx->SetMatchMode(SPH_MATCH_ALL); $result = $sphinx->Query('( ' . $w . ' | ' . $w . '* | *' . $w . '* | *' . $w . ' ) ', 'name' . $GLOBALS['CONFIG']['search_index_prefix']); if ($result['total'] == 0) { $w = Transliterate($w); $res = $sphinx->Query('( ' . $w . ' | ' . $w . '* | *' . $w . '* | *' . $w . ' ) ', 'name' . $GLOBALS['CONFIG']['search_index_prefix']); if ($res['total'] == 0) { unset($words[$i]);
public function run($subject_id, $clean = true, $query_offset = 0, $from, $to) { $this->load->helper('sphinxapi'); $this->load->helper('mood'); // skip if matching_status is "matching" $matching_status = $this->custom_model->get_value('subject', 'matching_status', $subject_id); if ($matching_status == 'matching') { echo "subject is matching"; return false; } // flag subject as matching.. do other bot runs this queue. //$this->db->update('subject',array('matching_status'=>'matching'),array('id'=>$subject_id)); // clear all match record for this subject $config['hostname'] = "192.168.1.102"; $config['username'] = "******"; $config['password'] = "******"; $config['database'] = "thothconnect"; $config['dbdriver'] = "mysql"; $config['dbprefix'] = ""; $config['pconnect'] = FALSE; $config['db_debug'] = TRUE; $config['cache_on'] = FALSE; $config['cachedir'] = ""; $config['char_set'] = "utf8"; $config['dbcollat'] = "utf8_general_ci"; $thothconnect_db = $this->load->database($config, true); $query = $this->db->query("SELECT client_id FROM subject WHERE id = " . $subject_id); $row = $query->row(); $client_id = $row->client_id; if ($clean) { $thothconnect_db->delete('website_c' . $client_id, array('subject_id' => $subject_id)); $thothconnect_db->delete('twitter_c' . $client_id, array('subject_id' => $subject_id)); $thothconnect_db->delete('facebook_c' . $client_id, array('subject_id' => $subject_id)); } // // begin re-matching this subject // // get search string from subject_id $query = $this->custom_model->get_value('subject', 'query', $subject_id); // sphinx init $cl = new SphinxClient(); $q = $query; $sql = ""; $mode = SPH_MATCH_EXTENDED; $host = "192.168.1.102"; $port = 9312; $index = "*"; $groupby = ""; $groupsort = "@group desc"; $filter = "group_id"; $filtervals = array(); $distinct = ""; $sortby = "@id ASC"; $sortexpr = ""; $offset = $query_offset; $limit = 1000000; $ranker = SPH_RANK_PROXIMITY_BM25; $select = ""; echo 'limit=' . $limit . ' offset=' . $offset . PHP_EOL; //Extract subject keyword from search string $keywords = get_keywords($q); //////////// // do query //////////// $cl->SetServer($host, $port); $cl->SetConnectTimeout(1); $cl->SetArrayResult(true); $cl->SetWeights(array(100, 1)); $cl->SetMatchMode($mode); // if ( count($filtervals) ) $cl->SetFilter ( $filter, $filtervals ); // if ( $groupby ) $cl->SetGroupBy ( $groupby, SPH_GROUPBY_ATTR, $groupsort ); if ($sortby) { $cl->SetSortMode(SPH_SORT_EXTENDED, $sortby); } // if ( $sortexpr ) $cl->SetSortMode ( SPH_SORT_EXPR, $sortexpr ); if ($distinct) { $cl->SetGroupDistinct($distinct); } if ($select) { $cl->SetSelect($select); } if ($limit) { $cl->SetLimits(0, $limit, $limit > 1000000 ? $limit : 1000000); } $cl->SetRankingMode($ranker); $res = $cl->Query($q, $index); //$res = true; //////////// // do Insert to DB //////////// // Current matching $current_matching = array(); /*$query_matchs = $this->db->get_where('matchs',array('subject_id'=>$subject_id)); if($query_matchs->num_rows() > 0) { echo PHP_EOL.'currents matching :'.$query_matchs->num_rows(); foreach($query_matchs->result() as $match) { $current_matching[] = $match->post_id; } }*/ // set matching date range from-to $from = strtotime($from); $to = strtotime($to); // Search and Update if ($res === false) { echo "Query failed: " . $cl->GetLastError() . ".\n"; } else { if ($cl->GetLastWarning()) { echo "WARNING: " . $cl->GetLastWarning() . "\n\n"; } echo "Query '{$q}' \nretrieved {$res['total']} of {$res['total_found']} matches in {$res['time']} sec.\n"; if ($res['total'] == 0) { echo "no result<br/>\n"; } else { if ($res['total'] > $limit + $offset) { $this->run($subject_id, $limit + $offset); } else { echo "Updating..."; foreach ($res["matches"] as $k => $docinfo) { // echo '('.$k.')'.$docinfo["id"]." "; // Reset PHP Timeout to 1min // if found in $current_matching then skip if (in_array($docinfo["id"], $current_matching)) { continue; } else { // else insert new match set_time_limit(60); $post = new Post_model(); $post->init($docinfo["id"]); // if post_date is our of range then skip $post_date = strtotime($post->post_date); if ($post_date < $from || $post_date > $to) { continue; } $mood = get_mood($post->body, $keywords); //----------------------------------------------------- $subject = $post->get_subject($subject_id); //print_r($subject); if ($post->type == "post" || $post->type == "comment") { $postData = $post->get_post_website($post->id); if ($postData != null) { $data = array(); $data["post_id"] = $postData->post_id; $data["post_date"] = $postData->post_date; $data["title"] = $postData->title; $data["body"] = $postData->body; $data["type"] = $postData->type; $data["author_id"] = $postData->author_id; $data["author"] = $postData->author; $data["website_id"] = $postData->website_id; $data["website_name"] = $postData->website_name; $data["website_cate_id"] = $postData->website_cate_id; $data["website_cate"] = $postData->website_cate; $data["website_type_id"] = $postData->website_type_id; $data["website_type"] = $postData->website_type; $data["group_id"] = $subject->group_id; $data["group"] = $subject->group; $data["url"] = substr($postData->root_url, 0, -1) . "" . $postData->url; $data["page_id"] = $postData->page_id; $data["subject_id"] = $subject->subject_id; $data["subject_name"] = $subject->subject_name; $data["mood"] = $mood; $data["mood_by"] = 'system'; $thothconnect_db->insert("website_c" . $subject->client_id, $data); $post->insert_post_comment($postData->page_id, $subject->client_id, $thothconnect_db); } } else { if ($post->type == "tweet" || $post->type == "retweet") { $postData = $post->get_post_twitter($post->id); if ($postData != null) { $data = array(); $data["post_id"] = $postData->post_id; $data["post_date"] = $postData->post_date; $data["body"] = $postData->body; $data["type"] = $postData->type; $data["author_id"] = $postData->author_id; $data["author"] = $postData->author; $data["group_id"] = $subject->group_id; $data["group"] = $subject->group; $data["tweet_id"] = $postData->tweet_id; $data["subject_id"] = $subject->subject_id; $data["subject_name"] = $subject->subject_name; $data["mood"] = $mood; $data["mood_by"] = 'system'; $thothconnect_db->insert("twitter_c" . $subject->client_id, $data); } } else { if ($post->type == "fb_post" || $post->type == "fb_comment") { $postData = $post->get_post_facebook($post->id); if ($postData != null) { $data = array(); $data["post_id"] = $postData->post_id; $data["post_date"] = $postData->post_date; $data["body"] = $postData->body; $data["type"] = $postData->type; $data["author_id"] = $postData->author_id; $data["author"] = $postData->author; $data["group_id"] = $subject->group_id; $data["group"] = $subject->group; $data["facebook_page_id"] = $postData->facebook_page_id; $data["facebook_page_name"] = $postData->facebook_page_name; $data["subject_id"] = $subject->subject_id; $data["subject_name"] = $subject->subject_name; $data["facebook_id"] = $postData->facebook_id; $data["parent_post_id"] = $postData->parent_post_id; $data["likes"] = $postData->likes; $data["shares"] = $postData->shares; $data["mood"] = $mood; $data["mood_by"] = 'system'; $thothconnect_db->insert("facebook_c" . $subject->client_id, $data); } } } } /* $data = array( 'post_id'=> $post->id, 'subject_id' => $subject_id , 'matching_date' => null, 'sentiment' => $mood, 'by' => 'system', 'system_correct' => $mood, 'system_correct_date' => mdate('%Y-%m-%d %H:%i',time()) ); $this->db->insert('matchs',$data); */ //--------------------------------------- } } } } } // flag subject as update.. $data = array('matching_status' => 'update', 'latest_matching' => mdate('%Y-%m-%d %H:%i:%s', time()), 'from' => mdate('%Y-%m-%d %H:%i:%s', $from), 'to' => mdate('%Y-%m-%d %H:%i:%s', $to)); $this->db->update('subject', $data, array('id' => $subject_id)); }
<?php require "spec/fixtures/sphinxapi.php"; $cl = new SphinxClient(); $cl->SetRankingMode(SPH_RANK_FIELDMASK); $cl->Query('query');
/** * Set ranking mode. * * @param int $ranker The ranker mode to be used. * @param string $rankexpr The algebraic expression used for ranking. */ public function setRankingMode($ranker, $rankexpr = "") { $this->sphinx->SetRankingMode($ranker, $rankexpr); }
/** * 全文搜索 * */ protected function full_search($search_txt, $type) { $conf = C('fullindexer'); $cl = new SphinxClient(); $cl->SetServer($conf['host'], $conf['port']); $cl->SetConnectTimeout(1); $cl->SetArrayResult(true); $cl->SetRankingMode($conf['rankingmode'] ? $conf['rankingmode'] : 0); $cl->setLimits(0, $conf['querylimit']); $matchmode = $conf['matchmode']; $cl->setMatchMode($matchmode); $res = $cl->Query($search_txt, $conf[$type]); if ($res) { if (is_array($res['matches'])) { foreach ($res['matches'] as $value) { $matchs_id[] = $value['id']; } } } return is_array($matchs_id) ? implode(',', $matchs_id) : ''; }
fclose($file); $client->ResetGroupBy(); // weights $client->SetWeights(array(100, 1)); $file = fopen("spec/fixtures/data/weights.bin", "w"); fwrite($file, $client->_reqs[$client->AddQuery("test ")]); fclose($file); $client->SetWeights(array()); // anchor $client->SetGeoAnchor("latitude", "longitude", 10.0, 95.0); $file = fopen("spec/fixtures/data/anchor.bin", "w"); fwrite($file, $client->_reqs[$client->AddQuery("test ")]); fclose($file); $client->ResetFilters(); // rank_mode $client->SetRankingMode(SPH_RANK_WORDCOUNT); $file = fopen("spec/fixtures/data/rank_mode.bin", "w"); fwrite($file, $client->_reqs[$client->AddQuery("test ")]); fclose($file); $client->SetRankingMode(SPH_RANK_PROXIMITY_BM25); // index_weights $client->SetIndexWeights(array("people" => 101)); $file = fopen("spec/fixtures/data/index_weights.bin", "w"); fwrite($file, $client->_reqs[$client->AddQuery("test ")]); fclose($file); $client->SetIndexWeights(array()); // index_weights $client->SetFieldWeights(array("city" => 101)); $file = fopen("spec/fixtures/data/field_weights.bin", "w"); fwrite($file, $client->_reqs[$client->AddQuery("test ")]); fclose($file);
if ($sortby) { $cl->SetSortMode(SPH_SORT_EXTENDED, $sortby); } if ($sortexpr) { $cl->SetSortMode(SPH_SORT_EXPR, $sortexpr); } if ($distinct) { $cl->SetGroupDistinct($distinct); } if ($select) { $cl->SetSelect($select); } if ($limit) { $cl->SetLimits(0, $limit, $limit > 1000 ? $limit : 1000); } $cl->SetRankingMode($ranker); $res = $cl->Query($q, $index); //////////////// // print me out //////////////// if ($res === false) { print "Query failed: " . $cl->GetLastError() . ".\n"; } else { if ($cl->GetLastWarning()) { print "WARNING: " . $cl->GetLastWarning() . "\n\n"; } print "Query '{$q}' retrieved {$res['total']} of {$res['total_found']} matches in {$res['time']} sec.\n"; print "Query stats:\n"; if (is_array($res["words"])) { foreach ($res["words"] as $word => $info) { print " '{$word}' found {$info['hits']} times in {$info['docs']} documents\n";
/** * 全文搜索 * */ private function full_search($search_txt) { $conf = C('fullindexer'); uk86_import('libraries.sphinx'); $cl = new SphinxClient(); $cl->SetServer($conf['host'], $conf['port']); $cl->SetConnectTimeout(1); $cl->SetArrayResult(true); $cl->SetRankingMode($conf['rankingmode'] ? $conf['rankingmode'] : 0); $cl->setLimits(0, $conf['querylimit']); $matchmode = $conf['matchmode']; $cl->setMatchMode($matchmode); //可以使用全文搜索进行状态筛选及排序,但需要经常重新生成索引,否则结果不太准,所以暂不使用。使用数据库,速度会慢些 // $cl->SetFilter('store_state',array(1),false); // if ($_GET['key'] == 'store_credit'){ // $order = $_GET['order'] == 'desc' ? SPH_SORT_ATTR_DESC : SPH_SORT_ATTR_ASC; // $cl->SetSortMode($order,'store_sort'); // } $res = $cl->Query($search_txt, $conf['index_shop']); if ($res) { if (is_array($res['matches'])) { foreach ($res['matches'] as $value) { $matchs_id[] = $value['id']; } } } if ($search_txt != '') { $condition['store.store_id'] = array('in', $matchs_id); } return $condition; }
function draw2() { $keywords = AZLib::getParam('keywords'); $total_item = 0; $search_result = false; $items = array(); $paging = ''; $cmd = ''; $cat_search_id = 0; $item_array = array(); $listCat = array(); if ($keywords) { //AZLib::getCats(); require "./includes/sphinxapi.class.php"; foreach (CGlobal::$allCategories as $value) { if ($value['parent_id'] == 0) { $cat_list[$value['id']] = $value['brief_name']; } } $category = $this->getTotalPerCategory($keywords); foreach ($category as $row) { $row['brief_name'] = isset($cat_list[$row['level_1_catid']]) && $cat_list[$row['level_1_catid']] ? $cat_list[$row['level_1_catid']] : "Khác"; $listCat[$row['level_1_catid']] = array("level_1_catid" => $row["level_1_catid"], "brief_name" => $row['brief_name'], "count_ad" => $row['@count']); } $total = 0; $catid = 0; $catActive = ''; $total_cat = 0; if ($listCat) { $first_val = array_slice($listCat, 0, 1); $total = $first_val[0]['count_ad']; $catid = $first_val[0]['level_1_catid']; $catActive = $first_val[0]['brief_name']; $total_cat = count($listCat); } $i = 0; $allrecord = 0; $otherCat = ''; $cat_content = ""; foreach ($listCat as $cat) { if ($i < 3) { $active = $i == 0 ? "class=\"active\"" : ""; $cat_content .= "<li id=\"tab_{$i}\" {$active} onclick=\"javascript:acive_tab_cat(this);\"><a href=\"javascript:void(0);\" onclick=\"javascript:search_cat({$cat['level_1_catid']},{$cat['count_ad']},1,0);\"><span id=\"kby_{$cat['level_1_catid']}\">" . $cat['brief_name'] . " <font style=\"color: #5a7e92;font-weight: normal;\">(" . $cat['count_ad'] . ")</font></span></a></li>"; } else { $otherCat .= "<div class=\"other\"><a href=\"javascript:void(0);\" onclick=\"javascript:search_cat({$cat['level_1_catid']},{$cat['count_ad']},1,0);acive_tab_cat(this);\" id=\"tab_{$i}\"><span id=\"kby_{$cat['level_1_catid']}\">" . $cat['brief_name'] . " <font style=\"color: #5a7e92;font-weight: normal;\">(" . $cat['count_ad'] . ")</font></span></a></div>"; } $i++; $allrecord = $allrecord + $cat['count_ad']; } $display->add("cat_content", $cat_content); $display->add("CatActiveId", $catid); $display->add("catActive", $catActive); $display->add("listCat", $listCat); $display->add("allrecord", $allrecord); $display->add("otherCat", str_replace(array(chr(13), chr(10)), "", $otherCat)); $display->add("total_cat", $total_cat); //Init for sphinx search paging $pager = new Pager(); //config $limit = SEARCH_LIMIT; $pager->type = "search"; $pager->catid = $catid; $pager->total = $total; $pager->limit = $limit; $pager->page_param = 'page'; $pager->page = 1; $offset = $pager->get_offset(); $limit_from = $pager->limit_from(); $limit_to = $pager->limit_to(); //Sphinx search by Nova $q = $keywords; $mode = SPH_MATCH_EXTENDED2; //Init config $host = SPHINX_SERVER; $port = SPHINX_PORT; //$index = SPHINX_INDEX; $index = "enbac delta"; $filtervals = array(); $ranker = SPH_RANK_WORDCOUNT; $cl = new SphinxClient(); $cl->SetServer($host, $port); $cl->SetConnectTimeout(1); $cl->SetWeights(array(100, 1)); $cl->SetMatchMode($mode); //filter if ($catid) { $cl->SetFilter('level_1_catid', array($catid)); } $cl->SetFilter('status', array('1')); $cl->SetFieldWeights(array('user_name' => 10000, 'name' => 1000, 'description' => 1)); //$cl->SetSortMode( SPH_SORT_EXTENDED, 'up_time DESC' ); //$cl->SetSortMode( SPH_SORT_RELEVANCE);//Sort theo kq chính xác nhất //$cl->SetSortMode ( SPH_SORT_EXPR, "@weight + ( user_karma + ln(pageviews) )*0.1"); $cl->SetSortMode(SPH_SORT_EXPR, "@weight"); //Sort theo trọng số //SPH_RANK_WORDCOUNT //SPH_MATCH_EXTENDED2 //end filter $cl->SetLimits($offset, $limit, 10000); $cl->SetRankingMode($ranker); $cl->SetArrayResult(true); $res = $cl->Query($q, $index); /*echo '<pre>'; print_r($res["matches"]);*/ if ($res && isset($res["matches"])) { if (is_array($res["matches"])) { foreach ($res["matches"] as $results) { $list_item_id[] = $results['id']; } } $comma_separated = join(",", $list_item_id); } if ($total) { if ($limit_to > $total) { $limit_to = $total; } $comma_separated = join(",", $list_item_id); if ($comma_separated) { //$sql = "SELECT id,name,up_time,price,user_id,user_name, level_1_catid,category_id,description,img_url, img_server FROM item WHERE id IN($comma_separated) AND status=1 ORDER BY up_time DESC"; //$sql = "SELECT id,name,up_time,price,user_id,user_name, level_1_catid,category_id,description,img_url, img_server FROM item WHERE id IN($comma_separated) AND status=1 AND state=0 ORDER BY find_in_set(id,'$comma_separated')"; $sql = "SELECT id,name,up_time,price,user_id,user_name, level_1_catid,category_id,description,img_url, img_server FROM item WHERE id IN({$comma_separated}) AND status=1 ORDER BY find_in_set(id,'{$comma_separated}')"; $search_result = DB::query($sql); $pager->total = $total; $paging = $pager->page_link(); } } } $highlight = ''; if ($keywords) { $highlight = $str_search = str_replace(array('+', '/', '|', '-', '*'), "", $keywords); $highlight = AZLib::trimSpace($highlight); $highlight = str_replace("'", '', $highlight); $highlight = str_replace("'", '', $highlight); $highlight = str_replace(""", '', $highlight); } $highlight1 = ''; if ($highlight) { $arr = explode(' ', $highlight); if ($arr) { $highlight = ""; foreach ($arr as $word) { $highlight = ($highlight ? $highlight . ', ' : '') . "'{$word}'"; $highlight1 = ($highlight1 ? $highlight1 . ',' : '') . $word; } } } if ($keywords && $search_result) { while ($item = mysql_fetch_assoc($search_result)) { $item['profile_url'] = WEB_DIR . $item['user_name']; $item['name_hl'] = AZLib::HighLightKeyword(strip_tags(AZLib::filter_title($item['name'])), $highlight1); $item_time = TIME_NOW - $item['up_time']; //neu nho hon 1h thi tinh ra phut if ($item_time < 3600) { $item['item_time'] = floor($item_time / 60) . " phút trước đây"; } elseif ($item_time < 86400) { $item['item_time'] = floor($item_time / 3600) . " giờ trước đây"; } else { $item['item_time'] = date('\\n\\gà\\y j \\t\\há\\n\\g n', $item['up_time']); } $item['description'] = AZLib::HighLightKeyword(AZLib::delDoubleSpace(AZLib::trimSpace(strip_tags(AZLib::post_db_parse_html(preg_replace('/\\[[0-9]{1,3}\\]/', '', $item['description']))))), $highlight1, 35, "background:yellow;font-size:14px;font-weight:bold;color:blue;"); $ebname = AZLib::safe_title($item['name']); $ebname_tmp = substr(AZLib::safe_title($item['name']), 0, 20); if (isset(CGlobal::$allCategories[$item['category_id']])) { $item['item_url'] = WEB_DIR . AZRewrite::formatUrl('?page=item_detail&id=' . $item['id'] . '&ebname=' . $ebname . '&nice_name=' . CGlobal::$allCategories[$item['category_id']]['nice_name']); $item['item_url_tmp'] = WEB_ROOT . CGlobal::$allCategories[$item['category_id']]['nice_name'] . '/p' . $item['id'] . '/' . $ebname_tmp . '...'; } else { $item['item_url'] = WEB_DIR . AZRewrite::formatUrl('?page=item_detail&id=' . $item['id'] . '&ebname=' . $ebname); $item['item_url_tmp'] = WEB_ROOT . 'p' . $item['id'] . '/' . $ebname_tmp . '...'; } if ($item['img_url']) { $item['img_url'] = AZLib::getImageThumb($item['img_url'], 110, 0, 1, $item['img_server']); } $item['price'] = number_format($item['price'], 0, ',', '.'); $item_array[] = $item; } } global $start_rb; $mtime = microtime(); $mtime = explode(" ", $mtime); $mtime = $mtime[1] + $mtime[0]; $end_rb = $mtime; $search_time = round($end_rb - $start_rb, 3); $display->add('limit_from', $limit_from); $display->add('limit_to', $limit_to); $display->add('search_time', $search_time); $display->add('keywords', $keywords); $display->add('base_url', WEB_ROOT); $display->add('highlight', $highlight); $display->add('total_item_cat', $total); $display->add('name_item_cat', $catActive); $display->add('block_id', Module::$block_id); $display->add('paging', $paging); $display->add('items', $item_array); $display->output('sphinx_search'); }
function do_query($search_str) { //$tmp_var = array(array('itemName' => "test1"), array('itemName' => "test2"), array('itemName' => "test3")); //echo implode(",",tmp_var); //echo json_encode($tmp_var); //return tmp_var; $q = ""; $sql = ""; $mode = SPH_MATCH_ALL; $host = "localhost"; $port = 9312; $index = "*"; $groupby = ""; $groupsort = "@group desc"; $filter = "group_id"; $filtervals = array(); $distinct = ""; $sortby = ""; $sortexpr = ""; $limit = 20; $ranker = SPH_RANK_PROXIMITY_BM25; $select = "*"; $cl = new SphinxClient(); $cl->SetServer($host, $port); $cl->SetConnectTimeout(1); $cl->SetArrayResult(true); $cl->SetWeights(array(100, 1)); $cl->SetMatchMode($mode); if (count($filtervals)) { $cl->SetFilter($filter, $filtervals); } if ($groupby) { $cl->SetGroupBy($groupby, SPH_GROUPBY_ATTR, $groupsort); } if ($sortby) { $cl->SetSortMode(SPH_SORT_EXTENDED, $sortby); } if ($sortexpr) { $cl->SetSortMode(SPH_SORT_EXPR, $sortexpr); } if ($distinct) { $cl->SetGroupDistinct($distinct); } if ($select) { $cl->SetSelect($select); } if ($limit) { $cl->SetLimits(0, $limit, $limit > 1000 ? $limit : 1000); } $cl->SetRankingMode($ranker); $res = $cl->Query($search_str, $index); //return $res; if (is_array($res["matches"])) { $results = array(); $n = 1; //print "Matches:\n"; foreach ($res["matches"] as $docinfo) { //print "$n. doc_id=$docinfo[id], weight=$docinfo[weight]"; $attr_array = array(); $results[$docinfo[id]]; foreach ($res["attrs"] as $attrname => $attrtype) { $value = $docinfo["attrs"][$attrname]; if ($attrtype == SPH_ATTR_MULTI || $attrtype == SPH_ATTR_MULTI64) { $value = "(" . join(",", $value) . ")"; } else { if ($attrtype == SPH_ATTR_TIMESTAMP) { $value = date("Y-m-d H:i:s", $value); } } $attr_array[$attrname] = $value; //print $value; } $results[$docinfo[id]] = $attr_array; $n++; //print implode("",$results)."\n"; } return $results; } }
function sphinx_search($query, $offset = 0, $limit = 30) { require_once 'lib/sphinxapi.php'; $sphinxClient = new SphinxClient(); $sphinxClient->SetServer('localhost', 9312); $sphinxClient->SetConnectTimeout(1); $sphinxClient->SetFieldWeights(array('title' => 70, 'content' => 30, 'feed_title' => 20)); $sphinxClient->SetMatchMode(SPH_MATCH_EXTENDED2); $sphinxClient->SetRankingMode(SPH_RANK_PROXIMITY_BM25); $sphinxClient->SetLimits($offset, $limit, 1000); $sphinxClient->SetArrayResult(false); $sphinxClient->SetFilter('owner_uid', array($_SESSION['uid'])); $result = $sphinxClient->Query($query, SPHINX_INDEX); $ids = array(); if (is_array($result['matches'])) { foreach (array_keys($result['matches']) as $int_id) { $ref_id = $result['matches'][$int_id]['attrs']['ref_id']; array_push($ids, $ref_id); } } return $ids; }
<?php require "sphinxapi.php"; $cl = new SphinxClient(); $cl->SetRankingMode(SPH_RANK_PROXIMITY); $cl->Query('query');
function setRankingMode($mode) { $this->sphinx->SetRankingMode($mode); return $this; }