⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 queryparser.php

📁 很棒的在线教学系统
💻 PHP
📖 第 1 页 / 共 2 页
字号:
     * @return string     */    public static function getDefaultEncoding()    {       return self::_getInstance()->_defaultEncoding;    }    /**     * Set default boolean operator     *     * @param integer $operator     */    public static function setDefaultOperator($operator)    {        self::_getInstance()->_defaultOperator = $operator;    }    /**     * Get default boolean operator     *     * @return integer     */    public static function getDefaultOperator()    {        return self::_getInstance()->_defaultOperator;    }    /**     * Turn on 'suppress query parser exceptions' mode.     */    public static function suppressQueryParsingExceptions()    {        self::_getInstance()->_suppressQueryParsingExceptions = true;    }    /**     * Turn off 'suppress query parser exceptions' mode.     */    public static function dontSuppressQueryParsingExceptions()    {        self::_getInstance()->_suppressQueryParsingExceptions = false;    }    /**     * Check 'suppress query parser exceptions' mode.     * @return boolean     */    public static function queryParsingExceptionsSuppressed()    {        return self::_getInstance()->_suppressQueryParsingExceptions;    }            /**     * Parses a query string     *     * @param string $strQuery     * @param string $encoding     * @return Zend_Search_Lucene_Search_Query     * @throws Zend_Search_Lucene_Search_QueryParserException     */    public static function parse($strQuery, $encoding = null)    {        self::_getInstance();                // Reset FSM if previous parse operation didn't return it into a correct state         self::$_instance->reset();                try {            self::$_instance->_encoding     = ($encoding !== null) ? $encoding : self::$_instance->_defaultEncoding;            self::$_instance->_lastToken    = null;            self::$_instance->_context      = new Zend_Search_Lucene_Search_QueryParserContext(self::$_instance->_encoding);            self::$_instance->_contextStack = array();            self::$_instance->_tokens       = self::$_instance->_lexer->tokenize($strQuery, self::$_instance->_encoding);                // Empty query            if (count(self::$_instance->_tokens) == 0) {                return new Zend_Search_Lucene_Search_Query_Insignificant();            }                    foreach (self::$_instance->_tokens as $token) {                try {                    self::$_instance->_currentToken = $token;                    self::$_instance->process($token->type);                        self::$_instance->_lastToken = $token;                } catch (Exception $e) {                    if (strpos($e->getMessage(), 'There is no any rule for') !== false) {                        throw new Zend_Search_Lucene_Search_QueryParserException( 'Syntax error at char position ' . $token->position . '.' );                    }                        throw $e;                }            }                if (count(self::$_instance->_contextStack) != 0) {                throw new Zend_Search_Lucene_Search_QueryParserException('Syntax Error: mismatched parentheses, every opening must have closing.' );            }                return self::$_instance->_context->getQuery();        } catch (Zend_Search_Lucene_Search_QueryParserException $e) {            if (self::$_instance->_suppressQueryParsingExceptions) {                $queryTokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($strQuery, self::$_instance->_encoding);                $query = new Zend_Search_Lucene_Search_Query_MultiTerm();                $termsSign = (self::$_instance->_defaultOperator == self::B_AND) ? true /* required term */ :                                                                                   null /* optional term */;                                                                                                   foreach ($queryTokens as $token) {                    $query->addTerm(new Zend_Search_Lucene_Index_Term($token->getTermText()), $termsSign);                }                                                return $query;            } else {                throw $e;            }        }    }    /*********************************************************************     * Actions implementation     *     * Actions affect on recognized lexemes list     *********************************************************************/    /**     * Add term to a query     */    public function addTermEntry()    {        $entry = new Zend_Search_Lucene_Search_QueryEntry_Term($this->_currentToken->text, $this->_context->getField());        $this->_context->addEntry($entry);    }    /**     * Add phrase to a query     */    public function addPhraseEntry()    {        $entry = new Zend_Search_Lucene_Search_QueryEntry_Phrase($this->_currentToken->text, $this->_context->getField());        $this->_context->addEntry($entry);    }    /**     * Set entry field     */    public function setField()    {        $this->_context->setNextEntryField($this->_currentToken->text);    }    /**     * Set entry sign     */    public function setSign()    {        $this->_context->setNextEntrySign($this->_currentToken->type);    }    /**     * Process fuzzy search/proximity modifier - '~'     */    public function processFuzzyProximityModifier()    {        $this->_context->processFuzzyProximityModifier();    }    /**     * Process modifier parameter     *     * @throws Zend_Search_Lucene_Exception     */    public function processModifierParameter()    {        if ($this->_lastToken === null) {            throw new Zend_Search_Lucene_Search_QueryParserException('Lexeme modifier parameter must follow lexeme modifier. Char position 0.' );        }        switch ($this->_lastToken->type) {            case Zend_Search_Lucene_Search_QueryToken::TT_FUZZY_PROX_MARK:                $this->_context->processFuzzyProximityModifier($this->_currentToken->text);                break;            case Zend_Search_Lucene_Search_QueryToken::TT_BOOSTING_MARK:                $this->_context->boost($this->_currentToken->text);                break;            default:                // It's not a user input exception                throw new Zend_Search_Lucene_Exception('Lexeme modifier parameter must follow lexeme modifier. Char position 0.' );        }    }    /**     * Start subquery     */    public function subqueryStart()    {        $this->_contextStack[] = $this->_context;        $this->_context        = new Zend_Search_Lucene_Search_QueryParserContext($this->_encoding, $this->_context->getField());    }    /**     * End subquery     */    public function subqueryEnd()    {        if (count($this->_contextStack) == 0) {            throw new Zend_Search_Lucene_Search_QueryParserException('Syntax Error: mismatched parentheses, every opening must have closing. Char position ' . $this->_currentToken->position . '.' );        }        $query          = $this->_context->getQuery();        $this->_context = array_pop($this->_contextStack);        $this->_context->addEntry(new Zend_Search_Lucene_Search_QueryEntry_Subquery($query));    }    /**     * Process logical operator     */    public function logicalOperator()    {        $this->_context->addLogicalOperator($this->_currentToken->type);    }    /**     * Process first range query term (opened interval)     */    public function openedRQFirstTerm()    {        $this->_rqFirstTerm = $this->_currentToken->text;    }    /**     * Process last range query term (opened interval)     *     * @throws Zend_Search_Lucene_Search_QueryParserException     */    public function openedRQLastTerm()    {        $tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($this->_rqFirstTerm, $this->_encoding);        if (count($tokens) > 1) {            throw new Zend_Search_Lucene_Search_QueryParserException('Range query boundary terms must be non-multiple word terms');        } else if (count($tokens) == 1) {            $from = new Zend_Search_Lucene_Index_Term(reset($tokens)->getTermText(), $this->_context->getField());        } else {            $from = null;        }        $tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($this->_currentToken->text, $this->_encoding);        if (count($tokens) > 1) {            throw new Zend_Search_Lucene_Search_QueryParserException('Range query boundary terms must be non-multiple word terms');        } else if (count($tokens) == 1) {            $to = new Zend_Search_Lucene_Index_Term(reset($tokens)->getTermText(), $this->_context->getField());        } else {            $to = null;        }        if ($from === null  &&  $to === null) {            throw new Zend_Search_Lucene_Search_QueryParserException('At least one range query boundary term must be non-empty term');        }        $rangeQuery = new Zend_Search_Lucene_Search_Query_Range($from, $to, false);        $entry      = new Zend_Search_Lucene_Search_QueryEntry_Subquery($rangeQuery);        $this->_context->addEntry($entry);    }    /**     * Process first range query term (closed interval)     */    public function closedRQFirstTerm()    {        $this->_rqFirstTerm = $this->_currentToken->text;    }    /**     * Process last range query term (closed interval)     *     * @throws Zend_Search_Lucene_Search_QueryParserException     */    public function closedRQLastTerm()    {        $tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($this->_rqFirstTerm, $this->_encoding);        if (count($tokens) > 1) {            throw new Zend_Search_Lucene_Search_QueryParserException('Range query boundary terms must be non-multiple word terms');        } else if (count($tokens) == 1) {            $from = new Zend_Search_Lucene_Index_Term(reset($tokens)->getTermText(), $this->_context->getField());        } else {            $from = null;        }        $tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($this->_currentToken->text, $this->_encoding);        if (count($tokens) > 1) {            throw new Zend_Search_Lucene_Search_QueryParserException('Range query boundary terms must be non-multiple word terms');        } else if (count($tokens) == 1) {            $to = new Zend_Search_Lucene_Index_Term(reset($tokens)->getTermText(), $this->_context->getField());        } else {            $to = null;        }        if ($from === null  &&  $to === null) {            throw new Zend_Search_Lucene_Search_QueryParserException('At least one range query boundary term must be non-empty term');        }        $rangeQuery = new Zend_Search_Lucene_Search_Query_Range($from, $to, true);        $entry      = new Zend_Search_Lucene_Search_QueryEntry_Subquery($rangeQuery);        $this->_context->addEntry($entry);    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -