SetIDRange() public method

only match records if document ID is beetwen $min and $max (inclusive)
public SetIDRange ( $min, $max )
 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("*");
 }
示例#2
0
 /**
  * This has it's own custom search.
  *
  * @param mixed[] $search_params
  * @param mixed[] $search_words
  * @param string[] $excluded_words
  * @param int[] $participants
  * @param string[] $search_results
  */
 public function searchQuery($search_params, $search_words, $excluded_words, &$participants, &$search_results)
 {
     global $user_info, $context, $modSettings;
     // Only request the results if they haven't been cached yet.
     if (($cached_results = cache_get_data('search_results_' . md5($user_info['query_see_board'] . '_' . $context['params']))) === null) {
         // The API communicating with the search daemon.
         require_once SOURCEDIR . '/sphinxapi.php';
         // Create an instance of the sphinx client and set a few options.
         $mySphinx = new SphinxClient();
         $mySphinx->SetServer($modSettings['sphinx_searchd_server'], (int) $modSettings['sphinx_searchd_port']);
         $mySphinx->SetLimits(0, (int) $modSettings['sphinx_max_results'], (int) $modSettings['sphinx_max_results']);
         // Put together a sort string; besides the main column sort (relevance, id_topic, or num_replies),
         $search_params['sort_dir'] = strtoupper($search_params['sort_dir']);
         $sphinx_sort = $search_params['sort'] === 'id_msg' ? 'id_topic' : $search_params['sort'];
         // Add secondary sorting based on relevance value (if not the main sort method) and age
         $sphinx_sort .= ' ' . $search_params['sort_dir'] . ($search_params['sort'] === 'relevance' ? '' : ', relevance DESC') . ', poster_time DESC';
         // Include the engines weight values in the group sort
         $sphinx_sort = str_replace('relevance ', '@weight ' . $search_params['sort_dir'] . ', relevance ', $sphinx_sort);
         // Grouping by topic id makes it return only one result per topic, so don't set that for in-topic searches
         if (empty($search_params['topic'])) {
             $mySphinx->SetGroupBy('id_topic', SPH_GROUPBY_ATTR, $sphinx_sort);
         }
         // Set up the sort expresssion
         $mySphinx->SetSortMode(SPH_SORT_EXPR, '(@weight + (relevance / 1000))');
         // Update the field weights for subject vs body
         $mySphinx->SetFieldWeights(array('subject' => !empty($modSettings['search_weight_subject']) ? $modSettings['search_weight_subject'] * 200 : 1000, 'body' => 1000));
         // Set the limits based on the search parameters.
         if (!empty($search_params['min_msg_id']) || !empty($search_params['max_msg_id'])) {
             $mySphinx->SetIDRange($search_params['min_msg_id'], empty($search_params['max_msg_id']) ? (int) $modSettings['maxMsgID'] : $search_params['max_msg_id']);
         }
         if (!empty($search_params['topic'])) {
             $mySphinx->SetFilter('id_topic', array((int) $search_params['topic']));
         }
         if (!empty($search_params['brd'])) {
             $mySphinx->SetFilter('id_board', $search_params['brd']);
         }
         if (!empty($search_params['memberlist'])) {
             $mySphinx->SetFilter('id_member', $search_params['memberlist']);
         }
         // Construct the (binary mode & |) query while accounting for excluded words
         $orResults = array();
         $inc_words = array();
         foreach ($search_words as $orIndex => $words) {
             $inc_words = array_merge($inc_words, $words['indexed_words']);
             $andResult = '';
             foreach ($words['indexed_words'] as $sphinxWord) {
                 $andResult .= (in_array($sphinxWord, $excluded_words) ? '-' : '') . $this->_cleanWordSphinx($sphinxWord, $mySphinx) . ' & ';
             }
             $orResults[] = substr($andResult, 0, -3);
         }
         // If no search terms are left after comparing against excluded words (i.e. "test -test" or "test last -test -last"),
         // sending that to Sphinx would result in a fatal error
         if (!count(array_diff($inc_words, $excluded_words))) {
             // Instead, fail gracefully (return "no results")
             return 0;
         }
         $query = count($orResults) === 1 ? $orResults[0] : '(' . implode(') | (', $orResults) . ')';
         // Subject only searches need to be specified.
         if ($search_params['subject_only']) {
             $query = '@(subject) ' . $query;
         }
         // Choose an appropriate matching mode
         $mode = SPH_MATCH_ALL;
         // Over two words and searching for any (since we build a binary string, this will never get set)
         if (substr_count($query, ' ') > 1 && (!empty($search_params['searchtype']) && $search_params['searchtype'] == 2)) {
             $mode = SPH_MATCH_ANY;
         }
         // Binary search?
         if (preg_match('~[\\|\\(\\)\\^\\$\\?"\\/=-]~', $query)) {
             $mode = SPH_MATCH_EXTENDED;
         }
         // Set the matching mode
         $mySphinx->SetMatchMode($mode);
         // Execute the search query.
         $request = $mySphinx->Query($query, 'elkarte_index');
         // Can a connection to the daemon be made?
         if ($request === false) {
             // Just log the error.
             if ($mySphinx->GetLastError()) {
                 log_error($mySphinx->GetLastError());
             }
             fatal_lang_error('error_no_search_daemon');
         }
         // Get the relevant information from the search results.
         $cached_results = array('matches' => array(), 'num_results' => $request['total']);
         if (isset($request['matches'])) {
             foreach ($request['matches'] as $msgID => $match) {
                 $cached_results['matches'][$msgID] = array('id' => $match['attrs']['id_topic'], 'relevance' => round($match['attrs']['@count'] + $match['attrs']['relevance'] / 10000, 1) . '%', 'num_matches' => empty($search_params['topic']) ? $match['attrs']['@count'] : 0, 'matches' => array());
             }
         }
         // Store the search results in the cache.
         cache_put_data('search_results_' . md5($user_info['query_see_board'] . '_' . $context['params']), $cached_results, 600);
     }
     $participants = array();
     foreach (array_slice(array_keys($cached_results['matches']), $_REQUEST['start'], $modSettings['search_results_per_page']) as $msgID) {
         $context['topics'][$msgID] = $cached_results['matches'][$msgID];
         $participants[$cached_results['matches'][$msgID]['id']] = false;
     }
     // Sentences need to be broken up in words for proper highlighting.
     $search_results = array();
     foreach ($search_words as $orIndex => $words) {
         $search_results = array_merge($search_results, $search_words[$orIndex]['subject_words']);
     }
     return $cached_results['num_results'];
 }
示例#3
0
//Доступна только ему и админам
/*
if (substr($user_obj->tabs, 7, 1) == 0 && !(hasPermissions('users'))) 
{
    include ABS_PATH . '/404.php'; 
    exit;
}
*/
/**
 * Оставляем доступной карточку для всех 
 * если вкладка ТУ скрыта на время индексации каталога.
 */
if (substr($user_obj->tabs, 7, 1) == 0) {
    $sphinxClient = new SphinxClient();
    $sphinxClient->SetServer(SEARCHHOST, SEARCHPORT);
    $sphinxClient->SetIDRange($data['id'], $data['id']);
    $queryResult = $sphinxClient->Query('', 'tservices;delta_tservices');
    $in_catalog = isset($queryResult['matches'][$data['id']]);
    if (!$in_catalog && !$is_allow) {
        include ABS_PATH . '/404.php';
        exit;
    }
}
//------------------------------------------------------------------------------
$user_phone_block = user_phone::getInstance()->render(user_phone::PLACE_HEADER);
//------------------------------------------------------------------------------
$_SESSION['tu_ref_uri'] = @$_SESSION['ref_uri'];
//------------------------------------------------------------------------------
//Форматирование кол-ва отзывов
if ($data['total_feedbacks']) {
    $total = intval($data['total_feedbacks']);
示例#4
0
文件: id_range.php 项目: alpbs/sphinx
<?php

require "spec/fixtures/sphinxapi.php";
$cl = new SphinxClient();
$cl->SetIDRange(10, 20);
$cl->Query('query');
示例#5
0
 function setIDRange($min, $max)
 {
     $this->sphinx->SetIDRange($min, $max);
     return $this;
 }
error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING);
//require_once($_SERVER['DOCUMENT_ROOT'] . "/classes/stdf.php");
//require_once($_SERVER['DOCUMENT_ROOT'] . '/classes/stop_words.php' ); //???
//require_once($_SERVER['DOCUMENT_ROOT'] . "/classes/city.php");
//require_once($_SERVER['DOCUMENT_ROOT'] . "/classes/users.php");
require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/stdf.php";
require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/search/sphinxapi.php";
/*
$user_obj = new users();
var_dump($user_obj->CountAll());
*/
//http://beta.free-lance.lo/tu/1124752/empiricheskiy-grafik-funktsii-predposyilki-i-razvitie.html
$time_start = microtime(true);
$sphinxClient = new SphinxClient();
$sphinxClient->SetServer(SEARCHHOST, SEARCHPORT);
$sphinxClient->SetIDRange(1124752, 1124752);
$res = $sphinxClient->Query("", "tservices;delta_tservices");
/*
$sphinxClient = new SphinxClient;
$sphinxClient->SetServer(SEARCHHOST, SEARCHPORT);
$sphinxClient->setFilter('created_order', array(99999)); // это поле - алиас для ID чтобы сортировать можно было как в задаче требуется
$res = $sphinxClient->query('', "tservices;delta_tservices");
*/
$time_end = microtime(true);
$time = $time_end - $time_start;
print_r($res['matches'][1124752]);
var_dump($time);
/*
* $sphinx->SetIDRange(12345,12345);
$res = $sphinx->Query("","myindex");
if (count($res['matches']) == 1) {
示例#7
0
 public function searchQuery($search_params, $searchWords, $excludedIndexWords, &$participants, &$searchArray)
 {
     global $modSettings, $context, $sourcedir, $user_info, $scripturl;
     if (($cached_results = CacheAPI::getCache('search_results_' . md5($user_info['query_see_board'] . '_' . $context['params']))) === null) {
         require_once $sourcedir . '/contrib/sphinxapi.php';
         $mySphinx = new SphinxClient();
         $mySphinx->SetServer($modSettings['sphinx_searchd_server'], (int) $modSettings['sphinx_searchd_port']);
         $mySphinx->SetLimits(0, (int) $modSettings['sphinx_max_results']);
         $mySphinx->SetMatchMode(SPH_MATCH_BOOLEAN);
         if (!$search_params['show_complete']) {
             $mySphinx->SetGroupBy('ID_TOPIC', SPH_GROUPBY_ATTR);
         }
         $mySphinx->SetSortMode($search_params['sort_dir'] === 'asc' ? SPH_SORT_ATTR_ASC : SPH_SORT_ATTR_DESC, $search_params['sort'] === 'ID_MSG' ? 'ID_TOPIC' : $search_params['sort']);
         if (!empty($search_params['topic'])) {
             $mySphinx->SetFilter('ID_TOPIC', array((int) $search_params['topic']));
         }
         if (!empty($search_params['min_msg_id']) || !empty($search_params['max_msg_id'])) {
             $mySphinx->SetIDRange(empty($search_params['min_msg_id']) ? 0 : (int) $search_params['min_msg_id'], empty($search_params['max_msg_id']) ? (int) $modSettings['maxMsgID'] : (int) $search_params['max_msg_id']);
         }
         if (!empty($search_params['brd'])) {
             $mySphinx->SetFilter('ID_BOARD', $search_params['brd']);
         }
         if (!empty($search_params['prefix'])) {
             $mySphinx->SetFilter('ID_PREFIX', $search_params['prefix']);
         }
         if (!empty($search_params['memberlist'])) {
             $mySphinx->SetFilter('ID_MEMBER', $search_params['memberlist']);
         }
         $orResults = array();
         foreach ($searchWords as $orIndex => $words) {
             $andResult = '';
             foreach ($words['indexed_words'] as $sphinxWord) {
                 $andResult .= (in_array($sphinxWord, $excludedIndexWords) ? '-' : '') . $sphinxWord . ' & ';
             }
             $orResults[] = substr($andResult, 0, -3);
         }
         $query = count($orResults) === 1 ? $orResults[0] : '(' . implode(') | (', $orResults) . ')';
         // Execute the search query.
         $request = $mySphinx->Query($query, 'smf_index');
         // Can a connection to the deamon be made?
         if ($request === false) {
             fatal_lang_error('error_no_search_daemon');
         }
         // Get the relevant information from the search results.
         $cached_results = array('matches' => array(), 'num_results' => $request['total']);
         if (isset($request['matches'])) {
             foreach ($request['matches'] as $msgID => $match) {
                 $cached_results['matches'][$msgID] = array('id' => $match['attrs']['id_topic'], 'relevance' => round($match['attrs']['relevance'] / 10000, 1) . '%', 'matches' => array());
                 if (!$search_params['show_complete']) {
                     $cached_results['matches'][$msgID]['num_matches'] = $match['attrs']['@count'];
                 }
             }
         }
         CacheAPI::putCache('search_results_' . md5($user_info['query_see_board']) . '_' . $context['params'], $cached_results, 600);
     }
     foreach (array_slice(array_keys($cached_results['matches']), $_REQUEST['start'], $modSettings['search_results_per_page']) as $msgID) {
         $context['topics'][$msgID] = $cached_results['matches'][$msgID];
         $participants[$cached_results['matches'][$msgID]['id']] = false;
     }
     // Sentences need to be broken up in words for proper highlighting.
     foreach ($searchWords as $orIndex => $words) {
         $searchArray = array_merge($searchArray, $searchWords[$orIndex]['subject_words']);
     }
     // Now that we know how many results to expect we can start calculating the page numbers.
     $context['page_index'] = constructPageIndex($scripturl . '?action=search2;params=' . $context['params'], $_REQUEST['start'], $cached_results['num_results'], $modSettings['search_results_per_page'], false);
     return $cached_results['num_results'];
 }
示例#8
0
<?php

require "sphinxapi.php";
$cl = new SphinxClient();
$cl->SetIDRange(8589934591, 17179869183);
$cl->Query('query');
 public function searchQuery($search_params, $search_words, $excluded_words, &$participants, &$search_results)
 {
     global $user_info, $context, $sourcedir, $modSettings;
     // Only request the results if they haven't been cached yet.
     if (($cached_results = cache_get_data('search_results_' . md5($user_info['query_see_board'] . '_' . $context['params']))) === null) {
         //!!! Should this not be in here?
         // The API communicating with the search daemon.
         require_once $sourcedir . '/sphinxapi.php';
         // Create an instance of the sphinx client and set a few options.
         $mySphinx = new SphinxClient();
         $mySphinx->SetServer($modSettings['sphinx_searchd_server'], (int) $modSettings['sphinx_searchd_port']);
         $mySphinx->SetLimits(0, (int) $modSettings['sphinx_max_results']);
         $mySphinx->SetMatchMode(SPH_MATCH_EXTENDED);
         // Put together a sort string; besides the main column sort (relevance, id_topic, or num_replies), add secondary sorting based on relevance value (if not the main sort method) and age
         $sphinx_sort = ($search_params['sort'] === 'id_msg' ? 'id_topic' : $search_params['sort']) . ' ' . $search_params['sort_dir'] . ($search_params['sort'] === 'relevance' ? '' : ', relevance desc') . ', poster_time desc';
         // Grouping by topic id makes it return only one result per topic, so don't set that for in-topic searches
         if (empty($search_params['topic'])) {
             $mySphinx->SetGroupBy('id_topic', SPH_GROUPBY_ATTR, $sphinx_sort);
         }
         $mySphinx->SetSortMode(SPH_SORT_EXTENDED, $sphinx_sort);
         // Set the limits based on the search parameters.
         if (!empty($search_params['min_msg_id']) || !empty($search_params['max_msg_id'])) {
             $mySphinx->SetIDRange($search_params['min_msg_id'], empty($search_params['max_msg_id']) ? (int) $modSettings['maxMsgID'] : $search_params['max_msg_id']);
         }
         if (!empty($search_params['topic'])) {
             $mySphinx->SetFilter('id_topic', array((int) $search_params['topic']));
         }
         if (!empty($search_params['brd'])) {
             $mySphinx->SetFilter('id_board', $search_params['brd']);
         }
         if (!empty($search_params['memberlist'])) {
             $mySphinx->SetFilter('id_member', $search_params['memberlist']);
         }
         // Construct the (binary mode) query.
         $orResults = array();
         $inc_words = array();
         foreach ($search_words as $orIndex => $words) {
             $inc_words = array_merge($inc_words, $words['indexed_words']);
             $andResult = '';
             foreach ($words['indexed_words'] as $sphinxWord) {
                 $andResult .= (in_array($sphinxWord, $excluded_words) ? '-' : '') . smc_clean_word_sphinx($sphinxWord, $mySphinx) . ' & ';
             }
             $orResults[] = substr($andResult, 0, -3);
         }
         // If no search terms are left after comparing against excluded words (i.e. "test -test" or "test last -test -last"), sending that to Sphinx would result in a fatal error
         if (!count(array_diff($inc_words, $excluded_words))) {
             // Instead, fail gracefully (return "no results")
             return 0;
         }
         $query = count($orResults) === 1 ? $orResults[0] : '(' . implode(') | (', $orResults) . ')';
         // Subject only searches need to be specified.
         if ($search_params['subject_only']) {
             $query = '@(subject) ' . $query;
         }
         // Execute the search query.
         $request = $mySphinx->Query($query, 'smf_index');
         // Can a connection to the daemon be made?
         if ($request === false) {
             // Just log the error.
             if ($mySphinx->GetLastError()) {
                 log_error($mySphinx->GetLastError());
             }
             //echo 'error:'.$mySphinx->GetLastError();
             fatal_lang_error('error_no_search_daemon');
         }
         // Get the relevant information from the search results.
         $cached_results = array('matches' => array(), 'num_results' => $request['total']);
         if (isset($request['matches'])) {
             foreach ($request['matches'] as $msgID => $match) {
                 $cached_results['matches'][$msgID] = array('id' => $match['attrs']['id_topic'], 'relevance' => round($match['attrs']['relevance'] / 10000, 1) . '%', 'num_matches' => empty($search_params['topic']) ? $match['attrs']['@count'] : 0, 'matches' => array());
             }
         }
         // Store the search results in the cache.
         cache_put_data('search_results_' . md5($user_info['query_see_board'] . '_' . $context['params']), $cached_results, 600);
     }
     $participants = array();
     foreach (array_slice(array_keys($cached_results['matches']), $_REQUEST['start'], $modSettings['search_results_per_page']) as $msgID) {
         $context['topics'][$msgID] = $cached_results['matches'][$msgID];
         $participants[$cached_results['matches'][$msgID]['id']] = false;
     }
     // Sentences need to be broken up in words for proper highlighting.
     $search_results = array();
     foreach ($search_words as $orIndex => $words) {
         $search_results = array_merge($search_results, $search_words[$orIndex]['subject_words']);
     }
     return $cached_results['num_results'];
 }