phpbb\search\fulltext_sphinx::keyword_search PHP Method

    public function keyword_search($type, $fields, $terms, $sort_by_sql, $sort_key, $sort_dir, $sort_days, $ex_fid_ary, $post_visibility, $topic_id, $author_ary, $author_name, &$id_ary, &$start, $per_page)
    {
        global $user, $phpbb_log;
        // No keywords? No posts.
        if (!strlen($this->search_query) && !sizeof($author_ary)) {
            return false;
        }
        $id_ary = array();
        $join_topic = $type != 'posts';
        // Sorting
        if ($type == 'topics') {
            switch ($sort_key) {
                case 'a':
                    $this->sphinx->SetGroupBy('topic_id', SPH_GROUPBY_ATTR, 'poster_id ' . ($sort_dir == 'a' ? 'ASC' : 'DESC'));
                    break;
                case 'f':
                    $this->sphinx->SetGroupBy('topic_id', SPH_GROUPBY_ATTR, 'forum_id ' . ($sort_dir == 'a' ? 'ASC' : 'DESC'));
                    break;
                case 'i':
                case 's':
                    $this->sphinx->SetGroupBy('topic_id', SPH_GROUPBY_ATTR, 'post_subject ' . ($sort_dir == 'a' ? 'ASC' : 'DESC'));
                    break;
                case 't':
                default:
                    $this->sphinx->SetGroupBy('topic_id', SPH_GROUPBY_ATTR, 'topic_last_post_time ' . ($sort_dir == 'a' ? 'ASC' : 'DESC'));
                    break;
            }
        } else {
            switch ($sort_key) {
                case 'a':
                    $this->sphinx->SetSortMode($sort_dir == 'a' ? SPH_SORT_ATTR_ASC : SPH_SORT_ATTR_DESC, 'poster_id');
                    break;
                case 'f':
                    $this->sphinx->SetSortMode($sort_dir == 'a' ? SPH_SORT_ATTR_ASC : SPH_SORT_ATTR_DESC, 'forum_id');
                    break;
                case 'i':
                case 's':
                    $this->sphinx->SetSortMode($sort_dir == 'a' ? SPH_SORT_ATTR_ASC : SPH_SORT_ATTR_DESC, 'post_subject');
                    break;
                case 't':
                default:
                    $this->sphinx->SetSortMode($sort_dir == 'a' ? SPH_SORT_ATTR_ASC : SPH_SORT_ATTR_DESC, 'post_time');
                    break;
            }
        }
        // Most narrow filters first
        if ($topic_id) {
            $this->sphinx->SetFilter('topic_id', array($topic_id));
        }
        $search_query_prefix = '';
        switch ($fields) {
            case 'titleonly':
                // Only search the title
                if ($terms == 'all') {
                    $search_query_prefix = '@title ';
                }
                // Weight for the title
                $this->sphinx->SetFieldWeights(array("title" => 5, "data" => 1));
                // 1 is first_post, 0 is not first post
                $this->sphinx->SetFilter('topic_first_post', array(1));
                break;
            case 'msgonly':
                // Only search the body
                if ($terms == 'all') {
                    $search_query_prefix = '@data ';
                }
                // Weight for the body
                $this->sphinx->SetFieldWeights(array("title" => 1, "data" => 5));
                break;
            case 'firstpost':
                // More relative weight for the title, also search the body
                $this->sphinx->SetFieldWeights(array("title" => 5, "data" => 1));
                // 1 is first_post, 0 is not first post
                $this->sphinx->SetFilter('topic_first_post', array(1));
                break;
            default:
                // More relative weight for the title, also search the body
                $this->sphinx->SetFieldWeights(array("title" => 5, "data" => 1));
                break;
        }
        if (sizeof($author_ary)) {
            $this->sphinx->SetFilter('poster_id', $author_ary);
        }
        // As this is not simply possible at the moment, we limit the result to approved posts.
        // This will make it impossible for moderators to search unapproved and softdeleted posts,
        // but at least it will also cause the same for normal users.
        $this->sphinx->SetFilter('post_visibility', array(ITEM_APPROVED));
        if (sizeof($ex_fid_ary)) {
            // All forums that a user is allowed to access
            $fid_ary = array_unique(array_intersect(array_keys($this->auth->acl_getf('f_read', true)), array_keys($this->auth->acl_getf('f_search', true))));
            // All forums that the user wants to and can search in
            $search_forums = array_diff($fid_ary, $ex_fid_ary);
            if (sizeof($search_forums)) {
                $this->sphinx->SetFilter('forum_id', $search_forums);
            }
        }
        $this->sphinx->SetFilter('deleted', array(0));
        $this->sphinx->SetLimits($start, (int) $per_page, SPHINX_MAX_MATCHES);
        $result = $this->sphinx->Query($search_query_prefix . str_replace('"', '"', $this->search_query), $this->indexes);
        // Could be connection to localhost:9312 failed (errno=111,
        // msg=Connection refused) during rotate, retry if so
        $retries = SPHINX_CONNECT_RETRIES;
        while (!$result && strpos($this->sphinx->GetLastError(), "errno=111,") !== false && $retries--) {
            usleep(SPHINX_CONNECT_WAIT_TIME);
            $result = $this->sphinx->Query($search_query_prefix . str_replace('"', '"', $this->search_query), $this->indexes);
        }
        if ($this->sphinx->GetLastError()) {
            $phpbb_log->add('critical', $user->data['user_id'], $user->ip, 'LOG_SPHINX_ERROR', false, array($this->sphinx->GetLastError()));
            if ($this->auth->acl_get('a_')) {
                trigger_error($this->user->lang('SPHINX_SEARCH_FAILED', $this->sphinx->GetLastError()));
            } else {
                trigger_error($this->user->lang('SPHINX_SEARCH_FAILED_LOG'));
            }
        }
        $result_count = $result['total_found'];
        if ($result_count && $start >= $result_count) {
            $start = floor(($result_count - 1) / $per_page) * $per_page;
            $this->sphinx->SetLimits((int) $start, (int) $per_page, SPHINX_MAX_MATCHES);
            $result = $this->sphinx->Query($search_query_prefix . str_replace('"', '"', $this->search_query), $this->indexes);
            // Could be connection to localhost:9312 failed (errno=111,
            // msg=Connection refused) during rotate, retry if so
            $retries = SPHINX_CONNECT_RETRIES;
            while (!$result && strpos($this->sphinx->GetLastError(), "errno=111,") !== false && $retries--) {
                usleep(SPHINX_CONNECT_WAIT_TIME);
                $result = $this->sphinx->Query($search_query_prefix . str_replace('"', '"', $this->search_query), $this->indexes);
            }
        }
        $id_ary = array();
        if (isset($result['matches'])) {
            if ($type == 'posts') {
                $id_ary = array_keys($result['matches']);
            } else {
                foreach ($result['matches'] as $key => $value) {
                    $id_ary[] = $value['attrs']['topic_id'];
                }
            }
        } else {
            return false;
        }
        $id_ary = array_slice($id_ary, 0, (int) $per_page);
        return $result_count;
    }