import v2.0.0.0_RC3 | 2012-07-01
https://github.com/lucanos/CommunityID -> http://www.itadmins.net/archives/357
This commit is contained in:
@ -17,42 +17,37 @@
|
||||
* @subpackage Analysis
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: Analyzer.php 16541 2009-07-07 06:59:03Z bkarwin $
|
||||
* @version $Id: Analyzer.php 18947 2009-11-12 11:57:17Z alexander $
|
||||
*/
|
||||
|
||||
|
||||
/** Zend_Search_Lucene_Analysis_Token */
|
||||
require_once 'Zend/Search/Lucene/Analysis/Token.php';
|
||||
/** User land classes and interfaces turned on by Zend/Search/Analyzer.php file inclusion. */
|
||||
/** @todo Section should be removed with ZF 2.0 release as obsolete */
|
||||
if (!defined('ZEND_SEARCH_LUCENE_COMMON_ANALYZER_PROCESSED')) {
|
||||
/** Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8 */
|
||||
require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/Utf8.php';
|
||||
|
||||
/** Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8 */
|
||||
require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/Utf8.php';
|
||||
/** Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8_CaseInsensitive */
|
||||
require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/Utf8/CaseInsensitive.php';
|
||||
|
||||
/** Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8_CaseInsensitive */
|
||||
require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/Utf8/CaseInsensitive.php';
|
||||
/** Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num */
|
||||
require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/Utf8Num.php';
|
||||
|
||||
/** Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num */
|
||||
require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/Utf8Num.php';
|
||||
/** Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num_CaseInsensitive */
|
||||
require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/Utf8Num/CaseInsensitive.php';
|
||||
|
||||
/** Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num_CaseInsensitive */
|
||||
require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/Utf8Num/CaseInsensitive.php';
|
||||
/** Zend_Search_Lucene_Analysis_Analyzer_Common_Text */
|
||||
require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/Text.php';
|
||||
|
||||
/** Zend_Search_Lucene_Analysis_Analyzer_Common_Text */
|
||||
require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/Text.php';
|
||||
/** Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive */
|
||||
require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/Text/CaseInsensitive.php';
|
||||
|
||||
/** Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive */
|
||||
require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/Text/CaseInsensitive.php';
|
||||
/** Zend_Search_Lucene_Analysis_Analyzer_Common_TextNum */
|
||||
require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/TextNum.php';
|
||||
|
||||
/** Zend_Search_Lucene_Analysis_Analyzer_Common_TextNum */
|
||||
require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/TextNum.php';
|
||||
|
||||
/** Zend_Search_Lucene_Analysis_Analyzer_Common_TextNum_CaseInsensitive */
|
||||
require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/TextNum/CaseInsensitive.php';
|
||||
|
||||
/** Zend_Search_Lucene_Analysis_TokenFilter_StopWords */
|
||||
require_once 'Zend/Search/Lucene/Analysis/TokenFilter/StopWords.php';
|
||||
|
||||
/** Zend_Search_Lucene_Analysis_TokenFilter_ShortWords */
|
||||
require_once 'Zend/Search/Lucene/Analysis/TokenFilter/ShortWords.php';
|
||||
/** Zend_Search_Lucene_Analysis_Analyzer_Common_TextNum_CaseInsensitive */
|
||||
require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/TextNum/CaseInsensitive.php';
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@ -167,6 +162,9 @@ abstract class Zend_Search_Lucene_Analysis_Analyzer
|
||||
*/
|
||||
public static function getDefault()
|
||||
{
|
||||
/** Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive */
|
||||
require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/Text/CaseInsensitive.php';
|
||||
|
||||
if (!self::$_defaultImpl instanceof Zend_Search_Lucene_Analysis_Analyzer) {
|
||||
self::$_defaultImpl = new Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive();
|
||||
}
|
||||
|
@ -17,13 +17,24 @@
|
||||
* @subpackage Analysis
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: Common.php 16541 2009-07-07 06:59:03Z bkarwin $
|
||||
* @version $Id: Common.php 18947 2009-11-12 11:57:17Z alexander $
|
||||
*/
|
||||
|
||||
|
||||
/** Define constant used to provide correct file processing order */
|
||||
/** @todo Section should be removed with ZF 2.0 release as obsolete */
|
||||
define('ZEND_SEARCH_LUCENE_COMMON_ANALYZER_PROCESSED', true);
|
||||
|
||||
|
||||
/** Zend_Search_Lucene_Analysis_Analyzer */
|
||||
require_once 'Zend/Search/Lucene/Analysis/Analyzer.php';
|
||||
|
||||
/** Zend_Search_Lucene_Analysis_Token */
|
||||
require_once 'Zend/Search/Lucene/Analysis/Token.php';
|
||||
|
||||
/** Zend_Search_Lucene_Analysis_TokenFilter */
|
||||
require_once 'Zend/Search/Lucene/Analysis/TokenFilter.php';
|
||||
|
||||
|
||||
/**
|
||||
* Common implementation of the Zend_Search_Lucene_Analysis_Analyzer interface.
|
||||
|
@ -17,7 +17,7 @@
|
||||
* @subpackage Analysis
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: Utf8.php 16971 2009-07-22 18:05:45Z mikaelkael $
|
||||
* @version $Id: Utf8.php 18951 2009-11-12 16:26:19Z alexander $
|
||||
*/
|
||||
|
||||
|
||||
@ -48,7 +48,7 @@ class Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8 extends Zend_Search_Lucen
|
||||
* @var integer
|
||||
*/
|
||||
private $_bytePosition;
|
||||
|
||||
|
||||
/**
|
||||
* Object constructor
|
||||
*
|
||||
@ -101,12 +101,12 @@ class Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8 extends Zend_Search_Lucen
|
||||
|
||||
// matched string
|
||||
$matchedWord = $match[0][0];
|
||||
|
||||
|
||||
// binary position of the matched word in the input stream
|
||||
$binStartPos = $match[0][1];
|
||||
|
||||
|
||||
// character position of the matched word in the input stream
|
||||
$startPos = $this->_position +
|
||||
$startPos = $this->_position +
|
||||
iconv_strlen(substr($this->_input,
|
||||
$this->_bytePosition,
|
||||
$binStartPos - $this->_bytePosition),
|
||||
|
@ -17,7 +17,7 @@
|
||||
* @subpackage Analysis
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: CaseInsensitive.php 16971 2009-07-22 18:05:45Z mikaelkael $
|
||||
* @version $Id: CaseInsensitive.php 18951 2009-11-12 16:26:19Z alexander $
|
||||
*/
|
||||
|
||||
|
||||
@ -37,7 +37,7 @@ require_once 'Zend/Search/Lucene/Analysis/TokenFilter/LowerCaseUtf8.php';
|
||||
*/
|
||||
|
||||
|
||||
class Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8_CaseInsensitive extends Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8
|
||||
class Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8_CaseInsensitive extends Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
|
@ -17,7 +17,7 @@
|
||||
* @subpackage Analysis
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: Utf8Num.php 16971 2009-07-22 18:05:45Z mikaelkael $
|
||||
* @version $Id: Utf8Num.php 18951 2009-11-12 16:26:19Z alexander $
|
||||
*/
|
||||
|
||||
|
||||
@ -101,12 +101,12 @@ class Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num extends Zend_Search_Lu
|
||||
|
||||
// matched string
|
||||
$matchedWord = $match[0][0];
|
||||
|
||||
|
||||
// binary position of the matched word in the input stream
|
||||
$binStartPos = $match[0][1];
|
||||
|
||||
|
||||
// character position of the matched word in the input stream
|
||||
$startPos = $this->_position +
|
||||
$startPos = $this->_position +
|
||||
iconv_strlen(substr($this->_input,
|
||||
$this->_bytePosition,
|
||||
$binStartPos - $this->_bytePosition),
|
||||
|
@ -17,7 +17,7 @@
|
||||
* @subpackage Analysis
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: TokenFilter.php 16541 2009-07-07 06:59:03Z bkarwin $
|
||||
* @version $Id: TokenFilter.php 18947 2009-11-12 11:57:17Z alexander $
|
||||
*/
|
||||
|
||||
|
||||
@ -34,7 +34,6 @@ require_once 'Zend/Search/Lucene/Analysis/Token.php';
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
abstract class Zend_Search_Lucene_Analysis_TokenFilter
|
||||
{
|
||||
/**
|
||||
|
@ -17,7 +17,7 @@
|
||||
* @subpackage Analysis
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: LowerCaseUtf8.php 16971 2009-07-22 18:05:45Z mikaelkael $
|
||||
* @version $Id: LowerCaseUtf8.php 18951 2009-11-12 16:26:19Z alexander $
|
||||
*/
|
||||
|
||||
|
||||
@ -48,7 +48,7 @@ class Zend_Search_Lucene_Analysis_TokenFilter_LowerCaseUtf8 extends Zend_Search_
|
||||
throw new Zend_Search_Lucene_Exception('Utf8 compatible lower case filter needs mbstring extension to be enabled.');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Normalize Token or remove it (if null is returned)
|
||||
*
|
||||
|
@ -17,7 +17,7 @@
|
||||
* @subpackage Document
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: Docx.php 16971 2009-07-22 18:05:45Z mikaelkael $
|
||||
* @version $Id: Docx.php 19035 2009-11-19 14:34:11Z alexander $
|
||||
*/
|
||||
|
||||
/** Zend_Search_Lucene_Document_OpenXml */
|
||||
@ -47,6 +47,7 @@ class Zend_Search_Lucene_Document_Docx extends Zend_Search_Lucene_Document_OpenX
|
||||
*
|
||||
* @param string $fileName
|
||||
* @param boolean $storeContent
|
||||
* @throws Zend_Search_Lucene_Exception
|
||||
*/
|
||||
private function __construct($fileName, $storeContent) {
|
||||
// Document data holders
|
||||
@ -58,7 +59,12 @@ class Zend_Search_Lucene_Document_Docx extends Zend_Search_Lucene_Document_OpenX
|
||||
$package->open($fileName);
|
||||
|
||||
// Read relations and search for officeDocument
|
||||
$relations = simplexml_load_string($package->getFromName('_rels/.rels'));
|
||||
$relationsXml = $package->getFromName('_rels/.rels');
|
||||
if ($relationsXml === false) {
|
||||
require_once 'Zend/Search/Lucene/Exception.php';
|
||||
throw new Zend_Search_Lucene_Exception('Invalid archive or corrupted .docx file.');
|
||||
}
|
||||
$relations = simplexml_load_string($relationsXml);
|
||||
foreach($relations->Relationship as $rel) {
|
||||
if ($rel ["Type"] == Zend_Search_Lucene_Document_OpenXml::SCHEMA_OFFICEDOCUMENT) {
|
||||
// Found office document! Read in contents...
|
||||
@ -75,8 +81,8 @@ class Zend_Search_Lucene_Document_Docx extends Zend_Search_Lucene_Document_OpenX
|
||||
$runs = $paragraph->xpath('.//w:r/*[name() = "w:t" or name() = "w:br"]');
|
||||
|
||||
if ($runs === false) {
|
||||
// Paragraph doesn't contain any text or breaks
|
||||
continue;
|
||||
// Paragraph doesn't contain any text or breaks
|
||||
continue;
|
||||
}
|
||||
|
||||
foreach ($runs as $run) {
|
||||
@ -84,7 +90,7 @@ class Zend_Search_Lucene_Document_Docx extends Zend_Search_Lucene_Document_OpenX
|
||||
// Break element
|
||||
$documentBody[] = ' ';
|
||||
} else {
|
||||
$documentBody[] = (string)$run;
|
||||
$documentBody[] = (string)$run;
|
||||
}
|
||||
}
|
||||
|
||||
@ -133,11 +139,11 @@ class Zend_Search_Lucene_Document_Docx extends Zend_Search_Lucene_Document_OpenX
|
||||
*/
|
||||
public static function loadDocxFile($fileName, $storeContent = false) {
|
||||
if (!is_readable($fileName)) {
|
||||
require_once 'Zend/Search/Lucene/Document/Exception.php';
|
||||
throw new Zend_Search_Lucene_Document_Exception('Provided file \'' . $fileName . '\' is not readable.');
|
||||
require_once 'Zend/Search/Lucene/Document/Exception.php';
|
||||
throw new Zend_Search_Lucene_Document_Exception('Provided file \'' . $fileName . '\' is not readable.');
|
||||
}
|
||||
|
||||
return new Zend_Search_Lucene_Document_Docx($fileName, $storeContent);
|
||||
return new Zend_Search_Lucene_Document_Docx($fileName, $storeContent);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -17,7 +17,7 @@
|
||||
* @subpackage Document
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: Html.php 16971 2009-07-22 18:05:45Z mikaelkael $
|
||||
* @version $Id: Html.php 18951 2009-11-12 16:26:19Z alexander $
|
||||
*/
|
||||
|
||||
|
||||
@ -88,28 +88,28 @@ class Zend_Search_Lucene_Document_Html extends Zend_Search_Lucene_Document
|
||||
@$this->_doc->loadHTML($htmlData);
|
||||
|
||||
if ($this->_doc->encoding === null) {
|
||||
// Document encoding is not recognized
|
||||
// Document encoding is not recognized
|
||||
|
||||
/** @todo improve HTML vs HTML fragment recognition */
|
||||
if (preg_match('/<html>/i', $htmlData, $matches, PREG_OFFSET_CAPTURE)) {
|
||||
// It's an HTML document
|
||||
// Add additional HEAD section and recognize document
|
||||
$htmlTagOffset = $matches[0][1] + strlen($matches[0][1]);
|
||||
/** @todo improve HTML vs HTML fragment recognition */
|
||||
if (preg_match('/<html>/i', $htmlData, $matches, PREG_OFFSET_CAPTURE)) {
|
||||
// It's an HTML document
|
||||
// Add additional HEAD section and recognize document
|
||||
$htmlTagOffset = $matches[0][1] + strlen($matches[0][0]);
|
||||
|
||||
@$this->_doc->loadHTML(iconv($defaultEncoding, 'UTF-8//IGNORE', substr($htmlData, 0, $htmlTagOffset))
|
||||
@$this->_doc->loadHTML(iconv($defaultEncoding, 'UTF-8//IGNORE', substr($htmlData, 0, $htmlTagOffset))
|
||||
. '<head><META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=UTF-8"/></head>'
|
||||
. iconv($defaultEncoding, 'UTF-8//IGNORE', substr($htmlData, $htmlTagOffset)));
|
||||
|
||||
// Remove additional HEAD section
|
||||
$xpath = new DOMXPath($this->_doc);
|
||||
$head = $xpath->query('/html/head')->item(0);
|
||||
$head->parentNode->removeChild($head);
|
||||
} else {
|
||||
// It's an HTML fragment
|
||||
@$this->_doc->loadHTML('<html><head><META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=UTF-8"/></head><body>'
|
||||
. iconv($defaultEncoding, 'UTF-8//IGNORE', $htmlData)
|
||||
. '</body></html>');
|
||||
}
|
||||
$head->parentNode->removeChild($head);
|
||||
} else {
|
||||
// It's an HTML fragment
|
||||
@$this->_doc->loadHTML('<html><head><META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=UTF-8"/></head><body>'
|
||||
. iconv($defaultEncoding, 'UTF-8//IGNORE', $htmlData)
|
||||
. '</body></html>');
|
||||
}
|
||||
|
||||
}
|
||||
/** @todo Add correction of wrong HTML encoding recognition processing
|
||||
@ -264,6 +264,9 @@ class Zend_Search_Lucene_Document_Html extends Zend_Search_Lucene_Document
|
||||
*/
|
||||
protected function _highlightTextNode(DOMText $node, $wordsToHighlight, $callback, $params)
|
||||
{
|
||||
/** Zend_Search_Lucene_Analysis_Analyzer */
|
||||
require_once 'Zend/Search/Lucene/Analysis/Analyzer.php';
|
||||
|
||||
$analyzer = Zend_Search_Lucene_Analysis_Analyzer::getDefault();
|
||||
$analyzer->setInput($node->nodeValue, 'UTF-8');
|
||||
|
||||
@ -301,16 +304,16 @@ class Zend_Search_Lucene_Document_Html extends Zend_Search_Lucene_Document
|
||||
. $highlightedWordNodeSetHtml
|
||||
. '</body></html>');
|
||||
if (!$success) {
|
||||
require_once 'Zend/Search/Lucene/Exception.php';
|
||||
throw new Zend_Search_Lucene_Exception("Error occured while loading highlighted text fragment: '$highlightedNodeHtml'.");
|
||||
require_once 'Zend/Search/Lucene/Exception.php';
|
||||
throw new Zend_Search_Lucene_Exception("Error occured while loading highlighted text fragment: '$highlightedNodeHtml'.");
|
||||
}
|
||||
$highlightedWordNodeSetXpath = new DOMXPath($highlightedWordNodeSetDomDocument);
|
||||
$highlightedWordNodeSet = $highlightedWordNodeSetXpath->query('/html/body')->item(0)->childNodes;
|
||||
|
||||
for ($count = 0; $count < $highlightedWordNodeSet->length; $count++) {
|
||||
$nodeToImport = $highlightedWordNodeSet->item($count);
|
||||
$node->parentNode->insertBefore($this->_doc->importNode($nodeToImport, true /* deep copy */),
|
||||
$matchedWordNode);
|
||||
$nodeToImport = $highlightedWordNodeSet->item($count);
|
||||
$node->parentNode->insertBefore($this->_doc->importNode($nodeToImport, true /* deep copy */),
|
||||
$matchedWordNode);
|
||||
}
|
||||
|
||||
$node->parentNode->removeChild($matchedWordNode);
|
||||
@ -372,7 +375,7 @@ class Zend_Search_Lucene_Document_Html extends Zend_Search_Lucene_Document
|
||||
*/
|
||||
public function highlight($words, $colour = '#66ffff')
|
||||
{
|
||||
return $this->highlightExtended($words, array($this, 'applyColour'), array($colour));
|
||||
return $this->highlightExtended($words, array($this, 'applyColour'), array($colour));
|
||||
}
|
||||
|
||||
|
||||
@ -389,6 +392,9 @@ class Zend_Search_Lucene_Document_Html extends Zend_Search_Lucene_Document
|
||||
*/
|
||||
public function highlightExtended($words, $callback, $params = array())
|
||||
{
|
||||
/** Zend_Search_Lucene_Analysis_Analyzer */
|
||||
require_once 'Zend/Search/Lucene/Analysis/Analyzer.php';
|
||||
|
||||
if (!is_array($words)) {
|
||||
$words = array($words);
|
||||
}
|
||||
@ -410,8 +416,8 @@ class Zend_Search_Lucene_Document_Html extends Zend_Search_Lucene_Document
|
||||
}
|
||||
|
||||
if (!is_callable($callback)) {
|
||||
require_once 'Zend/Search/Lucene/Exception.php';
|
||||
throw new Zend_Search_Lucene_Exception('$viewHelper parameter mast be a View Helper name, View Helper object or callback.');
|
||||
require_once 'Zend/Search/Lucene/Exception.php';
|
||||
throw new Zend_Search_Lucene_Exception('$viewHelper parameter mast be a View Helper name, View Helper object or callback.');
|
||||
}
|
||||
|
||||
$xpath = new DOMXPath($this->_doc);
|
||||
@ -445,7 +451,7 @@ class Zend_Search_Lucene_Document_Html extends Zend_Search_Lucene_Document
|
||||
|
||||
$outputFragments = array();
|
||||
for ($count = 0; $count < $bodyNodes->length; $count++) {
|
||||
$outputFragments[] = $this->_doc->saveXML($bodyNodes->item($count));
|
||||
$outputFragments[] = $this->_doc->saveXML($bodyNodes->item($count));
|
||||
}
|
||||
|
||||
return implode($outputFragments);
|
||||
|
@ -17,13 +17,14 @@
|
||||
* @subpackage Document
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: OpenXml.php 16971 2009-07-22 18:05:45Z mikaelkael $
|
||||
* @version $Id: OpenXml.php 18951 2009-11-12 16:26:19Z alexander $
|
||||
*/
|
||||
|
||||
|
||||
/** Zend_Search_Lucene_Document */
|
||||
require_once 'Zend/Search/Lucene/Document.php';
|
||||
|
||||
|
||||
if (class_exists('ZipArchive', false)) {
|
||||
|
||||
/**
|
||||
@ -82,7 +83,7 @@ abstract class Zend_Search_Lucene_Document_OpenXml extends Zend_Search_Lucene_Do
|
||||
{
|
||||
// Data holders
|
||||
$coreProperties = array();
|
||||
|
||||
|
||||
// Read relations and search for core properties
|
||||
$relations = simplexml_load_string($package->getFromName("_rels/.rels"));
|
||||
foreach ($relations->Relationship as $rel) {
|
||||
@ -103,10 +104,10 @@ abstract class Zend_Search_Lucene_Document_OpenXml extends Zend_Search_Lucene_Do
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return $coreProperties;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Determine absolute zip path
|
||||
*
|
||||
|
@ -17,7 +17,7 @@
|
||||
* @subpackage Document
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: Pptx.php 16971 2009-07-22 18:05:45Z mikaelkael $
|
||||
* @version $Id: Pptx.php 19035 2009-11-19 14:34:11Z alexander $
|
||||
*/
|
||||
|
||||
|
||||
@ -70,6 +70,7 @@ class Zend_Search_Lucene_Document_Pptx extends Zend_Search_Lucene_Document_OpenX
|
||||
*
|
||||
* @param string $fileName
|
||||
* @param boolean $storeContent
|
||||
* @throws Zend_Search_Lucene_Exception
|
||||
*/
|
||||
private function __construct($fileName, $storeContent)
|
||||
{
|
||||
@ -84,7 +85,12 @@ class Zend_Search_Lucene_Document_Pptx extends Zend_Search_Lucene_Document_OpenX
|
||||
$package->open($fileName);
|
||||
|
||||
// Read relations and search for officeDocument
|
||||
$relations = simplexml_load_string($package->getFromName("_rels/.rels"));
|
||||
$relationsXml = $package->getFromName('_rels/.rels');
|
||||
if ($relationsXml === false) {
|
||||
require_once 'Zend/Search/Lucene/Exception.php';
|
||||
throw new Zend_Search_Lucene_Exception('Invalid archive or corrupted .pptx file.');
|
||||
}
|
||||
$relations = simplexml_load_string($relationsXml);
|
||||
foreach ($relations->Relationship as $rel) {
|
||||
if ($rel["Type"] == Zend_Search_Lucene_Document_OpenXml::SCHEMA_OFFICEDOCUMENT) {
|
||||
// Found office document! Search for slides...
|
||||
|
@ -17,7 +17,7 @@
|
||||
* @subpackage Document
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: Xlsx.php 16971 2009-07-22 18:05:45Z mikaelkael $
|
||||
* @version $Id: Xlsx.php 19035 2009-11-19 14:34:11Z alexander $
|
||||
*/
|
||||
|
||||
|
||||
@ -77,6 +77,7 @@ class Zend_Search_Lucene_Document_Xlsx extends Zend_Search_Lucene_Document_OpenX
|
||||
*
|
||||
* @param string $fileName
|
||||
* @param boolean $storeContent
|
||||
* @throws Zend_Search_Lucene_Exception
|
||||
*/
|
||||
private function __construct($fileName, $storeContent)
|
||||
{
|
||||
@ -91,7 +92,12 @@ class Zend_Search_Lucene_Document_Xlsx extends Zend_Search_Lucene_Document_OpenX
|
||||
$package->open($fileName);
|
||||
|
||||
// Read relations and search for officeDocument
|
||||
$relations = simplexml_load_string($package->getFromName("_rels/.rels"));
|
||||
$relationsXml = $package->getFromName('_rels/.rels');
|
||||
if ($relationsXml === false) {
|
||||
require_once 'Zend/Search/Lucene/Exception.php';
|
||||
throw new Zend_Search_Lucene_Exception('Invalid archive or corrupted .xlsx file.');
|
||||
}
|
||||
$relations = simplexml_load_string($relationsXml);
|
||||
foreach ($relations->Relationship as $rel) {
|
||||
if ($rel["Type"] == Zend_Search_Lucene_Document_OpenXml::SCHEMA_OFFICEDOCUMENT) {
|
||||
// Found office document! Read relations for workbook...
|
||||
|
@ -17,7 +17,7 @@
|
||||
* @subpackage Document
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: Field.php 16541 2009-07-07 06:59:03Z bkarwin $
|
||||
* @version $Id: Field.php 18951 2009-11-12 16:26:19Z alexander $
|
||||
*/
|
||||
|
||||
|
||||
@ -46,41 +46,41 @@ class Zend_Search_Lucene_Field
|
||||
|
||||
/**
|
||||
* Field value
|
||||
*
|
||||
*
|
||||
* @var boolean
|
||||
*/
|
||||
public $value;
|
||||
|
||||
|
||||
/**
|
||||
* Field is to be stored in the index for return with search hits.
|
||||
*
|
||||
*
|
||||
* @var boolean
|
||||
*/
|
||||
public $isStored = false;
|
||||
|
||||
|
||||
/**
|
||||
* Field is to be indexed, so that it may be searched on.
|
||||
*
|
||||
*
|
||||
* @var boolean
|
||||
*/
|
||||
public $isIndexed = true;
|
||||
|
||||
/**
|
||||
* Field should be tokenized as text prior to indexing.
|
||||
*
|
||||
*
|
||||
* @var boolean
|
||||
*/
|
||||
public $isTokenized = true;
|
||||
/**
|
||||
* Field is stored as binary.
|
||||
*
|
||||
*
|
||||
* @var boolean
|
||||
*/
|
||||
public $isBinary = false;
|
||||
|
||||
/**
|
||||
* Field are stored as a term vector
|
||||
*
|
||||
*
|
||||
* @var boolean
|
||||
*/
|
||||
public $storeTermVector = false;
|
||||
@ -218,7 +218,7 @@ class Zend_Search_Lucene_Field
|
||||
strcasecmp($this->encoding, 'utf-8') == 0 ) {
|
||||
return $this->value;
|
||||
} else {
|
||||
|
||||
|
||||
return (PHP_OS != 'AIX') ? iconv($this->encoding, 'UTF-8', $this->value) : iconv('ISO8859-1', 'UTF-8', $this->value);
|
||||
}
|
||||
}
|
||||
|
@ -17,18 +17,25 @@
|
||||
* @subpackage Index
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: SegmentInfo.php 16541 2009-07-07 06:59:03Z bkarwin $
|
||||
* @version $Id: SegmentInfo.php 18951 2009-11-12 16:26:19Z alexander $
|
||||
*/
|
||||
|
||||
/** Zend_Search_Lucene_Index_DictionaryLoader */
|
||||
require_once 'Zend/Search/Lucene/Index/DictionaryLoader.php';
|
||||
|
||||
/** Zend_Search_Lucene_Index_DocsFilter */
|
||||
require_once 'Zend/Search/Lucene/Index/DocsFilter.php';
|
||||
|
||||
/** Zend_Search_Lucene_Index_TermsStream_Interface */
|
||||
require_once 'Zend/Search/Lucene/Index/TermsStream/Interface.php';
|
||||
|
||||
|
||||
/** Zend_Search_Lucene_Search_Similarity */
|
||||
require_once 'Zend/Search/Lucene/Search/Similarity.php';
|
||||
|
||||
/** Zend_Search_Lucene_Index_FieldInfo */
|
||||
require_once 'Zend/Search/Lucene/Index/FieldInfo.php';
|
||||
|
||||
/** Zend_Search_Lucene_Index_Term */
|
||||
require_once 'Zend/Search/Lucene/Index/Term.php';
|
||||
|
||||
/** Zend_Search_Lucene_Index_TermInfo */
|
||||
require_once 'Zend/Search/Lucene/Index/TermInfo.php';
|
||||
|
||||
/**
|
||||
* @category Zend
|
||||
* @package Zend_Search_Lucene
|
||||
@ -297,6 +304,7 @@ class Zend_Search_Lucene_Index_SegmentInfo implements Zend_Search_Lucene_Index_T
|
||||
$fieldNames = array();
|
||||
$fieldNums = array();
|
||||
$this->_fields = array();
|
||||
|
||||
for ($count=0; $count < $fieldsCount; $count++) {
|
||||
$fieldName = $fnmFile->readString();
|
||||
$fieldBits = $fnmFile->readByte();
|
||||
@ -318,8 +326,8 @@ class Zend_Search_Lucene_Index_SegmentInfo implements Zend_Search_Lucene_Index_T
|
||||
$this->_fieldsDicPositions = array_flip($fieldNums);
|
||||
|
||||
if ($this->_delGen == -2) {
|
||||
// SegmentInfo constructor is invoked from index writer
|
||||
// Autodetect current delete file generation number
|
||||
// SegmentInfo constructor is invoked from index writer
|
||||
// Autodetect current delete file generation number
|
||||
$this->_delGen = $this->_detectLatestDelGen();
|
||||
}
|
||||
|
||||
@ -436,18 +444,18 @@ class Zend_Search_Lucene_Index_SegmentInfo implements Zend_Search_Lucene_Index_T
|
||||
|
||||
|
||||
if (extension_loaded('bitset')) {
|
||||
for ($bit = 0; $bit < 8; $bit++) {
|
||||
if ($nonZeroByte & (1<<$bit)) {
|
||||
for ($bit = 0; $bit < 8; $bit++) {
|
||||
if ($nonZeroByte & (1<<$bit)) {
|
||||
bitset_incl($deletions, $byteNum*8 + $bit);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return $deletions;
|
||||
} else {
|
||||
for ($bit = 0; $bit < 8; $bit++) {
|
||||
if ($nonZeroByte & (1<<$bit)) {
|
||||
for ($bit = 0; $bit < 8; $bit++) {
|
||||
if ($nonZeroByte & (1<<$bit)) {
|
||||
$deletions[$byteNum*8 + $bit] = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return (count($deletions) > 0) ? $deletions : null;
|
||||
}
|
||||
|
||||
@ -785,6 +793,9 @@ class Zend_Search_Lucene_Index_SegmentInfo implements Zend_Search_Lucene_Index_T
|
||||
$tiiFile = $this->openCompoundFile('.tii');
|
||||
$tiiFileData = $tiiFile->readBytes($this->compoundFileLength('.tii'));
|
||||
|
||||
/** Zend_Search_Lucene_Index_DictionaryLoader */
|
||||
require_once 'Zend/Search/Lucene/Index/DictionaryLoader.php';
|
||||
|
||||
// Load dictionary index data
|
||||
list($this->_termDictionary, $this->_termDictionaryInfos) =
|
||||
Zend_Search_Lucene_Index_DictionaryLoader::load($tiiFileData);
|
||||
@ -1549,35 +1560,35 @@ class Zend_Search_Lucene_Index_SegmentInfo implements Zend_Search_Lucene_Index_T
|
||||
$latestDelGen = $this->_detectLatestDelGen();
|
||||
|
||||
if (!$this->_deletedDirty) {
|
||||
// There was no deletions by current process
|
||||
// There was no deletions by current process
|
||||
|
||||
if ($latestDelGen == $this->_delGen) {
|
||||
// Delete file hasn't been updated by any concurrent process
|
||||
return;
|
||||
// Delete file hasn't been updated by any concurrent process
|
||||
return;
|
||||
} else if ($latestDelGen > $this->_delGen) {
|
||||
// Delete file has been updated by some concurrent process
|
||||
// Reload deletions file
|
||||
$this->_delGen = $latestDelGen;
|
||||
$this->_deleted = $this->_loadDelFile();
|
||||
// Delete file has been updated by some concurrent process
|
||||
// Reload deletions file
|
||||
$this->_delGen = $latestDelGen;
|
||||
$this->_deleted = $this->_loadDelFile();
|
||||
|
||||
return;
|
||||
return;
|
||||
} else {
|
||||
require_once 'Zend/Search/Lucene/Exception.php';
|
||||
throw new Zend_Search_Lucene_Exception('Delete file processing workflow is corrupted for the segment \'' . $this->_name . '\'.');
|
||||
require_once 'Zend/Search/Lucene/Exception.php';
|
||||
throw new Zend_Search_Lucene_Exception('Delete file processing workflow is corrupted for the segment \'' . $this->_name . '\'.');
|
||||
}
|
||||
}
|
||||
|
||||
if ($latestDelGen > $this->_delGen) {
|
||||
// Merge current deletions with latest deletions file
|
||||
$this->_delGen = $latestDelGen;
|
||||
// Merge current deletions with latest deletions file
|
||||
$this->_delGen = $latestDelGen;
|
||||
|
||||
$latestDelete = $this->_loadDelFile();
|
||||
$latestDelete = $this->_loadDelFile();
|
||||
|
||||
if (extension_loaded('bitset')) {
|
||||
$this->_deleted = bitset_union($this->_deleted, $latestDelete);
|
||||
} else {
|
||||
$this->_deleted += $latestDelete;
|
||||
}
|
||||
if (extension_loaded('bitset')) {
|
||||
$this->_deleted = bitset_union($this->_deleted, $latestDelete);
|
||||
} else {
|
||||
$this->_deleted += $latestDelete;
|
||||
}
|
||||
}
|
||||
|
||||
if (extension_loaded('bitset')) {
|
||||
@ -1756,19 +1767,19 @@ class Zend_Search_Lucene_Index_SegmentInfo implements Zend_Search_Lucene_Index_T
|
||||
*/
|
||||
public function resetTermsStream(/** $startId = 0, $mode = self::SM_TERMS_ONLY */)
|
||||
{
|
||||
/**
|
||||
* SegmentInfo->resetTermsStream() method actually takes two optional parameters:
|
||||
* $startId (default value is 0)
|
||||
* $mode (default value is self::SM_TERMS_ONLY)
|
||||
*/
|
||||
$argList = func_get_args();
|
||||
if (count($argList) > 2) {
|
||||
/**
|
||||
* SegmentInfo->resetTermsStream() method actually takes two optional parameters:
|
||||
* $startId (default value is 0)
|
||||
* $mode (default value is self::SM_TERMS_ONLY)
|
||||
*/
|
||||
$argList = func_get_args();
|
||||
if (count($argList) > 2) {
|
||||
require_once 'Zend/Search/Lucene/Exception.php';
|
||||
throw new Zend_Search_Lucene_Exception('Wrong number of arguments');
|
||||
} else if (count($argList) == 2) {
|
||||
$startId = $argList[0];
|
||||
$mode = $argList[1];
|
||||
} else if (count($argList) == 1) {
|
||||
} else if (count($argList) == 2) {
|
||||
$startId = $argList[0];
|
||||
$mode = $argList[1];
|
||||
} else if (count($argList) == 1) {
|
||||
$startId = $argList[0];
|
||||
$mode = self::SM_TERMS_ONLY;
|
||||
} else {
|
||||
|
@ -17,17 +17,12 @@
|
||||
* @subpackage Index
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: SegmentMerger.php 16541 2009-07-07 06:59:03Z bkarwin $
|
||||
* @version $Id: SegmentMerger.php 18954 2009-11-12 20:01:33Z alexander $
|
||||
*/
|
||||
|
||||
/** Zend_Search_Lucene_Index_SegmentInfo */
|
||||
require_once 'Zend/Search/Lucene/Index/SegmentInfo.php';
|
||||
|
||||
/** Zend_Search_Lucene_Index_SegmentWriter_StreamWriter */
|
||||
require_once 'Zend/Search/Lucene/Index/SegmentWriter/StreamWriter.php';
|
||||
|
||||
/** Zend_Search_Lucene_Index_TermsPriorityQueue */
|
||||
require_once 'Zend/Search/Lucene/Index/TermsPriorityQueue.php';
|
||||
|
||||
/**
|
||||
* @category Zend
|
||||
@ -87,6 +82,8 @@ class Zend_Search_Lucene_Index_SegmentMerger
|
||||
*/
|
||||
public function __construct($directory, $name)
|
||||
{
|
||||
/** Zend_Search_Lucene_Index_SegmentWriter_StreamWriter */
|
||||
require_once 'Zend/Search/Lucene/Index/SegmentWriter/StreamWriter.php';
|
||||
$this->_writer = new Zend_Search_Lucene_Index_SegmentWriter_StreamWriter($directory, $name);
|
||||
}
|
||||
|
||||
@ -226,6 +223,9 @@ class Zend_Search_Lucene_Index_SegmentMerger
|
||||
*/
|
||||
private function _mergeTerms()
|
||||
{
|
||||
/** Zend_Search_Lucene_Index_TermsPriorityQueue */
|
||||
require_once 'Zend/Search/Lucene/Index/TermsPriorityQueue.php';
|
||||
|
||||
$segmentInfoQueue = new Zend_Search_Lucene_Index_TermsPriorityQueue();
|
||||
|
||||
$segmentStartId = 0;
|
||||
|
@ -17,11 +17,18 @@
|
||||
* @subpackage Index
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: SegmentWriter.php 16541 2009-07-07 06:59:03Z bkarwin $
|
||||
* @version $Id: SegmentWriter.php 18947 2009-11-12 11:57:17Z alexander $
|
||||
*/
|
||||
|
||||
/** Zend_Search_Lucene_Index_SegmentInfo */
|
||||
require_once 'Zend/Search/Lucene/Index/SegmentInfo.php';
|
||||
|
||||
/** Zend_Search_Lucene_Index_FieldInfo */
|
||||
require_once 'Zend/Search/Lucene/Index/FieldInfo.php';
|
||||
|
||||
/** Zend_Search_Lucene_Index_Term */
|
||||
require_once 'Zend/Search/Lucene/Index/Term.php';
|
||||
|
||||
/** Zend_Search_Lucene_Index_TermInfo */
|
||||
require_once 'Zend/Search/Lucene/Index/TermInfo.php';
|
||||
|
||||
/**
|
||||
* @category Zend
|
||||
|
@ -17,12 +17,9 @@
|
||||
* @subpackage Index
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: DocumentWriter.php 16541 2009-07-07 06:59:03Z bkarwin $
|
||||
* @version $Id: DocumentWriter.php 18947 2009-11-12 11:57:17Z alexander $
|
||||
*/
|
||||
|
||||
/** Zend_Search_Lucene_Analysis_Analyzer */
|
||||
require_once 'Zend/Search/Lucene/Analysis/Analyzer.php';
|
||||
|
||||
/** Zend_Search_Lucene_Index_SegmentWriter */
|
||||
require_once 'Zend/Search/Lucene/Index/SegmentWriter.php';
|
||||
|
||||
@ -74,6 +71,9 @@ class Zend_Search_Lucene_Index_SegmentWriter_DocumentWriter extends Zend_Search_
|
||||
*/
|
||||
public function addDocument(Zend_Search_Lucene_Document $document)
|
||||
{
|
||||
/** Zend_Search_Lucene_Search_Similarity */
|
||||
require_once 'Zend/Search/Lucene/Search/Similarity.php';
|
||||
|
||||
$storedFields = array();
|
||||
$docNorms = array();
|
||||
$similarity = Zend_Search_Lucene_Search_Similarity::getDefault();
|
||||
@ -92,6 +92,9 @@ class Zend_Search_Lucene_Index_SegmentWriter_DocumentWriter extends Zend_Search_
|
||||
|
||||
if ($field->isIndexed) {
|
||||
if ($field->isTokenized) {
|
||||
/** Zend_Search_Lucene_Analysis_Analyzer */
|
||||
require_once 'Zend/Search/Lucene/Analysis/Analyzer.php';
|
||||
|
||||
$analyzer = Zend_Search_Lucene_Analysis_Analyzer::getDefault();
|
||||
$analyzer->setInput($field->value, $field->encoding);
|
||||
|
||||
@ -201,6 +204,9 @@ class Zend_Search_Lucene_Index_SegmentWriter_DocumentWriter extends Zend_Search_
|
||||
|
||||
$this->_generateCFS();
|
||||
|
||||
/** Zend_Search_Lucene_Index_SegmentInfo */
|
||||
require_once 'Zend/Search/Lucene/Index/SegmentInfo.php';
|
||||
|
||||
return new Zend_Search_Lucene_Index_SegmentInfo($this->_directory,
|
||||
$this->_name,
|
||||
$this->_docCount,
|
||||
|
@ -17,12 +17,9 @@
|
||||
* @subpackage Index
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: StreamWriter.php 16541 2009-07-07 06:59:03Z bkarwin $
|
||||
* @version $Id: StreamWriter.php 18947 2009-11-12 11:57:17Z alexander $
|
||||
*/
|
||||
|
||||
/** Zend_Search_Lucene_Index_SegmentInfo */
|
||||
require_once 'Zend/Search/Lucene/Index/SegmentInfo.php';
|
||||
|
||||
/** Zend_Search_Lucene_Index_SegmentWriter */
|
||||
require_once 'Zend/Search/Lucene/Index/SegmentWriter.php';
|
||||
|
||||
@ -82,6 +79,9 @@ class Zend_Search_Lucene_Index_SegmentWriter_StreamWriter extends Zend_Search_Lu
|
||||
$this->_dumpFNM();
|
||||
$this->_generateCFS();
|
||||
|
||||
/** Zend_Search_Lucene_Index_SegmentInfo */
|
||||
require_once 'Zend/Search/Lucene/Index/SegmentInfo.php';
|
||||
|
||||
return new Zend_Search_Lucene_Index_SegmentInfo($this->_directory,
|
||||
$this->_name,
|
||||
$this->_docCount,
|
||||
|
@ -17,10 +17,10 @@
|
||||
* @subpackage Index
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: TermsPriorityQueue.php 16541 2009-07-07 06:59:03Z bkarwin $
|
||||
* @version $Id: TermsPriorityQueue.php 18947 2009-11-12 11:57:17Z alexander $
|
||||
*/
|
||||
|
||||
/** Zend_Search_Lucene */
|
||||
/** Zend_Search_Lucene_PriorityQueue */
|
||||
require_once 'Zend/Search/Lucene/PriorityQueue.php';
|
||||
|
||||
/**
|
||||
|
@ -1,66 +1,66 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to license@zend.com so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Search_Lucene
|
||||
* @subpackage Index
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: Interface.php 16971 2009-07-22 18:05:45Z mikaelkael $
|
||||
*/
|
||||
|
||||
/**
|
||||
* @category Zend
|
||||
* @package Zend_Search_Lucene
|
||||
* @subpackage Index
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
interface Zend_Search_Lucene_Index_TermsStream_Interface
|
||||
{
|
||||
/**
|
||||
* Reset terms stream.
|
||||
*/
|
||||
public function resetTermsStream();
|
||||
|
||||
/**
|
||||
* Skip terms stream up to specified term preffix.
|
||||
*
|
||||
* Prefix contains fully specified field info and portion of searched term
|
||||
*
|
||||
* @param Zend_Search_Lucene_Index_Term $prefix
|
||||
*/
|
||||
public function skipTo(Zend_Search_Lucene_Index_Term $prefix);
|
||||
|
||||
/**
|
||||
* Scans terms dictionary and returns next term
|
||||
*
|
||||
* @return Zend_Search_Lucene_Index_Term|null
|
||||
*/
|
||||
public function nextTerm();
|
||||
|
||||
/**
|
||||
* Returns term in current position
|
||||
*
|
||||
* @return Zend_Search_Lucene_Index_Term|null
|
||||
*/
|
||||
public function currentTerm();
|
||||
|
||||
/**
|
||||
* Close terms stream
|
||||
*
|
||||
* Should be used for resources clean up if stream is not read up to the end
|
||||
*/
|
||||
public function closeTermsStream();
|
||||
}
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to license@zend.com so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Search_Lucene
|
||||
* @subpackage Index
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: Interface.php 18946 2009-11-12 11:48:58Z alexander $
|
||||
*/
|
||||
|
||||
/**
|
||||
* @category Zend
|
||||
* @package Zend_Search_Lucene
|
||||
* @subpackage Index
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
interface Zend_Search_Lucene_Index_TermsStream_Interface
|
||||
{
|
||||
/**
|
||||
* Reset terms stream.
|
||||
*/
|
||||
public function resetTermsStream();
|
||||
|
||||
/**
|
||||
* Skip terms stream up to specified term preffix.
|
||||
*
|
||||
* Prefix contains fully specified field info and portion of searched term
|
||||
*
|
||||
* @param Zend_Search_Lucene_Index_Term $prefix
|
||||
*/
|
||||
public function skipTo(Zend_Search_Lucene_Index_Term $prefix);
|
||||
|
||||
/**
|
||||
* Scans terms dictionary and returns next term
|
||||
*
|
||||
* @return Zend_Search_Lucene_Index_Term|null
|
||||
*/
|
||||
public function nextTerm();
|
||||
|
||||
/**
|
||||
* Returns term in current position
|
||||
*
|
||||
* @return Zend_Search_Lucene_Index_Term|null
|
||||
*/
|
||||
public function currentTerm();
|
||||
|
||||
/**
|
||||
* Close terms stream
|
||||
*
|
||||
* Should be used for resources clean up if stream is not read up to the end
|
||||
*/
|
||||
public function closeTermsStream();
|
||||
}
|
||||
|
@ -17,24 +17,14 @@
|
||||
* @subpackage Index
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: Writer.php 16541 2009-07-07 06:59:03Z bkarwin $
|
||||
* @version $Id: Writer.php 18954 2009-11-12 20:01:33Z alexander $
|
||||
*/
|
||||
|
||||
|
||||
/** Zend_Search_Lucene_Index_SegmentWriter_DocumentWriter */
|
||||
require_once 'Zend/Search/Lucene/Index/SegmentWriter/DocumentWriter.php';
|
||||
|
||||
/** Zend_Search_Lucene_Index_SegmentInfo */
|
||||
require_once 'Zend/Search/Lucene/Index/SegmentInfo.php';
|
||||
|
||||
/** Zend_Search_Lucene_Index_SegmentMerger */
|
||||
require_once 'Zend/Search/Lucene/Index/SegmentMerger.php';
|
||||
|
||||
/** Zend_Search_Lucene_LockManager */
|
||||
require_once 'Zend/Search/Lucene/LockManager.php';
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @category Zend
|
||||
* @package Zend_Search_Lucene
|
||||
@ -244,6 +234,9 @@ class Zend_Search_Lucene_Index_Writer
|
||||
*/
|
||||
public function addDocument(Zend_Search_Lucene_Document $document)
|
||||
{
|
||||
/** Zend_Search_Lucene_Index_SegmentWriter_DocumentWriter */
|
||||
require_once 'Zend/Search/Lucene/Index/SegmentWriter/DocumentWriter.php';
|
||||
|
||||
if ($this->_currentSegment === null) {
|
||||
$this->_currentSegment =
|
||||
new Zend_Search_Lucene_Index_SegmentWriter_DocumentWriter($this->_directory, $this->_newSegmentName());
|
||||
@ -379,6 +372,9 @@ class Zend_Search_Lucene_Index_Writer
|
||||
private function _mergeSegments($segments)
|
||||
{
|
||||
$newName = $this->_newSegmentName();
|
||||
|
||||
/** Zend_Search_Lucene_Index_SegmentMerger */
|
||||
require_once 'Zend/Search/Lucene/Index/SegmentMerger.php';
|
||||
$merger = new Zend_Search_Lucene_Index_SegmentMerger($this->_directory,
|
||||
$newName);
|
||||
foreach ($segments as $segmentInfo) {
|
||||
@ -521,6 +517,8 @@ class Zend_Search_Lucene_Index_Writer
|
||||
$isCompound = true;
|
||||
}
|
||||
|
||||
/** Zend_Search_Lucene_Index_SegmentInfo */
|
||||
require_once 'Zend/Search/Lucene/Index/SegmentInfo.php';
|
||||
$this->_segmentInfos[$segName] =
|
||||
new Zend_Search_Lucene_Index_SegmentInfo($this->_directory,
|
||||
$segName,
|
||||
|
@ -16,13 +16,26 @@
|
||||
* @package Zend_Search_Lucene
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: Interface.php 16971 2009-07-22 18:05:45Z mikaelkael $
|
||||
* @version $Id: Interface.php 18947 2009-11-12 11:57:17Z alexander $
|
||||
*/
|
||||
|
||||
|
||||
/** Zend_Search_Lucene_Index_TermsStream_Interface */
|
||||
require_once 'Zend/Search/Lucene/Index/TermsStream/Interface.php';
|
||||
|
||||
|
||||
/** Classes used within Zend_Search_Lucene_Interface API */
|
||||
|
||||
/** Zend_Search_Lucene_Document */
|
||||
require_once 'Zend/Search/Lucene/Document.php';
|
||||
|
||||
/** Zend_Search_Lucene_Index_Term */
|
||||
require_once 'Zend/Search/Lucene/Index/Term.php';
|
||||
|
||||
/** Zend_Search_Lucene_Index_DocsFilter */
|
||||
require_once 'Zend/Search/Lucene/Index/DocsFilter.php';
|
||||
|
||||
|
||||
/**
|
||||
* @category Zend
|
||||
* @package Zend_Search_Lucene
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -17,19 +17,13 @@
|
||||
* @subpackage Search
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: BooleanExpressionRecognizer.php 16971 2009-07-22 18:05:45Z mikaelkael $
|
||||
* @version $Id: BooleanExpressionRecognizer.php 18954 2009-11-12 20:01:33Z alexander $
|
||||
*/
|
||||
|
||||
|
||||
/** Zend_Search_Lucene_FSM */
|
||||
require_once 'Zend/Search/Lucene/FSM.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_QueryToken */
|
||||
require_once 'Zend/Search/Lucene/Search/QueryToken.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_QueryParser */
|
||||
require_once 'Zend/Search/Lucene/Search/QueryParser.php';
|
||||
|
||||
/**
|
||||
* @category Zend
|
||||
* @package Zend_Search_Lucene
|
||||
@ -220,6 +214,9 @@ class Zend_Search_Lucene_Search_BooleanExpressionRecognizer extends Zend_Search_
|
||||
*/
|
||||
public function emptyOperatorAction()
|
||||
{
|
||||
/** Zend_Search_Lucene_Search_QueryParser */
|
||||
require_once 'Zend/Search/Lucene/Search/QueryParser.php';
|
||||
|
||||
if (Zend_Search_Lucene_Search_QueryParser::getDefaultOperator() == Zend_Search_Lucene_Search_QueryParser::B_AND) {
|
||||
// Do nothing
|
||||
} else {
|
||||
@ -235,6 +232,9 @@ class Zend_Search_Lucene_Search_BooleanExpressionRecognizer extends Zend_Search_
|
||||
*/
|
||||
public function emptyNotOperatorAction()
|
||||
{
|
||||
/** Zend_Search_Lucene_Search_QueryParser */
|
||||
require_once 'Zend/Search/Lucene/Search/QueryParser.php';
|
||||
|
||||
if (Zend_Search_Lucene_Search_QueryParser::getDefaultOperator() == Zend_Search_Lucene_Search_QueryParser::B_AND) {
|
||||
// Do nothing
|
||||
} else {
|
||||
|
@ -1,94 +1,94 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to license@zend.com so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Search_Lucene
|
||||
* @subpackage Search
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: Default.php 16971 2009-07-22 18:05:45Z mikaelkael $
|
||||
*/
|
||||
|
||||
/** Zend_Search_Lucene_Search_Highlighter_Interface */
|
||||
require_once 'Zend/Search/Lucene/Search/Highlighter/Interface.php';
|
||||
/**
|
||||
* @category Zend
|
||||
* @package Zend_Search_Lucene
|
||||
* @subpackage Search
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Search_Lucene_Search_Highlighter_Default implements Zend_Search_Lucene_Search_Highlighter_Interface
|
||||
{
|
||||
/**
|
||||
* List of colors for text highlighting
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $_highlightColors = array('#66ffff', '#ff66ff', '#ffff66',
|
||||
'#ff8888', '#88ff88', '#8888ff',
|
||||
'#88dddd', '#dd88dd', '#dddd88',
|
||||
'#aaddff', '#aaffdd', '#ddaaff',
|
||||
'#ddffaa', '#ffaadd', '#ffddaa');
|
||||
|
||||
/**
|
||||
* Index of current color for highlighting
|
||||
*
|
||||
* Index is increased at each highlight() call, so terms matching different queries are highlighted using different colors.
|
||||
*
|
||||
* @var integer
|
||||
*/
|
||||
protected $_currentColorIndex = 0;
|
||||
|
||||
/**
|
||||
* HTML document for highlighting
|
||||
*
|
||||
* @var Zend_Search_Lucene_Document_Html
|
||||
*/
|
||||
protected $_doc;
|
||||
|
||||
/**
|
||||
* Set document for highlighting.
|
||||
*
|
||||
* @param Zend_Search_Lucene_Document_Html $document
|
||||
*/
|
||||
public function setDocument(Zend_Search_Lucene_Document_Html $document)
|
||||
{
|
||||
$this->_doc = $document;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get document for highlighting.
|
||||
*
|
||||
* @return Zend_Search_Lucene_Document_Html $document
|
||||
*/
|
||||
public function getDocument()
|
||||
{
|
||||
return $this->_doc;
|
||||
}
|
||||
|
||||
/**
|
||||
* Highlight specified words
|
||||
*
|
||||
* @param string|array $words Words to highlight. They could be organized using the array or string.
|
||||
*/
|
||||
public function highlight($words)
|
||||
{
|
||||
$color = $this->_highlightColors[$this->_currentColorIndex];
|
||||
$this->_currentColorIndex = ($this->_currentColorIndex + 1) % count($this->_highlightColors);
|
||||
|
||||
$this->_doc->highlight($words, $color);
|
||||
}
|
||||
|
||||
}
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to license@zend.com so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Search_Lucene
|
||||
* @subpackage Search
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: Default.php 18946 2009-11-12 11:48:58Z alexander $
|
||||
*/
|
||||
|
||||
/** @see Zend_Search_Lucene_Search_Highlighter_Interface */
|
||||
require_once 'Zend/Search/Lucene/Search/Highlighter/Interface.php';
|
||||
/**
|
||||
* @category Zend
|
||||
* @package Zend_Search_Lucene
|
||||
* @subpackage Search
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Search_Lucene_Search_Highlighter_Default implements Zend_Search_Lucene_Search_Highlighter_Interface
|
||||
{
|
||||
/**
|
||||
* List of colors for text highlighting
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $_highlightColors = array('#66ffff', '#ff66ff', '#ffff66',
|
||||
'#ff8888', '#88ff88', '#8888ff',
|
||||
'#88dddd', '#dd88dd', '#dddd88',
|
||||
'#aaddff', '#aaffdd', '#ddaaff',
|
||||
'#ddffaa', '#ffaadd', '#ffddaa');
|
||||
|
||||
/**
|
||||
* Index of current color for highlighting
|
||||
*
|
||||
* Index is increased at each highlight() call, so terms matching different queries are highlighted using different colors.
|
||||
*
|
||||
* @var integer
|
||||
*/
|
||||
protected $_currentColorIndex = 0;
|
||||
|
||||
/**
|
||||
* HTML document for highlighting
|
||||
*
|
||||
* @var Zend_Search_Lucene_Document_Html
|
||||
*/
|
||||
protected $_doc;
|
||||
|
||||
/**
|
||||
* Set document for highlighting.
|
||||
*
|
||||
* @param Zend_Search_Lucene_Document_Html $document
|
||||
*/
|
||||
public function setDocument(Zend_Search_Lucene_Document_Html $document)
|
||||
{
|
||||
$this->_doc = $document;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get document for highlighting.
|
||||
*
|
||||
* @return Zend_Search_Lucene_Document_Html $document
|
||||
*/
|
||||
public function getDocument()
|
||||
{
|
||||
return $this->_doc;
|
||||
}
|
||||
|
||||
/**
|
||||
* Highlight specified words
|
||||
*
|
||||
* @param string|array $words Words to highlight. They could be organized using the array or string.
|
||||
*/
|
||||
public function highlight($words)
|
||||
{
|
||||
$color = $this->_highlightColors[$this->_currentColorIndex];
|
||||
$this->_currentColorIndex = ($this->_currentColorIndex + 1) % count($this->_highlightColors);
|
||||
|
||||
$this->_doc->highlight($words, $color);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,53 +1,53 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to license@zend.com so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Search_Lucene
|
||||
* @subpackage Search
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: Interface.php 16971 2009-07-22 18:05:45Z mikaelkael $
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* @category Zend
|
||||
* @package Zend_Search_Lucene
|
||||
* @subpackage Search
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
interface Zend_Search_Lucene_Search_Highlighter_Interface
|
||||
{
|
||||
/**
|
||||
* Set document for highlighting.
|
||||
*
|
||||
* @param Zend_Search_Lucene_Document_Html $document
|
||||
*/
|
||||
public function setDocument(Zend_Search_Lucene_Document_Html $document);
|
||||
|
||||
/**
|
||||
* Get document for highlighting.
|
||||
*
|
||||
* @return Zend_Search_Lucene_Document_Html $document
|
||||
*/
|
||||
public function getDocument();
|
||||
|
||||
/**
|
||||
* Highlight specified words (method is invoked once per subquery)
|
||||
*
|
||||
* @param string|array $words Words to highlight. They could be organized using the array or string.
|
||||
*/
|
||||
public function highlight($words);
|
||||
}
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to license@zend.com so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Search_Lucene
|
||||
* @subpackage Search
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: Interface.php 18946 2009-11-12 11:48:58Z alexander $
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* @category Zend
|
||||
* @package Zend_Search_Lucene
|
||||
* @subpackage Search
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
interface Zend_Search_Lucene_Search_Highlighter_Interface
|
||||
{
|
||||
/**
|
||||
* Set document for highlighting.
|
||||
*
|
||||
* @param Zend_Search_Lucene_Document_Html $document
|
||||
*/
|
||||
public function setDocument(Zend_Search_Lucene_Document_Html $document);
|
||||
|
||||
/**
|
||||
* Get document for highlighting.
|
||||
*
|
||||
* @return Zend_Search_Lucene_Document_Html $document
|
||||
*/
|
||||
public function getDocument();
|
||||
|
||||
/**
|
||||
* Highlight specified words (method is invoked once per subquery)
|
||||
*
|
||||
* @param string|array $words Words to highlight. They could be organized using the array or string.
|
||||
*/
|
||||
public function highlight($words);
|
||||
}
|
||||
|
@ -17,18 +17,9 @@
|
||||
* @subpackage Search
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: Query.php 16541 2009-07-07 06:59:03Z bkarwin $
|
||||
* @version $Id: Query.php 18954 2009-11-12 20:01:33Z alexander $
|
||||
*/
|
||||
|
||||
/** Zend_Search_Lucene_Document_Html */
|
||||
require_once 'Zend/Search/Lucene/Document/Html.php';
|
||||
|
||||
/** Zend_Search_Lucene_Index_DocsFilter */
|
||||
require_once 'Zend/Search/Lucene/Index/DocsFilter.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_Highlighter_Default */
|
||||
require_once 'Zend/Search/Lucene/Search/Highlighter/Default.php';
|
||||
|
||||
|
||||
/**
|
||||
* @category Zend
|
||||
@ -195,9 +186,13 @@ abstract class Zend_Search_Lucene_Search_Query
|
||||
public function highlightMatches($inputHTML, $defaultEncoding = '', $highlighter = null)
|
||||
{
|
||||
if ($highlighter === null) {
|
||||
$highlighter = new Zend_Search_Lucene_Search_Highlighter_Default();
|
||||
require_once 'Zend/Search/Lucene/Search/Highlighter/Default.php';
|
||||
$highlighter = new Zend_Search_Lucene_Search_Highlighter_Default();
|
||||
}
|
||||
|
||||
/** Zend_Search_Lucene_Document_Html */
|
||||
require_once 'Zend/Search/Lucene/Document/Html.php';
|
||||
|
||||
$doc = Zend_Search_Lucene_Document_Html::loadHTML($inputHTML, false, $defaultEncoding);
|
||||
$highlighter->setDocument($doc);
|
||||
|
||||
@ -217,13 +212,17 @@ abstract class Zend_Search_Lucene_Search_Query
|
||||
public function htmlFragmentHighlightMatches($inputHtmlFragment, $encoding = 'UTF-8', $highlighter = null)
|
||||
{
|
||||
if ($highlighter === null) {
|
||||
require_once 'Zend/Search/Lucene/Search/Highlighter/Default.php';
|
||||
$highlighter = new Zend_Search_Lucene_Search_Highlighter_Default();
|
||||
}
|
||||
|
||||
$inputHTML = '<html><head><META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=UTF-8"/></head><body>'
|
||||
. iconv($encoding, 'UTF-8//IGNORE', $inputHtmlFragment) . '</body></html>';
|
||||
|
||||
$doc = Zend_Search_Lucene_Document_Html::loadHTML($inputHTML);
|
||||
/** Zend_Search_Lucene_Document_Html */
|
||||
require_once 'Zend/Search/Lucene/Document/Html.php';
|
||||
|
||||
$doc = Zend_Search_Lucene_Document_Html::loadHTML($inputHTML);
|
||||
$highlighter->setDocument($doc);
|
||||
|
||||
$this->_highlightMatches($highlighter);
|
||||
|
@ -17,16 +17,13 @@
|
||||
* @subpackage Search
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: Boolean.php 16541 2009-07-07 06:59:03Z bkarwin $
|
||||
* @version $Id: Boolean.php 18954 2009-11-12 20:01:33Z alexander $
|
||||
*/
|
||||
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query */
|
||||
require_once 'Zend/Search/Lucene/Search/Query.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_Weight_Boolean */
|
||||
require_once 'Zend/Search/Lucene/Search/Weight/Boolean.php';
|
||||
|
||||
|
||||
/**
|
||||
* @category Zend
|
||||
@ -177,6 +174,7 @@ class Zend_Search_Lucene_Search_Query_Boolean extends Zend_Search_Lucene_Search_
|
||||
}
|
||||
if (count($subqueries) == 0) {
|
||||
// Boolean query doesn't has non-insignificant subqueries
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Insignificant.php';
|
||||
return new Zend_Search_Lucene_Search_Query_Insignificant();
|
||||
}
|
||||
// Check if all non-insignificant subqueries are prohibited
|
||||
@ -188,6 +186,7 @@ class Zend_Search_Lucene_Search_Query_Boolean extends Zend_Search_Lucene_Search_
|
||||
}
|
||||
}
|
||||
if ($allProhibited) {
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Insignificant.php';
|
||||
return new Zend_Search_Lucene_Search_Query_Insignificant();
|
||||
}
|
||||
|
||||
@ -197,6 +196,7 @@ class Zend_Search_Lucene_Search_Query_Boolean extends Zend_Search_Lucene_Search_
|
||||
if ($subquery instanceof Zend_Search_Lucene_Search_Query_Empty) {
|
||||
if ($signs[$id] === true) {
|
||||
// Matching is required, but is actually empty
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Empty.php';
|
||||
return new Zend_Search_Lucene_Search_Query_Empty();
|
||||
} else {
|
||||
// Matching is optional or prohibited, but is empty
|
||||
@ -209,6 +209,7 @@ class Zend_Search_Lucene_Search_Query_Boolean extends Zend_Search_Lucene_Search_
|
||||
|
||||
// Check, if reduced subqueries list is empty
|
||||
if (count($subqueries) == 0) {
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Empty.php';
|
||||
return new Zend_Search_Lucene_Search_Query_Empty();
|
||||
}
|
||||
|
||||
@ -221,6 +222,7 @@ class Zend_Search_Lucene_Search_Query_Boolean extends Zend_Search_Lucene_Search_
|
||||
}
|
||||
}
|
||||
if ($allProhibited) {
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Empty.php';
|
||||
return new Zend_Search_Lucene_Search_Query_Empty();
|
||||
}
|
||||
|
||||
@ -355,6 +357,7 @@ class Zend_Search_Lucene_Search_Query_Boolean extends Zend_Search_Lucene_Search_
|
||||
|
||||
// Check, if all subqueries have been decomposed and all terms has the same boost factor
|
||||
if (count($subqueries) == 0 && count(array_unique($boostFactors)) == 1) {
|
||||
require_once 'Zend/Search/Lucene/Search/Query/MultiTerm.php';
|
||||
$optimizedQuery = new Zend_Search_Lucene_Search_Query_MultiTerm($terms, $tsigns);
|
||||
$optimizedQuery->setBoost(reset($boostFactors)*$this->getBoost());
|
||||
|
||||
@ -378,6 +381,7 @@ class Zend_Search_Lucene_Search_Query_Boolean extends Zend_Search_Lucene_Search_
|
||||
}
|
||||
|
||||
if (count($terms) == 1) {
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Term.php';
|
||||
$clause = new Zend_Search_Lucene_Search_Query_Term(reset($terms));
|
||||
$clause->setBoost(reset($boostFactors));
|
||||
|
||||
@ -387,6 +391,7 @@ class Zend_Search_Lucene_Search_Query_Boolean extends Zend_Search_Lucene_Search_
|
||||
// Clear terms list
|
||||
$terms = array();
|
||||
} else if (count($terms) > 1 && count(array_unique($boostFactors)) == 1) {
|
||||
require_once 'Zend/Search/Lucene/Search/Query/MultiTerm.php';
|
||||
$clause = new Zend_Search_Lucene_Search_Query_MultiTerm($terms, $tsigns);
|
||||
$clause->setBoost(reset($boostFactors));
|
||||
|
||||
@ -400,6 +405,7 @@ class Zend_Search_Lucene_Search_Query_Boolean extends Zend_Search_Lucene_Search_
|
||||
|
||||
if (count($prohibitedTerms) == 1) {
|
||||
// (boost factors are not significant for prohibited clauses)
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Term.php';
|
||||
$subqueries[] = new Zend_Search_Lucene_Search_Query_Term(reset($prohibitedTerms));
|
||||
$signs[] = false;
|
||||
|
||||
@ -414,6 +420,7 @@ class Zend_Search_Lucene_Search_Query_Boolean extends Zend_Search_Lucene_Search_
|
||||
}
|
||||
|
||||
// (boost factors are not significant for prohibited clauses)
|
||||
require_once 'Zend/Search/Lucene/Search/Query/MultiTerm.php';
|
||||
$subqueries[] = new Zend_Search_Lucene_Search_Query_MultiTerm($prohibitedTerms, $prohibitedSigns);
|
||||
// Clause sign is 'prohibited'
|
||||
$signs[] = false;
|
||||
@ -464,6 +471,7 @@ class Zend_Search_Lucene_Search_Query_Boolean extends Zend_Search_Lucene_Search_
|
||||
*/
|
||||
public function createWeight(Zend_Search_Lucene_Interface $reader)
|
||||
{
|
||||
require_once 'Zend/Search/Lucene/Search/Weight/Boolean.php';
|
||||
$this->_weight = new Zend_Search_Lucene_Search_Weight_Boolean($this, $reader);
|
||||
return $this->_weight;
|
||||
}
|
||||
@ -686,6 +694,7 @@ class Zend_Search_Lucene_Search_Query_Boolean extends Zend_Search_Lucene_Search_
|
||||
|
||||
if ($docsFilter === null) {
|
||||
// Create local documents filter if it's not provided by upper query
|
||||
require_once 'Zend/Search/Lucene/Index/DocsFilter.php';
|
||||
$docsFilter = new Zend_Search_Lucene_Index_DocsFilter();
|
||||
}
|
||||
|
||||
|
@ -17,16 +17,13 @@
|
||||
* @subpackage Search
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: Empty.php 16971 2009-07-22 18:05:45Z mikaelkael $
|
||||
* @version $Id: Empty.php 18954 2009-11-12 20:01:33Z alexander $
|
||||
*/
|
||||
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query */
|
||||
require_once 'Zend/Search/Lucene/Search/Query.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_Weight_Empty */
|
||||
require_once 'Zend/Search/Lucene/Search/Weight/Empty.php';
|
||||
|
||||
|
||||
/**
|
||||
* @category Zend
|
||||
@ -68,6 +65,7 @@ class Zend_Search_Lucene_Search_Query_Empty extends Zend_Search_Lucene_Search_Qu
|
||||
*/
|
||||
public function createWeight(Zend_Search_Lucene_Interface $reader)
|
||||
{
|
||||
require_once 'Zend/Search/Lucene/Search/Weight/Empty.php';
|
||||
return new Zend_Search_Lucene_Search_Weight_Empty();
|
||||
}
|
||||
|
||||
|
@ -17,16 +17,13 @@
|
||||
* @subpackage Search
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: Fuzzy.php 16971 2009-07-22 18:05:45Z mikaelkael $
|
||||
* @version $Id: Fuzzy.php 18954 2009-11-12 20:01:33Z alexander $
|
||||
*/
|
||||
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query */
|
||||
require_once 'Zend/Search/Lucene/Search/Query.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query_MultiTerm */
|
||||
require_once 'Zend/Search/Lucene/Search/Query/MultiTerm.php';
|
||||
|
||||
|
||||
/**
|
||||
* @category Zend
|
||||
@ -196,6 +193,7 @@ class Zend_Search_Lucene_Search_Query_Fuzzy extends Zend_Search_Lucene_Search_Qu
|
||||
$fields = array($this->_term->field);
|
||||
}
|
||||
|
||||
require_once 'Zend/Search/Lucene/Index/Term.php';
|
||||
$prefix = Zend_Search_Lucene_Index_Term::getPrefix($this->_term->text, $this->_prefixLength);
|
||||
$prefixByteLength = strlen($prefix);
|
||||
$prefixUtf8Length = Zend_Search_Lucene_Index_Term::getLength($prefix);
|
||||
@ -208,10 +206,12 @@ class Zend_Search_Lucene_Search_Query_Fuzzy extends Zend_Search_Lucene_Search_Qu
|
||||
|
||||
$scaleFactor = 1/(1 - $this->_minimumSimilarity);
|
||||
|
||||
require_once 'Zend/Search/Lucene.php';
|
||||
$maxTerms = Zend_Search_Lucene::getTermsPerQueryLimit();
|
||||
foreach ($fields as $field) {
|
||||
$index->resetTermsStream();
|
||||
|
||||
require_once 'Zend/Search/Lucene/Index/Term.php';
|
||||
if ($prefix != '') {
|
||||
$index->skipTo(new Zend_Search_Lucene_Index_Term($prefix, $field));
|
||||
|
||||
@ -298,10 +298,13 @@ class Zend_Search_Lucene_Search_Query_Fuzzy extends Zend_Search_Lucene_Search_Qu
|
||||
}
|
||||
|
||||
if (count($this->_matches) == 0) {
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Empty.php';
|
||||
return new Zend_Search_Lucene_Search_Query_Empty();
|
||||
} else if (count($this->_matches) == 1) {
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Term.php';
|
||||
return new Zend_Search_Lucene_Search_Query_Term(reset($this->_matches));
|
||||
} else {
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Boolean.php';
|
||||
$rewrittenQuery = new Zend_Search_Lucene_Search_Query_Boolean();
|
||||
|
||||
array_multisort($this->_scores, SORT_DESC, SORT_NUMERIC,
|
||||
@ -309,6 +312,7 @@ class Zend_Search_Lucene_Search_Query_Fuzzy extends Zend_Search_Lucene_Search_Qu
|
||||
$this->_matches);
|
||||
|
||||
$termCount = 0;
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Term.php';
|
||||
foreach ($this->_matches as $id => $matchedTerm) {
|
||||
$subquery = new Zend_Search_Lucene_Search_Query_Term($matchedTerm);
|
||||
$subquery->setBoost($this->_scores[$id]);
|
||||
@ -418,6 +422,7 @@ class Zend_Search_Lucene_Search_Query_Fuzzy extends Zend_Search_Lucene_Search_Qu
|
||||
{
|
||||
$words = array();
|
||||
|
||||
require_once 'Zend/Search/Lucene/Index/Term.php';
|
||||
$prefix = Zend_Search_Lucene_Index_Term::getPrefix($this->_term->text, $this->_prefixLength);
|
||||
$prefixByteLength = strlen($prefix);
|
||||
$prefixUtf8Length = Zend_Search_Lucene_Index_Term::getLength($prefix);
|
||||
@ -430,13 +435,13 @@ class Zend_Search_Lucene_Search_Query_Fuzzy extends Zend_Search_Lucene_Search_Qu
|
||||
|
||||
$scaleFactor = 1/(1 - $this->_minimumSimilarity);
|
||||
|
||||
|
||||
$docBody = $highlighter->getDocument()->getFieldUtf8Value('body');
|
||||
require_once 'Zend/Search/Lucene/Analysis/Analyzer.php';
|
||||
$tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($docBody, 'UTF-8');
|
||||
foreach ($tokens as $token) {
|
||||
$termText = $token->getTermText();
|
||||
$termText = $token->getTermText();
|
||||
|
||||
if (substr($termText, 0, $prefixByteLength) == $prefix) {
|
||||
if (substr($termText, 0, $prefixByteLength) == $prefix) {
|
||||
// Calculate similarity
|
||||
$target = substr($termText, $prefixByteLength);
|
||||
|
||||
|
@ -17,16 +17,13 @@
|
||||
* @subpackage Search
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: Insignificant.php 16971 2009-07-22 18:05:45Z mikaelkael $
|
||||
* @version $Id: Insignificant.php 18954 2009-11-12 20:01:33Z alexander $
|
||||
*/
|
||||
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query */
|
||||
require_once 'Zend/Search/Lucene/Search/Query.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_Weight_Empty */
|
||||
require_once 'Zend/Search/Lucene/Search/Weight/Empty.php';
|
||||
|
||||
|
||||
/**
|
||||
* The insignificant query returns empty result, but doesn't limit result set as a part of other queries
|
||||
@ -69,6 +66,7 @@ class Zend_Search_Lucene_Search_Query_Insignificant extends Zend_Search_Lucene_S
|
||||
*/
|
||||
public function createWeight(Zend_Search_Lucene_Interface $reader)
|
||||
{
|
||||
require_once 'Zend/Search/Lucene/Search/Weight/Empty.php';
|
||||
return new Zend_Search_Lucene_Search_Weight_Empty();
|
||||
}
|
||||
|
||||
|
@ -17,16 +17,13 @@
|
||||
* @subpackage Search
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: MultiTerm.php 16541 2009-07-07 06:59:03Z bkarwin $
|
||||
* @version $Id: MultiTerm.php 18954 2009-11-12 20:01:33Z alexander $
|
||||
*/
|
||||
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query */
|
||||
require_once 'Zend/Search/Lucene/Search/Query.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_Weight_MultiTerm */
|
||||
require_once 'Zend/Search/Lucene/Search/Weight/MultiTerm.php';
|
||||
|
||||
|
||||
/**
|
||||
* @category Zend
|
||||
@ -109,6 +106,7 @@ class Zend_Search_Lucene_Search_Query_MultiTerm extends Zend_Search_Lucene_Searc
|
||||
public function __construct($terms = null, $signs = null)
|
||||
{
|
||||
if (is_array($terms)) {
|
||||
require_once 'Zend/Search/Lucene.php';
|
||||
if (count($terms) > Zend_Search_Lucene::getTermsPerQueryLimit()) {
|
||||
throw new Zend_Search_Lucene_Exception('Terms per query limit is reached.');
|
||||
}
|
||||
@ -165,6 +163,7 @@ class Zend_Search_Lucene_Search_Query_MultiTerm extends Zend_Search_Lucene_Searc
|
||||
public function rewrite(Zend_Search_Lucene_Interface $index)
|
||||
{
|
||||
if (count($this->_terms) == 0) {
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Empty.php';
|
||||
return new Zend_Search_Lucene_Search_Query_Empty();
|
||||
}
|
||||
|
||||
@ -181,9 +180,11 @@ class Zend_Search_Lucene_Search_Query_MultiTerm extends Zend_Search_Lucene_Searc
|
||||
return $this;
|
||||
} else {
|
||||
/** transform multiterm query to boolean and apply rewrite() method to subqueries. */
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Boolean.php';
|
||||
$query = new Zend_Search_Lucene_Search_Query_Boolean();
|
||||
$query->setBoost($this->getBoost());
|
||||
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Term.php';
|
||||
foreach ($this->_terms as $termId => $term) {
|
||||
$subquery = new Zend_Search_Lucene_Search_Query_Term($term);
|
||||
|
||||
@ -210,6 +211,7 @@ class Zend_Search_Lucene_Search_Query_MultiTerm extends Zend_Search_Lucene_Searc
|
||||
if (!$index->hasTerm($term)) {
|
||||
if ($signs === null || $signs[$id] === true) {
|
||||
// Term is required
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Empty.php';
|
||||
return new Zend_Search_Lucene_Search_Query_Empty();
|
||||
} else {
|
||||
// Term is optional or prohibited
|
||||
@ -233,6 +235,7 @@ class Zend_Search_Lucene_Search_Query_MultiTerm extends Zend_Search_Lucene_Searc
|
||||
}
|
||||
}
|
||||
if ($allProhibited) {
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Empty.php';
|
||||
return new Zend_Search_Lucene_Search_Query_Empty();
|
||||
}
|
||||
|
||||
@ -245,6 +248,7 @@ class Zend_Search_Lucene_Search_Query_MultiTerm extends Zend_Search_Lucene_Searc
|
||||
// It's already checked, that it's not a prohibited term
|
||||
|
||||
// It's one term query with one required or optional element
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Term.php';
|
||||
$optimizedQuery = new Zend_Search_Lucene_Search_Query_Term(reset($terms));
|
||||
$optimizedQuery->setBoost($this->getBoost());
|
||||
|
||||
@ -252,6 +256,7 @@ class Zend_Search_Lucene_Search_Query_MultiTerm extends Zend_Search_Lucene_Searc
|
||||
}
|
||||
|
||||
if (count($terms) == 0) {
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Empty.php';
|
||||
return new Zend_Search_Lucene_Search_Query_Empty();
|
||||
}
|
||||
|
||||
@ -303,6 +308,7 @@ class Zend_Search_Lucene_Search_Query_MultiTerm extends Zend_Search_Lucene_Searc
|
||||
*/
|
||||
public function createWeight(Zend_Search_Lucene_Interface $reader)
|
||||
{
|
||||
require_once 'Zend/Search/Lucene/Search/Weight/MultiTerm.php';
|
||||
$this->_weight = new Zend_Search_Lucene_Search_Weight_MultiTerm($this, $reader);
|
||||
return $this->_weight;
|
||||
}
|
||||
@ -333,6 +339,7 @@ class Zend_Search_Lucene_Search_Query_MultiTerm extends Zend_Search_Lucene_Searc
|
||||
$ids, SORT_ASC, SORT_NUMERIC,
|
||||
$this->_terms);
|
||||
|
||||
require_once 'Zend/Search/Lucene/Index/DocsFilter.php';
|
||||
$docsFilter = new Zend_Search_Lucene_Index_DocsFilter();
|
||||
foreach ($this->_terms as $termId => $term) {
|
||||
$termDocs = $reader->termDocs($term, $docsFilter);
|
||||
|
@ -17,20 +17,13 @@
|
||||
* @subpackage Search
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: Phrase.php 16541 2009-07-07 06:59:03Z bkarwin $
|
||||
* @version $Id: Phrase.php 18954 2009-11-12 20:01:33Z alexander $
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* Zend_Search_Lucene_Search_Query
|
||||
*/
|
||||
/** Zend_Search_Lucene_Search_Query */
|
||||
require_once 'Zend/Search/Lucene/Search/Query.php';
|
||||
|
||||
/**
|
||||
* Zend_Search_Lucene_Search_Weight_Phrase
|
||||
*/
|
||||
require_once 'Zend/Search/Lucene/Search/Weight/Phrase.php';
|
||||
|
||||
|
||||
/**
|
||||
* A Query that matches documents containing a particular sequence of terms.
|
||||
@ -109,6 +102,7 @@ class Zend_Search_Lucene_Search_Query_Phrase extends Zend_Search_Lucene_Search_Q
|
||||
|
||||
if (is_array($terms)) {
|
||||
$this->_terms = array();
|
||||
require_once 'Zend/Search/Lucene/Index/Term.php';
|
||||
foreach ($terms as $termId => $termText) {
|
||||
$this->_terms[$termId] = ($field !== null)? new Zend_Search_Lucene_Index_Term($termText, $field):
|
||||
new Zend_Search_Lucene_Index_Term($termText);
|
||||
@ -116,11 +110,13 @@ class Zend_Search_Lucene_Search_Query_Phrase extends Zend_Search_Lucene_Search_Q
|
||||
} else if ($terms === null) {
|
||||
$this->_terms = array();
|
||||
} else {
|
||||
require_once 'Zend/Search/Lucene/Exception.php';
|
||||
throw new Zend_Search_Lucene_Exception('terms argument must be array of strings or null');
|
||||
}
|
||||
|
||||
if (is_array($offsets)) {
|
||||
if (count($this->_terms) != count($offsets)) {
|
||||
require_once 'Zend/Search/Lucene/Exception.php';
|
||||
throw new Zend_Search_Lucene_Exception('terms and offsets arguments must have the same size.');
|
||||
}
|
||||
$this->_offsets = $offsets;
|
||||
@ -131,6 +127,7 @@ class Zend_Search_Lucene_Search_Query_Phrase extends Zend_Search_Lucene_Search_Q
|
||||
$this->_offsets[$termId] = $position;
|
||||
}
|
||||
} else {
|
||||
require_once 'Zend/Search/Lucene/Exception.php';
|
||||
throw new Zend_Search_Lucene_Exception('offsets argument must be array of strings or null');
|
||||
}
|
||||
}
|
||||
@ -167,6 +164,7 @@ class Zend_Search_Lucene_Search_Query_Phrase extends Zend_Search_Lucene_Search_Q
|
||||
*/
|
||||
public function addTerm(Zend_Search_Lucene_Index_Term $term, $position = null) {
|
||||
if ((count($this->_terms) != 0)&&(end($this->_terms)->field != $term->field)) {
|
||||
require_once 'Zend/Search/Lucene/Exception.php';
|
||||
throw new Zend_Search_Lucene_Exception('All phrase terms must be in the same field: ' .
|
||||
$term->field . ':' . $term->text);
|
||||
}
|
||||
@ -191,10 +189,12 @@ class Zend_Search_Lucene_Search_Query_Phrase extends Zend_Search_Lucene_Search_Q
|
||||
public function rewrite(Zend_Search_Lucene_Interface $index)
|
||||
{
|
||||
if (count($this->_terms) == 0) {
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Empty.php';
|
||||
return new Zend_Search_Lucene_Search_Query_Empty();
|
||||
} else if ($this->_terms[0]->field !== null) {
|
||||
return $this;
|
||||
} else {
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Boolean.php';
|
||||
$query = new Zend_Search_Lucene_Search_Query_Boolean();
|
||||
$query->setBoost($this->getBoost());
|
||||
|
||||
@ -202,6 +202,7 @@ class Zend_Search_Lucene_Search_Query_Phrase extends Zend_Search_Lucene_Search_Q
|
||||
$subquery = new Zend_Search_Lucene_Search_Query_Phrase();
|
||||
$subquery->setSlop($this->getSlop());
|
||||
|
||||
require_once 'Zend/Search/Lucene/Index/Term.php';
|
||||
foreach ($this->_terms as $termId => $term) {
|
||||
$qualifiedTerm = new Zend_Search_Lucene_Index_Term($term->text, $fieldName);
|
||||
|
||||
@ -226,12 +227,14 @@ class Zend_Search_Lucene_Search_Query_Phrase extends Zend_Search_Lucene_Search_Q
|
||||
// Check, that index contains all phrase terms
|
||||
foreach ($this->_terms as $term) {
|
||||
if (!$index->hasTerm($term)) {
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Empty.php';
|
||||
return new Zend_Search_Lucene_Search_Query_Empty();
|
||||
}
|
||||
}
|
||||
|
||||
if (count($this->_terms) == 1) {
|
||||
// It's one term query
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Term.php';
|
||||
$optimizedQuery = new Zend_Search_Lucene_Search_Query_Term(reset($this->_terms));
|
||||
$optimizedQuery->setBoost($this->getBoost());
|
||||
|
||||
@ -239,6 +242,7 @@ class Zend_Search_Lucene_Search_Query_Phrase extends Zend_Search_Lucene_Search_Q
|
||||
}
|
||||
|
||||
if (count($this->_terms) == 0) {
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Empty.php';
|
||||
return new Zend_Search_Lucene_Search_Query_Empty();
|
||||
}
|
||||
|
||||
@ -277,6 +281,7 @@ class Zend_Search_Lucene_Search_Query_Phrase extends Zend_Search_Lucene_Search_Q
|
||||
*/
|
||||
public function createWeight(Zend_Search_Lucene_Interface $reader)
|
||||
{
|
||||
require_once 'Zend/Search/Lucene/Search/Weight/Phrase.php';
|
||||
$this->_weight = new Zend_Search_Lucene_Search_Weight_Phrase($this, $reader);
|
||||
return $this->_weight;
|
||||
}
|
||||
@ -543,7 +548,7 @@ class Zend_Search_Lucene_Search_Query_Phrase extends Zend_Search_Lucene_Search_Q
|
||||
if (isset($this->_terms[0]) && $this->_terms[0]->field !== null) {
|
||||
$query = $this->_terms[0]->field . ':';
|
||||
} else {
|
||||
$query = '';
|
||||
$query = '';
|
||||
}
|
||||
|
||||
$query .= '"';
|
||||
|
@ -1,134 +1,127 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to license@zend.com so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Search_Lucene
|
||||
* @subpackage Search
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: Preprocessing.php 16971 2009-07-22 18:05:45Z mikaelkael $
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* Zend_Search_Lucene_Search_Query
|
||||
*/
|
||||
require_once 'Zend/Search/Lucene/Search/Query.php';
|
||||
|
||||
/**
|
||||
* Zend_Search_Lucene_Search_Weight
|
||||
*/
|
||||
require_once 'Zend/Search/Lucene/Search/Weight.php';
|
||||
|
||||
|
||||
/**
|
||||
* It's an internal abstract class intended to finalize ase a query processing after query parsing.
|
||||
* This type of query is not actually involved into query execution.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Search_Lucene
|
||||
* @subpackage Search
|
||||
* @internal
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
abstract class Zend_Search_Lucene_Search_Query_Preprocessing extends Zend_Search_Lucene_Search_Query
|
||||
{
|
||||
/**
|
||||
* Matched terms.
|
||||
*
|
||||
* Matched terms list.
|
||||
* It's filled during rewrite operation and may be used for search result highlighting
|
||||
*
|
||||
* Array of Zend_Search_Lucene_Index_Term objects
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $_matches = null;
|
||||
|
||||
/**
|
||||
* Optimize query in the context of specified index
|
||||
*
|
||||
* @param Zend_Search_Lucene_Interface $index
|
||||
* @return Zend_Search_Lucene_Search_Query
|
||||
*/
|
||||
public function optimize(Zend_Search_Lucene_Interface $index)
|
||||
{
|
||||
require_once 'Zend/Search/Lucene/Exception.php';
|
||||
throw new Zend_Search_Lucene_Exception('This query is not intended to be executed.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs an appropriate Weight implementation for this query.
|
||||
*
|
||||
* @param Zend_Search_Lucene_Interface $reader
|
||||
* @return Zend_Search_Lucene_Search_Weight
|
||||
*/
|
||||
public function createWeight(Zend_Search_Lucene_Interface $reader)
|
||||
{
|
||||
require_once 'Zend/Search/Lucene/Exception.php';
|
||||
throw new Zend_Search_Lucene_Exception('This query is not intended to be executed.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute query in context of index reader
|
||||
* It also initializes necessary internal structures
|
||||
*
|
||||
* @param Zend_Search_Lucene_Interface $reader
|
||||
* @param Zend_Search_Lucene_Index_DocsFilter|null $docsFilter
|
||||
*/
|
||||
public function execute(Zend_Search_Lucene_Interface $reader, $docsFilter = null)
|
||||
{
|
||||
require_once 'Zend/Search/Lucene/Exception.php';
|
||||
throw new Zend_Search_Lucene_Exception('This query is not intended to be executed.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get document ids likely matching the query
|
||||
*
|
||||
* It's an array with document ids as keys (performance considerations)
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function matchedDocs()
|
||||
{
|
||||
require_once 'Zend/Search/Lucene/Exception.php';
|
||||
throw new Zend_Search_Lucene_Exception('This query is not intended to be executed.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Score specified document
|
||||
*
|
||||
* @param integer $docId
|
||||
* @param Zend_Search_Lucene_Interface $reader
|
||||
* @return float
|
||||
*/
|
||||
public function score($docId, Zend_Search_Lucene_Interface $reader)
|
||||
{
|
||||
require_once 'Zend/Search/Lucene/Exception.php';
|
||||
throw new Zend_Search_Lucene_Exception('This query is not intended to be executed.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Return query terms
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getQueryTerms()
|
||||
{
|
||||
require_once 'Zend/Search/Lucene/Exception.php';
|
||||
throw new Zend_Search_Lucene_Exception('Rewrite operation has to be done before retrieving query terms.');
|
||||
}
|
||||
}
|
||||
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to license@zend.com so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Search_Lucene
|
||||
* @subpackage Search
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: Preprocessing.php 18954 2009-11-12 20:01:33Z alexander $
|
||||
*/
|
||||
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query */
|
||||
require_once 'Zend/Search/Lucene/Search/Query.php';
|
||||
|
||||
|
||||
/**
|
||||
* It's an internal abstract class intended to finalize ase a query processing after query parsing.
|
||||
* This type of query is not actually involved into query execution.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Search_Lucene
|
||||
* @subpackage Search
|
||||
* @internal
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
abstract class Zend_Search_Lucene_Search_Query_Preprocessing extends Zend_Search_Lucene_Search_Query
|
||||
{
|
||||
/**
|
||||
* Matched terms.
|
||||
*
|
||||
* Matched terms list.
|
||||
* It's filled during rewrite operation and may be used for search result highlighting
|
||||
*
|
||||
* Array of Zend_Search_Lucene_Index_Term objects
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $_matches = null;
|
||||
|
||||
/**
|
||||
* Optimize query in the context of specified index
|
||||
*
|
||||
* @param Zend_Search_Lucene_Interface $index
|
||||
* @return Zend_Search_Lucene_Search_Query
|
||||
*/
|
||||
public function optimize(Zend_Search_Lucene_Interface $index)
|
||||
{
|
||||
require_once 'Zend/Search/Lucene/Exception.php';
|
||||
throw new Zend_Search_Lucene_Exception('This query is not intended to be executed.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs an appropriate Weight implementation for this query.
|
||||
*
|
||||
* @param Zend_Search_Lucene_Interface $reader
|
||||
* @return Zend_Search_Lucene_Search_Weight
|
||||
*/
|
||||
public function createWeight(Zend_Search_Lucene_Interface $reader)
|
||||
{
|
||||
require_once 'Zend/Search/Lucene/Exception.php';
|
||||
throw new Zend_Search_Lucene_Exception('This query is not intended to be executed.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute query in context of index reader
|
||||
* It also initializes necessary internal structures
|
||||
*
|
||||
* @param Zend_Search_Lucene_Interface $reader
|
||||
* @param Zend_Search_Lucene_Index_DocsFilter|null $docsFilter
|
||||
*/
|
||||
public function execute(Zend_Search_Lucene_Interface $reader, $docsFilter = null)
|
||||
{
|
||||
require_once 'Zend/Search/Lucene/Exception.php';
|
||||
throw new Zend_Search_Lucene_Exception('This query is not intended to be executed.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get document ids likely matching the query
|
||||
*
|
||||
* It's an array with document ids as keys (performance considerations)
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function matchedDocs()
|
||||
{
|
||||
require_once 'Zend/Search/Lucene/Exception.php';
|
||||
throw new Zend_Search_Lucene_Exception('This query is not intended to be executed.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Score specified document
|
||||
*
|
||||
* @param integer $docId
|
||||
* @param Zend_Search_Lucene_Interface $reader
|
||||
* @return float
|
||||
*/
|
||||
public function score($docId, Zend_Search_Lucene_Interface $reader)
|
||||
{
|
||||
require_once 'Zend/Search/Lucene/Exception.php';
|
||||
throw new Zend_Search_Lucene_Exception('This query is not intended to be executed.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Return query terms
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getQueryTerms()
|
||||
{
|
||||
require_once 'Zend/Search/Lucene/Exception.php';
|
||||
throw new Zend_Search_Lucene_Exception('Rewrite operation has to be done before retrieving query terms.');
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,287 +1,287 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to license@zend.com so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Search_Lucene
|
||||
* @subpackage Search
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: Fuzzy.php 16971 2009-07-22 18:05:45Z mikaelkael $
|
||||
*/
|
||||
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query_Processing */
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Preprocessing.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query_Phrase */
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Phrase.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query_Insignificant */
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Insignificant.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query_Empty */
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Empty.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query_Term */
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Term.php';
|
||||
|
||||
/** Zend_Search_Lucene_Index_Term */
|
||||
require_once 'Zend/Search/Lucene/Index/Term.php';
|
||||
|
||||
|
||||
/**
|
||||
* It's an internal abstract class intended to finalize ase a query processing after query parsing.
|
||||
* This type of query is not actually involved into query execution.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Search_Lucene
|
||||
* @subpackage Search
|
||||
* @internal
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Search_Lucene_Search_Query_Preprocessing_Fuzzy extends Zend_Search_Lucene_Search_Query_Preprocessing
|
||||
{
|
||||
/**
|
||||
* word (query parser lexeme) to find.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $_word;
|
||||
|
||||
/**
|
||||
* Word encoding (field name is always provided using UTF-8 encoding since it may be retrieved from index).
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $_encoding;
|
||||
|
||||
|
||||
/**
|
||||
* Field name.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $_field;
|
||||
|
||||
/**
|
||||
* A value between 0 and 1 to set the required similarity
|
||||
* between the query term and the matching terms. For example, for a
|
||||
* _minimumSimilarity of 0.5 a term of the same length
|
||||
* as the query term is considered similar to the query term if the edit distance
|
||||
* between both terms is less than length(term)*0.5
|
||||
*
|
||||
* @var float
|
||||
*/
|
||||
private $_minimumSimilarity;
|
||||
|
||||
/**
|
||||
* Class constructor. Create a new preprocessing object for prase query.
|
||||
*
|
||||
* @param string $word Non-tokenized word (query parser lexeme) to search.
|
||||
* @param string $encoding Word encoding.
|
||||
* @param string $fieldName Field name.
|
||||
* @param float $minimumSimilarity minimum similarity
|
||||
*/
|
||||
public function __construct($word, $encoding, $fieldName, $minimumSimilarity)
|
||||
{
|
||||
$this->_word = $word;
|
||||
$this->_encoding = $encoding;
|
||||
$this->_field = $fieldName;
|
||||
$this->_minimumSimilarity = $minimumSimilarity;
|
||||
}
|
||||
|
||||
/**
|
||||
* Re-write query into primitive queries in the context of specified index
|
||||
*
|
||||
* @param Zend_Search_Lucene_Interface $index
|
||||
* @return Zend_Search_Lucene_Search_Query
|
||||
*/
|
||||
public function rewrite(Zend_Search_Lucene_Interface $index)
|
||||
{
|
||||
if ($this->_field === null) {
|
||||
$query = new Zend_Search_Lucene_Search_Query_Boolean();
|
||||
|
||||
$hasInsignificantSubqueries = false;
|
||||
|
||||
if (Zend_Search_Lucene::getDefaultSearchField() === null) {
|
||||
$searchFields = $index->getFieldNames(true);
|
||||
} else {
|
||||
$searchFields = array(Zend_Search_Lucene::getDefaultSearchField());
|
||||
}
|
||||
|
||||
foreach ($searchFields as $fieldName) {
|
||||
$subquery = new Zend_Search_Lucene_Search_Query_Preprocessing_Fuzzy($this->_word,
|
||||
$this->_encoding,
|
||||
$fieldName,
|
||||
$this->_minimumSimilarity);
|
||||
|
||||
$rewrittenSubquery = $subquery->rewrite($index);
|
||||
|
||||
if ( !($rewrittenSubquery instanceof Zend_Search_Lucene_Search_Query_Insignificant ||
|
||||
$rewrittenSubquery instanceof Zend_Search_Lucene_Search_Query_Empty) ) {
|
||||
$query->addSubquery($rewrittenSubquery);
|
||||
}
|
||||
|
||||
if ($rewrittenSubquery instanceof Zend_Search_Lucene_Search_Query_Insignificant) {
|
||||
$hasInsignificantSubqueries = true;
|
||||
}
|
||||
}
|
||||
|
||||
$subqueries = $query->getSubqueries();
|
||||
|
||||
if (count($subqueries) == 0) {
|
||||
$this->_matches = array();
|
||||
if ($hasInsignificantSubqueries) {
|
||||
return new Zend_Search_Lucene_Search_Query_Insignificant();
|
||||
} else {
|
||||
return new Zend_Search_Lucene_Search_Query_Empty();
|
||||
}
|
||||
}
|
||||
|
||||
if (count($subqueries) == 1) {
|
||||
$query = reset($subqueries);
|
||||
}
|
||||
|
||||
$query->setBoost($this->getBoost());
|
||||
|
||||
$this->_matches = $query->getQueryTerms();
|
||||
return $query;
|
||||
}
|
||||
|
||||
// -------------------------------------
|
||||
// Recognize exact term matching (it corresponds to Keyword fields stored in the index)
|
||||
// encoding is not used since we expect binary matching
|
||||
$term = new Zend_Search_Lucene_Index_Term($this->_word, $this->_field);
|
||||
if ($index->hasTerm($term)) {
|
||||
$query = new Zend_Search_Lucene_Search_Query_Fuzzy($term, $this->_minimumSimilarity);
|
||||
$query->setBoost($this->getBoost());
|
||||
|
||||
// Get rewritten query. Important! It also fills terms matching container.
|
||||
$rewrittenQuery = $query->rewrite($index);
|
||||
$this->_matches = $query->getQueryTerms();
|
||||
|
||||
return $rewrittenQuery;
|
||||
}
|
||||
|
||||
|
||||
// -------------------------------------
|
||||
// Recognize wildcard queries
|
||||
|
||||
/** @todo check for PCRE unicode support may be performed through Zend_Environment in some future */
|
||||
if (@preg_match('/\pL/u', 'a') == 1) {
|
||||
$subPatterns = preg_split('/[*?]/u', iconv($this->_encoding, 'UTF-8', $this->_word));
|
||||
} else {
|
||||
$subPatterns = preg_split('/[*?]/', $this->_word);
|
||||
}
|
||||
if (count($subPatterns) > 1) {
|
||||
require_once 'Zend/Search/Lucene/Search/QueryParserException.php';
|
||||
throw new Zend_Search_Lucene_Search_QueryParserException('Fuzzy search doesn\'t support wildcards (except within Keyword fields).');
|
||||
}
|
||||
|
||||
|
||||
// -------------------------------------
|
||||
// Recognize one-term multi-term and "insignificant" queries
|
||||
$tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($this->_word, $this->_encoding);
|
||||
|
||||
if (count($tokens) == 0) {
|
||||
$this->_matches = array();
|
||||
return new Zend_Search_Lucene_Search_Query_Insignificant();
|
||||
}
|
||||
|
||||
if (count($tokens) == 1) {
|
||||
$term = new Zend_Search_Lucene_Index_Term($tokens[0]->getTermText(), $this->_field);
|
||||
$query = new Zend_Search_Lucene_Search_Query_Fuzzy($term, $this->_minimumSimilarity);
|
||||
$query->setBoost($this->getBoost());
|
||||
|
||||
// Get rewritten query. Important! It also fills terms matching container.
|
||||
$rewrittenQuery = $query->rewrite($index);
|
||||
$this->_matches = $query->getQueryTerms();
|
||||
|
||||
return $rewrittenQuery;
|
||||
}
|
||||
|
||||
// Word is tokenized into several tokens
|
||||
require_once 'Zend/Search/Lucene/Search/QueryParserException.php';
|
||||
throw new Zend_Search_Lucene_Search_QueryParserException('Fuzzy search is supported only for non-multiple word terms');
|
||||
}
|
||||
|
||||
/**
|
||||
* Query specific matches highlighting
|
||||
*
|
||||
* @param Zend_Search_Lucene_Search_Highlighter_Interface $highlighter Highlighter object (also contains doc for highlighting)
|
||||
*/
|
||||
protected function _highlightMatches(Zend_Search_Lucene_Search_Highlighter_Interface $highlighter)
|
||||
{
|
||||
/** Skip fields detection. We don't need it, since we expect all fields presented in the HTML body and don't differentiate them */
|
||||
|
||||
/** Skip exact term matching recognition, keyword fields highlighting is not supported */
|
||||
|
||||
// -------------------------------------
|
||||
// Recognize wildcard queries
|
||||
|
||||
/** @todo check for PCRE unicode support may be performed through Zend_Environment in some future */
|
||||
if (@preg_match('/\pL/u', 'a') == 1) {
|
||||
$subPatterns = preg_split('/[*?]/u', iconv($this->_encoding, 'UTF-8', $this->_word));
|
||||
} else {
|
||||
$subPatterns = preg_split('/[*?]/', $this->_word);
|
||||
}
|
||||
if (count($subPatterns) > 1) {
|
||||
// Do nothing
|
||||
return;
|
||||
}
|
||||
|
||||
// -------------------------------------
|
||||
// Recognize one-term multi-term and "insignificant" queries
|
||||
$tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($this->_word, $this->_encoding);
|
||||
if (count($tokens) == 0) {
|
||||
// Do nothing
|
||||
return;
|
||||
}
|
||||
if (count($tokens) == 1) {
|
||||
$term = new Zend_Search_Lucene_Index_Term($tokens[0]->getTermText(), $this->_field);
|
||||
$query = new Zend_Search_Lucene_Search_Query_Fuzzy($term, $this->_minimumSimilarity);
|
||||
|
||||
$query->_highlightMatches($highlighter);
|
||||
return;
|
||||
}
|
||||
|
||||
// Word is tokenized into several tokens
|
||||
// But fuzzy search is supported only for non-multiple word terms
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
/**
|
||||
* Print a query
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
// It's used only for query visualisation, so we don't care about characters escaping
|
||||
if ($this->_field !== null) {
|
||||
$query = $this->_field . ':';
|
||||
} else {
|
||||
$query = '';
|
||||
}
|
||||
|
||||
$query .= $this->_word;
|
||||
|
||||
if ($this->getBoost() != 1) {
|
||||
$query .= '^' . round($this->getBoost(), 4);
|
||||
}
|
||||
|
||||
return $query;
|
||||
}
|
||||
}
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to license@zend.com so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Search_Lucene
|
||||
* @subpackage Search
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: Fuzzy.php 18954 2009-11-12 20:01:33Z alexander $
|
||||
*/
|
||||
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query_Processing */
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Preprocessing.php';
|
||||
|
||||
|
||||
/**
|
||||
* It's an internal abstract class intended to finalize ase a query processing after query parsing.
|
||||
* This type of query is not actually involved into query execution.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Search_Lucene
|
||||
* @subpackage Search
|
||||
* @internal
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Search_Lucene_Search_Query_Preprocessing_Fuzzy extends Zend_Search_Lucene_Search_Query_Preprocessing
|
||||
{
|
||||
/**
|
||||
* word (query parser lexeme) to find.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $_word;
|
||||
|
||||
/**
|
||||
* Word encoding (field name is always provided using UTF-8 encoding since it may be retrieved from index).
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $_encoding;
|
||||
|
||||
|
||||
/**
|
||||
* Field name.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $_field;
|
||||
|
||||
/**
|
||||
* A value between 0 and 1 to set the required similarity
|
||||
* between the query term and the matching terms. For example, for a
|
||||
* _minimumSimilarity of 0.5 a term of the same length
|
||||
* as the query term is considered similar to the query term if the edit distance
|
||||
* between both terms is less than length(term)*0.5
|
||||
*
|
||||
* @var float
|
||||
*/
|
||||
private $_minimumSimilarity;
|
||||
|
||||
/**
|
||||
* Class constructor. Create a new preprocessing object for prase query.
|
||||
*
|
||||
* @param string $word Non-tokenized word (query parser lexeme) to search.
|
||||
* @param string $encoding Word encoding.
|
||||
* @param string $fieldName Field name.
|
||||
* @param float $minimumSimilarity minimum similarity
|
||||
*/
|
||||
public function __construct($word, $encoding, $fieldName, $minimumSimilarity)
|
||||
{
|
||||
$this->_word = $word;
|
||||
$this->_encoding = $encoding;
|
||||
$this->_field = $fieldName;
|
||||
$this->_minimumSimilarity = $minimumSimilarity;
|
||||
}
|
||||
|
||||
/**
|
||||
* Re-write query into primitive queries in the context of specified index
|
||||
*
|
||||
* @param Zend_Search_Lucene_Interface $index
|
||||
* @return Zend_Search_Lucene_Search_Query
|
||||
*/
|
||||
public function rewrite(Zend_Search_Lucene_Interface $index)
|
||||
{
|
||||
if ($this->_field === null) {
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Boolean.php';
|
||||
$query = new Zend_Search_Lucene_Search_Query_Boolean();
|
||||
|
||||
$hasInsignificantSubqueries = false;
|
||||
|
||||
require_once 'Zend/Search/Lucene.php';
|
||||
if (Zend_Search_Lucene::getDefaultSearchField() === null) {
|
||||
$searchFields = $index->getFieldNames(true);
|
||||
} else {
|
||||
$searchFields = array(Zend_Search_Lucene::getDefaultSearchField());
|
||||
}
|
||||
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Preprocessing/Fuzzy.php';
|
||||
foreach ($searchFields as $fieldName) {
|
||||
$subquery = new Zend_Search_Lucene_Search_Query_Preprocessing_Fuzzy($this->_word,
|
||||
$this->_encoding,
|
||||
$fieldName,
|
||||
$this->_minimumSimilarity);
|
||||
|
||||
$rewrittenSubquery = $subquery->rewrite($index);
|
||||
|
||||
if ( !($rewrittenSubquery instanceof Zend_Search_Lucene_Search_Query_Insignificant ||
|
||||
$rewrittenSubquery instanceof Zend_Search_Lucene_Search_Query_Empty) ) {
|
||||
$query->addSubquery($rewrittenSubquery);
|
||||
}
|
||||
|
||||
if ($rewrittenSubquery instanceof Zend_Search_Lucene_Search_Query_Insignificant) {
|
||||
$hasInsignificantSubqueries = true;
|
||||
}
|
||||
}
|
||||
|
||||
$subqueries = $query->getSubqueries();
|
||||
|
||||
if (count($subqueries) == 0) {
|
||||
$this->_matches = array();
|
||||
if ($hasInsignificantSubqueries) {
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Insignificant.php';
|
||||
return new Zend_Search_Lucene_Search_Query_Insignificant();
|
||||
} else {
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Empty.php';
|
||||
return new Zend_Search_Lucene_Search_Query_Empty();
|
||||
}
|
||||
}
|
||||
|
||||
if (count($subqueries) == 1) {
|
||||
$query = reset($subqueries);
|
||||
}
|
||||
|
||||
$query->setBoost($this->getBoost());
|
||||
|
||||
$this->_matches = $query->getQueryTerms();
|
||||
return $query;
|
||||
}
|
||||
|
||||
// -------------------------------------
|
||||
// Recognize exact term matching (it corresponds to Keyword fields stored in the index)
|
||||
// encoding is not used since we expect binary matching
|
||||
require_once 'Zend/Search/Lucene/Index/Term.php';
|
||||
$term = new Zend_Search_Lucene_Index_Term($this->_word, $this->_field);
|
||||
if ($index->hasTerm($term)) {
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Fuzzy.php';
|
||||
$query = new Zend_Search_Lucene_Search_Query_Fuzzy($term, $this->_minimumSimilarity);
|
||||
$query->setBoost($this->getBoost());
|
||||
|
||||
// Get rewritten query. Important! It also fills terms matching container.
|
||||
$rewrittenQuery = $query->rewrite($index);
|
||||
$this->_matches = $query->getQueryTerms();
|
||||
|
||||
return $rewrittenQuery;
|
||||
}
|
||||
|
||||
|
||||
// -------------------------------------
|
||||
// Recognize wildcard queries
|
||||
|
||||
/** @todo check for PCRE unicode support may be performed through Zend_Environment in some future */
|
||||
if (@preg_match('/\pL/u', 'a') == 1) {
|
||||
$subPatterns = preg_split('/[*?]/u', iconv($this->_encoding, 'UTF-8', $this->_word));
|
||||
} else {
|
||||
$subPatterns = preg_split('/[*?]/', $this->_word);
|
||||
}
|
||||
if (count($subPatterns) > 1) {
|
||||
require_once 'Zend/Search/Lucene/Search/QueryParserException.php';
|
||||
throw new Zend_Search_Lucene_Search_QueryParserException('Fuzzy search doesn\'t support wildcards (except within Keyword fields).');
|
||||
}
|
||||
|
||||
|
||||
// -------------------------------------
|
||||
// Recognize one-term multi-term and "insignificant" queries
|
||||
require_once 'Zend/Search/Lucene/Analysis/Analyzer.php';
|
||||
$tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($this->_word, $this->_encoding);
|
||||
|
||||
if (count($tokens) == 0) {
|
||||
$this->_matches = array();
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Insignificant.php';
|
||||
return new Zend_Search_Lucene_Search_Query_Insignificant();
|
||||
}
|
||||
|
||||
if (count($tokens) == 1) {
|
||||
require_once 'Zend/Search/Lucene/Index/Term.php';
|
||||
$term = new Zend_Search_Lucene_Index_Term($tokens[0]->getTermText(), $this->_field);
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Fuzzy.php';
|
||||
$query = new Zend_Search_Lucene_Search_Query_Fuzzy($term, $this->_minimumSimilarity);
|
||||
$query->setBoost($this->getBoost());
|
||||
|
||||
// Get rewritten query. Important! It also fills terms matching container.
|
||||
$rewrittenQuery = $query->rewrite($index);
|
||||
$this->_matches = $query->getQueryTerms();
|
||||
|
||||
return $rewrittenQuery;
|
||||
}
|
||||
|
||||
// Word is tokenized into several tokens
|
||||
require_once 'Zend/Search/Lucene/Search/QueryParserException.php';
|
||||
throw new Zend_Search_Lucene_Search_QueryParserException('Fuzzy search is supported only for non-multiple word terms');
|
||||
}
|
||||
|
||||
/**
|
||||
* Query specific matches highlighting
|
||||
*
|
||||
* @param Zend_Search_Lucene_Search_Highlighter_Interface $highlighter Highlighter object (also contains doc for highlighting)
|
||||
*/
|
||||
protected function _highlightMatches(Zend_Search_Lucene_Search_Highlighter_Interface $highlighter)
|
||||
{
|
||||
/** Skip fields detection. We don't need it, since we expect all fields presented in the HTML body and don't differentiate them */
|
||||
|
||||
/** Skip exact term matching recognition, keyword fields highlighting is not supported */
|
||||
|
||||
// -------------------------------------
|
||||
// Recognize wildcard queries
|
||||
|
||||
/** @todo check for PCRE unicode support may be performed through Zend_Environment in some future */
|
||||
if (@preg_match('/\pL/u', 'a') == 1) {
|
||||
$subPatterns = preg_split('/[*?]/u', iconv($this->_encoding, 'UTF-8', $this->_word));
|
||||
} else {
|
||||
$subPatterns = preg_split('/[*?]/', $this->_word);
|
||||
}
|
||||
if (count($subPatterns) > 1) {
|
||||
// Do nothing
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// -------------------------------------
|
||||
// Recognize one-term multi-term and "insignificant" queries
|
||||
require_once 'Zend/Search/Lucene/Analysis/Analyzer.php';
|
||||
$tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($this->_word, $this->_encoding);
|
||||
if (count($tokens) == 0) {
|
||||
// Do nothing
|
||||
return;
|
||||
}
|
||||
if (count($tokens) == 1) {
|
||||
require_once 'Zend/Search/Lucene/Index/Term.php';
|
||||
$term = new Zend_Search_Lucene_Index_Term($tokens[0]->getTermText(), $this->_field);
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Fuzzy.php';
|
||||
$query = new Zend_Search_Lucene_Search_Query_Fuzzy($term, $this->_minimumSimilarity);
|
||||
|
||||
$query->_highlightMatches($highlighter);
|
||||
return;
|
||||
}
|
||||
|
||||
// Word is tokenized into several tokens
|
||||
// But fuzzy search is supported only for non-multiple word terms
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
/**
|
||||
* Print a query
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
// It's used only for query visualisation, so we don't care about characters escaping
|
||||
if ($this->_field !== null) {
|
||||
$query = $this->_field . ':';
|
||||
} else {
|
||||
$query = '';
|
||||
}
|
||||
|
||||
$query .= $this->_word;
|
||||
|
||||
if ($this->getBoost() != 1) {
|
||||
$query .= '^' . round($this->getBoost(), 4);
|
||||
}
|
||||
|
||||
return $query;
|
||||
}
|
||||
}
|
||||
|
@ -1,274 +1,270 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to license@zend.com so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Search_Lucene
|
||||
* @subpackage Search
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: Phrase.php 16971 2009-07-22 18:05:45Z mikaelkael $
|
||||
*/
|
||||
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query_Processing */
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Preprocessing.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query_Phrase */
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Phrase.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query_Insignificant */
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Insignificant.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query_Empty */
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Empty.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query_Term */
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Term.php';
|
||||
|
||||
/** Zend_Search_Lucene_Index_Term */
|
||||
require_once 'Zend/Search/Lucene/Index/Term.php';
|
||||
|
||||
|
||||
/**
|
||||
* It's an internal abstract class intended to finalize ase a query processing after query parsing.
|
||||
* This type of query is not actually involved into query execution.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Search_Lucene
|
||||
* @subpackage Search
|
||||
* @internal
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Search_Lucene_Search_Query_Preprocessing_Phrase extends Zend_Search_Lucene_Search_Query_Preprocessing
|
||||
{
|
||||
/**
|
||||
* Phrase to find.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $_phrase;
|
||||
|
||||
/**
|
||||
* Phrase encoding (field name is always provided using UTF-8 encoding since it may be retrieved from index).
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $_phraseEncoding;
|
||||
|
||||
|
||||
/**
|
||||
* Field name.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $_field;
|
||||
|
||||
/**
|
||||
* Sets the number of other words permitted between words in query phrase.
|
||||
* If zero, then this is an exact phrase search. For larger values this works
|
||||
* like a WITHIN or NEAR operator.
|
||||
*
|
||||
* The slop is in fact an edit-distance, where the units correspond to
|
||||
* moves of terms in the query phrase out of position. For example, to switch
|
||||
* the order of two words requires two moves (the first move places the words
|
||||
* atop one another), so to permit re-orderings of phrases, the slop must be
|
||||
* at least two.
|
||||
* More exact matches are scored higher than sloppier matches, thus search
|
||||
* results are sorted by exactness.
|
||||
*
|
||||
* The slop is zero by default, requiring exact matches.
|
||||
*
|
||||
* @var integer
|
||||
*/
|
||||
private $_slop;
|
||||
|
||||
/**
|
||||
* Class constructor. Create a new preprocessing object for prase query.
|
||||
*
|
||||
* @param string $phrase Phrase to search.
|
||||
* @param string $phraseEncoding Phrase encoding.
|
||||
* @param string $fieldName Field name.
|
||||
*/
|
||||
public function __construct($phrase, $phraseEncoding, $fieldName)
|
||||
{
|
||||
$this->_phrase = $phrase;
|
||||
$this->_phraseEncoding = $phraseEncoding;
|
||||
$this->_field = $fieldName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set slop
|
||||
*
|
||||
* @param integer $slop
|
||||
*/
|
||||
public function setSlop($slop)
|
||||
{
|
||||
$this->_slop = $slop;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get slop
|
||||
*
|
||||
* @return integer
|
||||
*/
|
||||
public function getSlop()
|
||||
{
|
||||
return $this->_slop;
|
||||
}
|
||||
|
||||
/**
|
||||
* Re-write query into primitive queries in the context of specified index
|
||||
*
|
||||
* @param Zend_Search_Lucene_Interface $index
|
||||
* @return Zend_Search_Lucene_Search_Query
|
||||
*/
|
||||
public function rewrite(Zend_Search_Lucene_Interface $index)
|
||||
{
|
||||
// Allow to use wildcards within phrases
|
||||
// They are either removed by text analyzer or used as a part of keyword for keyword fields
|
||||
//
|
||||
// if (strpos($this->_phrase, '?') !== false || strpos($this->_phrase, '*') !== false) {
|
||||
// require_once 'Zend/Search/Lucene/Search/QueryParserException.php';
|
||||
// throw new Zend_Search_Lucene_Search_QueryParserException('Wildcards are only allowed in a single terms.');
|
||||
// }
|
||||
|
||||
// Split query into subqueries if field name is not specified
|
||||
if ($this->_field === null) {
|
||||
$query = new Zend_Search_Lucene_Search_Query_Boolean();
|
||||
$query->setBoost($this->getBoost());
|
||||
|
||||
if (Zend_Search_Lucene::getDefaultSearchField() === null) {
|
||||
$searchFields = $index->getFieldNames(true);
|
||||
} else {
|
||||
$searchFields = array(Zend_Search_Lucene::getDefaultSearchField());
|
||||
}
|
||||
|
||||
foreach ($searchFields as $fieldName) {
|
||||
$subquery = new Zend_Search_Lucene_Search_Query_Preprocessing_Phrase($this->_phrase,
|
||||
$this->_phraseEncoding,
|
||||
$fieldName);
|
||||
$subquery->setSlop($this->getSlop());
|
||||
|
||||
$query->addSubquery($subquery->rewrite($index));
|
||||
}
|
||||
|
||||
$this->_matches = $query->getQueryTerms();
|
||||
return $query;
|
||||
}
|
||||
|
||||
// Recognize exact term matching (it corresponds to Keyword fields stored in the index)
|
||||
// encoding is not used since we expect binary matching
|
||||
$term = new Zend_Search_Lucene_Index_Term($this->_phrase, $this->_field);
|
||||
if ($index->hasTerm($term)) {
|
||||
$query = new Zend_Search_Lucene_Search_Query_Term($term);
|
||||
$query->setBoost($this->getBoost());
|
||||
|
||||
$this->_matches = $query->getQueryTerms();
|
||||
return $query;
|
||||
}
|
||||
|
||||
|
||||
// tokenize phrase using current analyzer and process it as a phrase query
|
||||
$tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($this->_phrase, $this->_phraseEncoding);
|
||||
|
||||
if (count($tokens) == 0) {
|
||||
$this->_matches = array();
|
||||
return new Zend_Search_Lucene_Search_Query_Insignificant();
|
||||
}
|
||||
|
||||
if (count($tokens) == 1) {
|
||||
$term = new Zend_Search_Lucene_Index_Term($tokens[0]->getTermText(), $this->_field);
|
||||
$query = new Zend_Search_Lucene_Search_Query_Term($term);
|
||||
$query->setBoost($this->getBoost());
|
||||
|
||||
$this->_matches = $query->getQueryTerms();
|
||||
return $query;
|
||||
}
|
||||
|
||||
//It's non-trivial phrase query
|
||||
$position = -1;
|
||||
$query = new Zend_Search_Lucene_Search_Query_Phrase();
|
||||
foreach ($tokens as $token) {
|
||||
$position += $token->getPositionIncrement();
|
||||
$term = new Zend_Search_Lucene_Index_Term($token->getTermText(), $this->_field);
|
||||
$query->addTerm($term, $position);
|
||||
$query->setSlop($this->getSlop());
|
||||
}
|
||||
$this->_matches = $query->getQueryTerms();
|
||||
return $query;
|
||||
}
|
||||
|
||||
/**
|
||||
* Query specific matches highlighting
|
||||
*
|
||||
* @param Zend_Search_Lucene_Search_Highlighter_Interface $highlighter Highlighter object (also contains doc for highlighting)
|
||||
*/
|
||||
protected function _highlightMatches(Zend_Search_Lucene_Search_Highlighter_Interface $highlighter)
|
||||
{
|
||||
/** Skip fields detection. We don't need it, since we expect all fields presented in the HTML body and don't differentiate them */
|
||||
|
||||
/** Skip exact term matching recognition, keyword fields highlighting is not supported */
|
||||
|
||||
/** Skip wildcard queries recognition. Supported wildcards are removed by text analyzer */
|
||||
|
||||
// tokenize phrase using current analyzer and process it as a phrase query
|
||||
$tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($this->_phrase, $this->_phraseEncoding);
|
||||
|
||||
if (count($tokens) == 0) {
|
||||
// Do nothing
|
||||
return;
|
||||
}
|
||||
|
||||
if (count($tokens) == 1) {
|
||||
$highlighter->highlight($tokens[0]->getTermText());
|
||||
return;
|
||||
}
|
||||
|
||||
//It's non-trivial phrase query
|
||||
$words = array();
|
||||
foreach ($tokens as $token) {
|
||||
$words[] = $token->getTermText();
|
||||
}
|
||||
$highlighter->highlight($words);
|
||||
}
|
||||
|
||||
/**
|
||||
* Print a query
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
// It's used only for query visualisation, so we don't care about characters escaping
|
||||
if ($this->_field !== null) {
|
||||
$query = $this->_field . ':';
|
||||
} else {
|
||||
$query = '';
|
||||
}
|
||||
|
||||
$query .= '"' . $this->_phrase . '"';
|
||||
|
||||
if ($this->_slop != 0) {
|
||||
$query .= '~' . $this->_slop;
|
||||
}
|
||||
|
||||
if ($this->getBoost() != 1) {
|
||||
$query .= '^' . round($this->getBoost(), 4);
|
||||
}
|
||||
|
||||
return $query;
|
||||
}
|
||||
}
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to license@zend.com so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Search_Lucene
|
||||
* @subpackage Search
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: Phrase.php 18954 2009-11-12 20:01:33Z alexander $
|
||||
*/
|
||||
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query_Processing */
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Preprocessing.php';
|
||||
|
||||
/**
|
||||
* It's an internal abstract class intended to finalize ase a query processing after query parsing.
|
||||
* This type of query is not actually involved into query execution.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Search_Lucene
|
||||
* @subpackage Search
|
||||
* @internal
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Search_Lucene_Search_Query_Preprocessing_Phrase extends Zend_Search_Lucene_Search_Query_Preprocessing
|
||||
{
|
||||
/**
|
||||
* Phrase to find.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $_phrase;
|
||||
|
||||
/**
|
||||
* Phrase encoding (field name is always provided using UTF-8 encoding since it may be retrieved from index).
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $_phraseEncoding;
|
||||
|
||||
|
||||
/**
|
||||
* Field name.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $_field;
|
||||
|
||||
/**
|
||||
* Sets the number of other words permitted between words in query phrase.
|
||||
* If zero, then this is an exact phrase search. For larger values this works
|
||||
* like a WITHIN or NEAR operator.
|
||||
*
|
||||
* The slop is in fact an edit-distance, where the units correspond to
|
||||
* moves of terms in the query phrase out of position. For example, to switch
|
||||
* the order of two words requires two moves (the first move places the words
|
||||
* atop one another), so to permit re-orderings of phrases, the slop must be
|
||||
* at least two.
|
||||
* More exact matches are scored higher than sloppier matches, thus search
|
||||
* results are sorted by exactness.
|
||||
*
|
||||
* The slop is zero by default, requiring exact matches.
|
||||
*
|
||||
* @var integer
|
||||
*/
|
||||
private $_slop;
|
||||
|
||||
/**
|
||||
* Class constructor. Create a new preprocessing object for prase query.
|
||||
*
|
||||
* @param string $phrase Phrase to search.
|
||||
* @param string $phraseEncoding Phrase encoding.
|
||||
* @param string $fieldName Field name.
|
||||
*/
|
||||
public function __construct($phrase, $phraseEncoding, $fieldName)
|
||||
{
|
||||
$this->_phrase = $phrase;
|
||||
$this->_phraseEncoding = $phraseEncoding;
|
||||
$this->_field = $fieldName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set slop
|
||||
*
|
||||
* @param integer $slop
|
||||
*/
|
||||
public function setSlop($slop)
|
||||
{
|
||||
$this->_slop = $slop;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get slop
|
||||
*
|
||||
* @return integer
|
||||
*/
|
||||
public function getSlop()
|
||||
{
|
||||
return $this->_slop;
|
||||
}
|
||||
|
||||
/**
|
||||
* Re-write query into primitive queries in the context of specified index
|
||||
*
|
||||
* @param Zend_Search_Lucene_Interface $index
|
||||
* @return Zend_Search_Lucene_Search_Query
|
||||
*/
|
||||
public function rewrite(Zend_Search_Lucene_Interface $index)
|
||||
{
|
||||
// Allow to use wildcards within phrases
|
||||
// They are either removed by text analyzer or used as a part of keyword for keyword fields
|
||||
//
|
||||
// if (strpos($this->_phrase, '?') !== false || strpos($this->_phrase, '*') !== false) {
|
||||
// require_once 'Zend/Search/Lucene/Search/QueryParserException.php';
|
||||
// throw new Zend_Search_Lucene_Search_QueryParserException('Wildcards are only allowed in a single terms.');
|
||||
// }
|
||||
|
||||
// Split query into subqueries if field name is not specified
|
||||
if ($this->_field === null) {
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Boolean.php';
|
||||
$query = new Zend_Search_Lucene_Search_Query_Boolean();
|
||||
$query->setBoost($this->getBoost());
|
||||
|
||||
require_once 'Zend/Search/Lucene.php';
|
||||
if (Zend_Search_Lucene::getDefaultSearchField() === null) {
|
||||
$searchFields = $index->getFieldNames(true);
|
||||
} else {
|
||||
$searchFields = array(Zend_Search_Lucene::getDefaultSearchField());
|
||||
}
|
||||
|
||||
foreach ($searchFields as $fieldName) {
|
||||
$subquery = new Zend_Search_Lucene_Search_Query_Preprocessing_Phrase($this->_phrase,
|
||||
$this->_phraseEncoding,
|
||||
$fieldName);
|
||||
$subquery->setSlop($this->getSlop());
|
||||
|
||||
$query->addSubquery($subquery->rewrite($index));
|
||||
}
|
||||
|
||||
$this->_matches = $query->getQueryTerms();
|
||||
return $query;
|
||||
}
|
||||
|
||||
// Recognize exact term matching (it corresponds to Keyword fields stored in the index)
|
||||
// encoding is not used since we expect binary matching
|
||||
require_once 'Zend/Search/Lucene/Index/Term.php';
|
||||
$term = new Zend_Search_Lucene_Index_Term($this->_phrase, $this->_field);
|
||||
if ($index->hasTerm($term)) {
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Term.php';
|
||||
$query = new Zend_Search_Lucene_Search_Query_Term($term);
|
||||
$query->setBoost($this->getBoost());
|
||||
|
||||
$this->_matches = $query->getQueryTerms();
|
||||
return $query;
|
||||
}
|
||||
|
||||
|
||||
// tokenize phrase using current analyzer and process it as a phrase query
|
||||
require_once 'Zend/Search/Lucene/Analysis/Analyzer.php';
|
||||
$tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($this->_phrase, $this->_phraseEncoding);
|
||||
|
||||
if (count($tokens) == 0) {
|
||||
$this->_matches = array();
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Insignificant.php';
|
||||
return new Zend_Search_Lucene_Search_Query_Insignificant();
|
||||
}
|
||||
|
||||
if (count($tokens) == 1) {
|
||||
require_once 'Zend/Search/Lucene/Index/Term.php';
|
||||
$term = new Zend_Search_Lucene_Index_Term($tokens[0]->getTermText(), $this->_field);
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Term.php';
|
||||
$query = new Zend_Search_Lucene_Search_Query_Term($term);
|
||||
$query->setBoost($this->getBoost());
|
||||
|
||||
$this->_matches = $query->getQueryTerms();
|
||||
return $query;
|
||||
}
|
||||
|
||||
//It's non-trivial phrase query
|
||||
$position = -1;
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Phrase.php';
|
||||
$query = new Zend_Search_Lucene_Search_Query_Phrase();
|
||||
require_once 'Zend/Search/Lucene/Index/Term.php';
|
||||
foreach ($tokens as $token) {
|
||||
$position += $token->getPositionIncrement();
|
||||
$term = new Zend_Search_Lucene_Index_Term($token->getTermText(), $this->_field);
|
||||
$query->addTerm($term, $position);
|
||||
$query->setSlop($this->getSlop());
|
||||
}
|
||||
$this->_matches = $query->getQueryTerms();
|
||||
return $query;
|
||||
}
|
||||
|
||||
/**
|
||||
* Query specific matches highlighting
|
||||
*
|
||||
* @param Zend_Search_Lucene_Search_Highlighter_Interface $highlighter Highlighter object (also contains doc for highlighting)
|
||||
*/
|
||||
protected function _highlightMatches(Zend_Search_Lucene_Search_Highlighter_Interface $highlighter)
|
||||
{
|
||||
/** Skip fields detection. We don't need it, since we expect all fields presented in the HTML body and don't differentiate them */
|
||||
|
||||
/** Skip exact term matching recognition, keyword fields highlighting is not supported */
|
||||
|
||||
/** Skip wildcard queries recognition. Supported wildcards are removed by text analyzer */
|
||||
|
||||
|
||||
// tokenize phrase using current analyzer and process it as a phrase query
|
||||
require_once 'Zend/Search/Lucene/Analysis/Analyzer.php';
|
||||
$tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($this->_phrase, $this->_phraseEncoding);
|
||||
|
||||
if (count($tokens) == 0) {
|
||||
// Do nothing
|
||||
return;
|
||||
}
|
||||
|
||||
if (count($tokens) == 1) {
|
||||
$highlighter->highlight($tokens[0]->getTermText());
|
||||
return;
|
||||
}
|
||||
|
||||
//It's non-trivial phrase query
|
||||
$words = array();
|
||||
foreach ($tokens as $token) {
|
||||
$words[] = $token->getTermText();
|
||||
}
|
||||
$highlighter->highlight($words);
|
||||
}
|
||||
|
||||
/**
|
||||
* Print a query
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
// It's used only for query visualisation, so we don't care about characters escaping
|
||||
if ($this->_field !== null) {
|
||||
$query = $this->_field . ':';
|
||||
} else {
|
||||
$query = '';
|
||||
}
|
||||
|
||||
$query .= '"' . $this->_phrase . '"';
|
||||
|
||||
if ($this->_slop != 0) {
|
||||
$query .= '~' . $this->_slop;
|
||||
}
|
||||
|
||||
if ($this->getBoost() != 1) {
|
||||
$query .= '^' . round($this->getBoost(), 4);
|
||||
}
|
||||
|
||||
return $query;
|
||||
}
|
||||
}
|
||||
|
@ -1,335 +1,341 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to license@zend.com so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Search_Lucene
|
||||
* @subpackage Search
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: Term.php 16971 2009-07-22 18:05:45Z mikaelkael $
|
||||
*/
|
||||
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query_Processing */
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Preprocessing.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query_Phrase */
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Phrase.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query_Insignificant */
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Insignificant.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query_Empty */
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Empty.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query_Term */
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Term.php';
|
||||
|
||||
/** Zend_Search_Lucene_Index_Term */
|
||||
require_once 'Zend/Search/Lucene/Index/Term.php';
|
||||
|
||||
|
||||
/**
|
||||
* It's an internal abstract class intended to finalize ase a query processing after query parsing.
|
||||
* This type of query is not actually involved into query execution.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Search_Lucene
|
||||
* @subpackage Search
|
||||
* @internal
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Search_Lucene_Search_Query_Preprocessing_Term extends Zend_Search_Lucene_Search_Query_Preprocessing
|
||||
{
|
||||
/**
|
||||
* word (query parser lexeme) to find.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $_word;
|
||||
|
||||
/**
|
||||
* Word encoding (field name is always provided using UTF-8 encoding since it may be retrieved from index).
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $_encoding;
|
||||
|
||||
|
||||
/**
|
||||
* Field name.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $_field;
|
||||
|
||||
/**
|
||||
* Class constructor. Create a new preprocessing object for prase query.
|
||||
*
|
||||
* @param string $word Non-tokenized word (query parser lexeme) to search.
|
||||
* @param string $encoding Word encoding.
|
||||
* @param string $fieldName Field name.
|
||||
*/
|
||||
public function __construct($word, $encoding, $fieldName)
|
||||
{
|
||||
$this->_word = $word;
|
||||
$this->_encoding = $encoding;
|
||||
$this->_field = $fieldName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Re-write query into primitive queries in the context of specified index
|
||||
*
|
||||
* @param Zend_Search_Lucene_Interface $index
|
||||
* @return Zend_Search_Lucene_Search_Query
|
||||
*/
|
||||
public function rewrite(Zend_Search_Lucene_Interface $index)
|
||||
{
|
||||
if ($this->_field === null) {
|
||||
$query = new Zend_Search_Lucene_Search_Query_MultiTerm();
|
||||
$query->setBoost($this->getBoost());
|
||||
|
||||
$hasInsignificantSubqueries = false;
|
||||
|
||||
if (Zend_Search_Lucene::getDefaultSearchField() === null) {
|
||||
$searchFields = $index->getFieldNames(true);
|
||||
} else {
|
||||
$searchFields = array(Zend_Search_Lucene::getDefaultSearchField());
|
||||
}
|
||||
|
||||
foreach ($searchFields as $fieldName) {
|
||||
$subquery = new Zend_Search_Lucene_Search_Query_Preprocessing_Term($this->_word,
|
||||
$this->_encoding,
|
||||
$fieldName);
|
||||
$rewrittenSubquery = $subquery->rewrite($index);
|
||||
foreach ($rewrittenSubquery->getQueryTerms() as $term) {
|
||||
$query->addTerm($term);
|
||||
}
|
||||
|
||||
if ($rewrittenSubquery instanceof Zend_Search_Lucene_Search_Query_Insignificant) {
|
||||
$hasInsignificantSubqueries = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (count($query->getTerms()) == 0) {
|
||||
$this->_matches = array();
|
||||
if ($hasInsignificantSubqueries) {
|
||||
return new Zend_Search_Lucene_Search_Query_Insignificant();
|
||||
} else {
|
||||
return new Zend_Search_Lucene_Search_Query_Empty();
|
||||
}
|
||||
}
|
||||
|
||||
$this->_matches = $query->getQueryTerms();
|
||||
return $query;
|
||||
}
|
||||
|
||||
// -------------------------------------
|
||||
// Recognize exact term matching (it corresponds to Keyword fields stored in the index)
|
||||
// encoding is not used since we expect binary matching
|
||||
$term = new Zend_Search_Lucene_Index_Term($this->_word, $this->_field);
|
||||
if ($index->hasTerm($term)) {
|
||||
$query = new Zend_Search_Lucene_Search_Query_Term($term);
|
||||
$query->setBoost($this->getBoost());
|
||||
|
||||
$this->_matches = $query->getQueryTerms();
|
||||
return $query;
|
||||
}
|
||||
|
||||
|
||||
// -------------------------------------
|
||||
// Recognize wildcard queries
|
||||
|
||||
/** @todo check for PCRE unicode support may be performed through Zend_Environment in some future */
|
||||
if (@preg_match('/\pL/u', 'a') == 1) {
|
||||
$word = iconv($this->_encoding, 'UTF-8', $this->_word);
|
||||
$wildcardsPattern = '/[*?]/u';
|
||||
$subPatternsEncoding = 'UTF-8';
|
||||
} else {
|
||||
$word = $this->_word;
|
||||
$wildcardsPattern = '/[*?]/';
|
||||
$subPatternsEncoding = $this->_encoding;
|
||||
}
|
||||
|
||||
$subPatterns = preg_split($wildcardsPattern, $word, -1, PREG_SPLIT_OFFSET_CAPTURE);
|
||||
|
||||
if (count($subPatterns) > 1) {
|
||||
// Wildcard query is recognized
|
||||
|
||||
$pattern = '';
|
||||
|
||||
foreach ($subPatterns as $id => $subPattern) {
|
||||
// Append corresponding wildcard character to the pattern before each sub-pattern (except first)
|
||||
if ($id != 0) {
|
||||
$pattern .= $word[ $subPattern[1] - 1 ];
|
||||
}
|
||||
|
||||
// Check if each subputtern is a single word in terms of current analyzer
|
||||
$tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($subPattern[0], $subPatternsEncoding);
|
||||
if (count($tokens) > 1) {
|
||||
require_once 'Zend/Search/Lucene/Search/QueryParserException.php';
|
||||
throw new Zend_Search_Lucene_Search_QueryParserException('Wildcard search is supported only for non-multiple word terms');
|
||||
}
|
||||
foreach ($tokens as $token) {
|
||||
$pattern .= $token->getTermText();
|
||||
}
|
||||
}
|
||||
|
||||
$term = new Zend_Search_Lucene_Index_Term($pattern, $this->_field);
|
||||
$query = new Zend_Search_Lucene_Search_Query_Wildcard($term);
|
||||
$query->setBoost($this->getBoost());
|
||||
|
||||
// Get rewritten query. Important! It also fills terms matching container.
|
||||
$rewrittenQuery = $query->rewrite($index);
|
||||
$this->_matches = $query->getQueryTerms();
|
||||
|
||||
return $rewrittenQuery;
|
||||
}
|
||||
|
||||
|
||||
// -------------------------------------
|
||||
// Recognize one-term multi-term and "insignificant" queries
|
||||
$tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($this->_word, $this->_encoding);
|
||||
|
||||
if (count($tokens) == 0) {
|
||||
$this->_matches = array();
|
||||
return new Zend_Search_Lucene_Search_Query_Insignificant();
|
||||
}
|
||||
|
||||
if (count($tokens) == 1) {
|
||||
$term = new Zend_Search_Lucene_Index_Term($tokens[0]->getTermText(), $this->_field);
|
||||
$query = new Zend_Search_Lucene_Search_Query_Term($term);
|
||||
$query->setBoost($this->getBoost());
|
||||
|
||||
$this->_matches = $query->getQueryTerms();
|
||||
return $query;
|
||||
}
|
||||
|
||||
//It's not insignificant or one term query
|
||||
$query = new Zend_Search_Lucene_Search_Query_MultiTerm();
|
||||
|
||||
/**
|
||||
* @todo Process $token->getPositionIncrement() to support stemming, synonyms and other
|
||||
* analizer design features
|
||||
*/
|
||||
foreach ($tokens as $token) {
|
||||
$term = new Zend_Search_Lucene_Index_Term($token->getTermText(), $this->_field);
|
||||
$query->addTerm($term, true); // all subterms are required
|
||||
}
|
||||
|
||||
$query->setBoost($this->getBoost());
|
||||
|
||||
$this->_matches = $query->getQueryTerms();
|
||||
return $query;
|
||||
}
|
||||
|
||||
/**
|
||||
* Query specific matches highlighting
|
||||
*
|
||||
* @param Zend_Search_Lucene_Search_Highlighter_Interface $highlighter Highlighter object (also contains doc for highlighting)
|
||||
*/
|
||||
protected function _highlightMatches(Zend_Search_Lucene_Search_Highlighter_Interface $highlighter)
|
||||
{
|
||||
/** Skip fields detection. We don't need it, since we expect all fields presented in the HTML body and don't differentiate them */
|
||||
|
||||
/** Skip exact term matching recognition, keyword fields highlighting is not supported */
|
||||
|
||||
// -------------------------------------
|
||||
// Recognize wildcard queries
|
||||
/** @todo check for PCRE unicode support may be performed through Zend_Environment in some future */
|
||||
if (@preg_match('/\pL/u', 'a') == 1) {
|
||||
$word = iconv($this->_encoding, 'UTF-8', $this->_word);
|
||||
$wildcardsPattern = '/[*?]/u';
|
||||
$subPatternsEncoding = 'UTF-8';
|
||||
} else {
|
||||
$word = $this->_word;
|
||||
$wildcardsPattern = '/[*?]/';
|
||||
$subPatternsEncoding = $this->_encoding;
|
||||
}
|
||||
$subPatterns = preg_split($wildcardsPattern, $word, -1, PREG_SPLIT_OFFSET_CAPTURE);
|
||||
if (count($subPatterns) > 1) {
|
||||
// Wildcard query is recognized
|
||||
|
||||
$pattern = '';
|
||||
|
||||
foreach ($subPatterns as $id => $subPattern) {
|
||||
// Append corresponding wildcard character to the pattern before each sub-pattern (except first)
|
||||
if ($id != 0) {
|
||||
$pattern .= $word[ $subPattern[1] - 1 ];
|
||||
}
|
||||
|
||||
// Check if each subputtern is a single word in terms of current analyzer
|
||||
$tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($subPattern[0], $subPatternsEncoding);
|
||||
if (count($tokens) > 1) {
|
||||
// Do nothing (nothing is highlighted)
|
||||
return;
|
||||
}
|
||||
foreach ($tokens as $token) {
|
||||
$pattern .= $token->getTermText();
|
||||
}
|
||||
}
|
||||
|
||||
$term = new Zend_Search_Lucene_Index_Term($pattern, $this->_field);
|
||||
$query = new Zend_Search_Lucene_Search_Query_Wildcard($term);
|
||||
|
||||
$query->_highlightMatches($highlighter);
|
||||
return;
|
||||
}
|
||||
|
||||
// -------------------------------------
|
||||
// Recognize one-term multi-term and "insignificant" queries
|
||||
$tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($this->_word, $this->_encoding);
|
||||
|
||||
if (count($tokens) == 0) {
|
||||
// Do nothing
|
||||
return;
|
||||
}
|
||||
|
||||
if (count($tokens) == 1) {
|
||||
$highlighter->highlight($tokens[0]->getTermText());
|
||||
return;
|
||||
}
|
||||
|
||||
//It's not insignificant or one term query
|
||||
$words = array();
|
||||
foreach ($tokens as $token) {
|
||||
$words[] = $token->getTermText();
|
||||
}
|
||||
$highlighter->highlight($words);
|
||||
}
|
||||
|
||||
/**
|
||||
* Print a query
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
// It's used only for query visualisation, so we don't care about characters escaping
|
||||
if ($this->_field !== null) {
|
||||
$query = $this->_field . ':';
|
||||
} else {
|
||||
$query = '';
|
||||
}
|
||||
|
||||
$query .= $this->_word;
|
||||
|
||||
if ($this->getBoost() != 1) {
|
||||
$query .= '^' . round($this->getBoost(), 4);
|
||||
}
|
||||
|
||||
return $query;
|
||||
}
|
||||
}
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to license@zend.com so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Search_Lucene
|
||||
* @subpackage Search
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: Term.php 18954 2009-11-12 20:01:33Z alexander $
|
||||
*/
|
||||
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query_Processing */
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Preprocessing.php';
|
||||
|
||||
|
||||
/**
|
||||
* It's an internal abstract class intended to finalize ase a query processing after query parsing.
|
||||
* This type of query is not actually involved into query execution.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Search_Lucene
|
||||
* @subpackage Search
|
||||
* @internal
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Search_Lucene_Search_Query_Preprocessing_Term extends Zend_Search_Lucene_Search_Query_Preprocessing
|
||||
{
|
||||
/**
|
||||
* word (query parser lexeme) to find.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $_word;
|
||||
|
||||
/**
|
||||
* Word encoding (field name is always provided using UTF-8 encoding since it may be retrieved from index).
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $_encoding;
|
||||
|
||||
|
||||
/**
|
||||
* Field name.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $_field;
|
||||
|
||||
/**
|
||||
* Class constructor. Create a new preprocessing object for prase query.
|
||||
*
|
||||
* @param string $word Non-tokenized word (query parser lexeme) to search.
|
||||
* @param string $encoding Word encoding.
|
||||
* @param string $fieldName Field name.
|
||||
*/
|
||||
public function __construct($word, $encoding, $fieldName)
|
||||
{
|
||||
$this->_word = $word;
|
||||
$this->_encoding = $encoding;
|
||||
$this->_field = $fieldName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Re-write query into primitive queries in the context of specified index
|
||||
*
|
||||
* @param Zend_Search_Lucene_Interface $index
|
||||
* @return Zend_Search_Lucene_Search_Query
|
||||
*/
|
||||
public function rewrite(Zend_Search_Lucene_Interface $index)
|
||||
{
|
||||
if ($this->_field === null) {
|
||||
require_once 'Zend/Search/Lucene/Search/Query/MultiTerm.php';
|
||||
$query = new Zend_Search_Lucene_Search_Query_MultiTerm();
|
||||
$query->setBoost($this->getBoost());
|
||||
|
||||
$hasInsignificantSubqueries = false;
|
||||
|
||||
require_once 'Zend/Search/Lucene.php';
|
||||
if (Zend_Search_Lucene::getDefaultSearchField() === null) {
|
||||
$searchFields = $index->getFieldNames(true);
|
||||
} else {
|
||||
$searchFields = array(Zend_Search_Lucene::getDefaultSearchField());
|
||||
}
|
||||
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Preprocessing/Term.php';
|
||||
foreach ($searchFields as $fieldName) {
|
||||
$subquery = new Zend_Search_Lucene_Search_Query_Preprocessing_Term($this->_word,
|
||||
$this->_encoding,
|
||||
$fieldName);
|
||||
$rewrittenSubquery = $subquery->rewrite($index);
|
||||
foreach ($rewrittenSubquery->getQueryTerms() as $term) {
|
||||
$query->addTerm($term);
|
||||
}
|
||||
|
||||
if ($rewrittenSubquery instanceof Zend_Search_Lucene_Search_Query_Insignificant) {
|
||||
$hasInsignificantSubqueries = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (count($query->getTerms()) == 0) {
|
||||
$this->_matches = array();
|
||||
if ($hasInsignificantSubqueries) {
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Insignificant.php';
|
||||
return new Zend_Search_Lucene_Search_Query_Insignificant();
|
||||
} else {
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Empty.php';
|
||||
return new Zend_Search_Lucene_Search_Query_Empty();
|
||||
}
|
||||
}
|
||||
|
||||
$this->_matches = $query->getQueryTerms();
|
||||
return $query;
|
||||
}
|
||||
|
||||
// -------------------------------------
|
||||
// Recognize exact term matching (it corresponds to Keyword fields stored in the index)
|
||||
// encoding is not used since we expect binary matching
|
||||
require_once 'Zend/Search/Lucene/Index/Term.php';
|
||||
$term = new Zend_Search_Lucene_Index_Term($this->_word, $this->_field);
|
||||
if ($index->hasTerm($term)) {
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Term.php';
|
||||
$query = new Zend_Search_Lucene_Search_Query_Term($term);
|
||||
$query->setBoost($this->getBoost());
|
||||
|
||||
$this->_matches = $query->getQueryTerms();
|
||||
return $query;
|
||||
}
|
||||
|
||||
|
||||
// -------------------------------------
|
||||
// Recognize wildcard queries
|
||||
|
||||
/** @todo check for PCRE unicode support may be performed through Zend_Environment in some future */
|
||||
if (@preg_match('/\pL/u', 'a') == 1) {
|
||||
$word = iconv($this->_encoding, 'UTF-8', $this->_word);
|
||||
$wildcardsPattern = '/[*?]/u';
|
||||
$subPatternsEncoding = 'UTF-8';
|
||||
} else {
|
||||
$word = $this->_word;
|
||||
$wildcardsPattern = '/[*?]/';
|
||||
$subPatternsEncoding = $this->_encoding;
|
||||
}
|
||||
|
||||
$subPatterns = preg_split($wildcardsPattern, $word, -1, PREG_SPLIT_OFFSET_CAPTURE);
|
||||
|
||||
if (count($subPatterns) > 1) {
|
||||
// Wildcard query is recognized
|
||||
|
||||
$pattern = '';
|
||||
|
||||
require_once 'Zend/Search/Lucene/Analysis/Analyzer.php';
|
||||
foreach ($subPatterns as $id => $subPattern) {
|
||||
// Append corresponding wildcard character to the pattern before each sub-pattern (except first)
|
||||
if ($id != 0) {
|
||||
$pattern .= $word[ $subPattern[1] - 1 ];
|
||||
}
|
||||
|
||||
// Check if each subputtern is a single word in terms of current analyzer
|
||||
$tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($subPattern[0], $subPatternsEncoding);
|
||||
if (count($tokens) > 1) {
|
||||
require_once 'Zend/Search/Lucene/Search/QueryParserException.php';
|
||||
throw new Zend_Search_Lucene_Search_QueryParserException('Wildcard search is supported only for non-multiple word terms');
|
||||
}
|
||||
foreach ($tokens as $token) {
|
||||
$pattern .= $token->getTermText();
|
||||
}
|
||||
}
|
||||
|
||||
require_once 'Zend/Search/Lucene/Index/Term.php';
|
||||
$term = new Zend_Search_Lucene_Index_Term($pattern, $this->_field);
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Wildcard.php';
|
||||
$query = new Zend_Search_Lucene_Search_Query_Wildcard($term);
|
||||
$query->setBoost($this->getBoost());
|
||||
|
||||
// Get rewritten query. Important! It also fills terms matching container.
|
||||
$rewrittenQuery = $query->rewrite($index);
|
||||
$this->_matches = $query->getQueryTerms();
|
||||
|
||||
return $rewrittenQuery;
|
||||
}
|
||||
|
||||
|
||||
// -------------------------------------
|
||||
// Recognize one-term multi-term and "insignificant" queries
|
||||
require_once 'Zend/Search/Lucene/Analysis/Analyzer.php';
|
||||
$tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($this->_word, $this->_encoding);
|
||||
|
||||
if (count($tokens) == 0) {
|
||||
$this->_matches = array();
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Insignificant.php';
|
||||
return new Zend_Search_Lucene_Search_Query_Insignificant();
|
||||
}
|
||||
|
||||
if (count($tokens) == 1) {
|
||||
require_once 'Zend/Search/Lucene/Index/Term.php';
|
||||
$term = new Zend_Search_Lucene_Index_Term($tokens[0]->getTermText(), $this->_field);
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Term.php';
|
||||
$query = new Zend_Search_Lucene_Search_Query_Term($term);
|
||||
$query->setBoost($this->getBoost());
|
||||
|
||||
$this->_matches = $query->getQueryTerms();
|
||||
return $query;
|
||||
}
|
||||
|
||||
//It's not insignificant or one term query
|
||||
require_once 'Zend/Search/Lucene/Search/Query/MultiTerm.php';
|
||||
$query = new Zend_Search_Lucene_Search_Query_MultiTerm();
|
||||
|
||||
/**
|
||||
* @todo Process $token->getPositionIncrement() to support stemming, synonyms and other
|
||||
* analizer design features
|
||||
*/
|
||||
require_once 'Zend/Search/Lucene/Index/Term.php';
|
||||
foreach ($tokens as $token) {
|
||||
$term = new Zend_Search_Lucene_Index_Term($token->getTermText(), $this->_field);
|
||||
$query->addTerm($term, true); // all subterms are required
|
||||
}
|
||||
|
||||
$query->setBoost($this->getBoost());
|
||||
|
||||
$this->_matches = $query->getQueryTerms();
|
||||
return $query;
|
||||
}
|
||||
|
||||
/**
|
||||
* Query specific matches highlighting
|
||||
*
|
||||
* @param Zend_Search_Lucene_Search_Highlighter_Interface $highlighter Highlighter object (also contains doc for highlighting)
|
||||
*/
|
||||
protected function _highlightMatches(Zend_Search_Lucene_Search_Highlighter_Interface $highlighter)
|
||||
{
|
||||
/** Skip fields detection. We don't need it, since we expect all fields presented in the HTML body and don't differentiate them */
|
||||
|
||||
/** Skip exact term matching recognition, keyword fields highlighting is not supported */
|
||||
|
||||
// -------------------------------------
|
||||
// Recognize wildcard queries
|
||||
/** @todo check for PCRE unicode support may be performed through Zend_Environment in some future */
|
||||
if (@preg_match('/\pL/u', 'a') == 1) {
|
||||
$word = iconv($this->_encoding, 'UTF-8', $this->_word);
|
||||
$wildcardsPattern = '/[*?]/u';
|
||||
$subPatternsEncoding = 'UTF-8';
|
||||
} else {
|
||||
$word = $this->_word;
|
||||
$wildcardsPattern = '/[*?]/';
|
||||
$subPatternsEncoding = $this->_encoding;
|
||||
}
|
||||
$subPatterns = preg_split($wildcardsPattern, $word, -1, PREG_SPLIT_OFFSET_CAPTURE);
|
||||
if (count($subPatterns) > 1) {
|
||||
// Wildcard query is recognized
|
||||
|
||||
$pattern = '';
|
||||
|
||||
require_once 'Zend/Search/Lucene/Analysis/Analyzer.php';
|
||||
foreach ($subPatterns as $id => $subPattern) {
|
||||
// Append corresponding wildcard character to the pattern before each sub-pattern (except first)
|
||||
if ($id != 0) {
|
||||
$pattern .= $word[ $subPattern[1] - 1 ];
|
||||
}
|
||||
|
||||
// Check if each subputtern is a single word in terms of current analyzer
|
||||
$tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($subPattern[0], $subPatternsEncoding);
|
||||
if (count($tokens) > 1) {
|
||||
// Do nothing (nothing is highlighted)
|
||||
return;
|
||||
}
|
||||
foreach ($tokens as $token) {
|
||||
$pattern .= $token->getTermText();
|
||||
}
|
||||
}
|
||||
|
||||
require_once 'Zend/Search/Lucene/Index/Term.php';
|
||||
$term = new Zend_Search_Lucene_Index_Term($pattern, $this->_field);
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Wildcard.php';
|
||||
$query = new Zend_Search_Lucene_Search_Query_Wildcard($term);
|
||||
|
||||
$query->_highlightMatches($highlighter);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// -------------------------------------
|
||||
// Recognize one-term multi-term and "insignificant" queries
|
||||
require_once 'Zend/Search/Lucene/Analysis/Analyzer.php';
|
||||
$tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($this->_word, $this->_encoding);
|
||||
|
||||
if (count($tokens) == 0) {
|
||||
// Do nothing
|
||||
return;
|
||||
}
|
||||
|
||||
if (count($tokens) == 1) {
|
||||
$highlighter->highlight($tokens[0]->getTermText());
|
||||
return;
|
||||
}
|
||||
|
||||
//It's not insignificant or one term query
|
||||
$words = array();
|
||||
foreach ($tokens as $token) {
|
||||
$words[] = $token->getTermText();
|
||||
}
|
||||
$highlighter->highlight($words);
|
||||
}
|
||||
|
||||
/**
|
||||
* Print a query
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
// It's used only for query visualisation, so we don't care about characters escaping
|
||||
if ($this->_field !== null) {
|
||||
$query = $this->_field . ':';
|
||||
} else {
|
||||
$query = '';
|
||||
}
|
||||
|
||||
$query .= $this->_word;
|
||||
|
||||
if ($this->getBoost() != 1) {
|
||||
$query .= '^' . round($this->getBoost(), 4);
|
||||
}
|
||||
|
||||
return $query;
|
||||
}
|
||||
}
|
||||
|
@ -17,16 +17,13 @@
|
||||
* @subpackage Search
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: Range.php 16971 2009-07-22 18:05:45Z mikaelkael $
|
||||
* @version $Id: Range.php 18954 2009-11-12 20:01:33Z alexander $
|
||||
*/
|
||||
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query */
|
||||
require_once 'Zend/Search/Lucene/Search/Query.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query_MultiTerm */
|
||||
require_once 'Zend/Search/Lucene/Search/Query/MultiTerm.php';
|
||||
|
||||
|
||||
/**
|
||||
* @category Zend
|
||||
@ -162,10 +159,12 @@ class Zend_Search_Lucene_Search_Query_Range extends Zend_Search_Lucene_Search_Qu
|
||||
$fields = array($this->_field);
|
||||
}
|
||||
|
||||
require_once 'Zend/Search/Lucene.php';
|
||||
$maxTerms = Zend_Search_Lucene::getTermsPerQueryLimit();
|
||||
foreach ($fields as $field) {
|
||||
$index->resetTermsStream();
|
||||
|
||||
require_once 'Zend/Search/Lucene/Index/Term.php';
|
||||
if ($this->_lowerTerm !== null) {
|
||||
$lowerTerm = new Zend_Search_Lucene_Index_Term($this->_lowerTerm->text, $field);
|
||||
|
||||
@ -220,10 +219,13 @@ class Zend_Search_Lucene_Search_Query_Range extends Zend_Search_Lucene_Search_Qu
|
||||
}
|
||||
|
||||
if (count($this->_matches) == 0) {
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Empty.php';
|
||||
return new Zend_Search_Lucene_Search_Query_Empty();
|
||||
} else if (count($this->_matches) == 1) {
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Term.php';
|
||||
return new Zend_Search_Lucene_Search_Query_Term(reset($this->_matches));
|
||||
} else {
|
||||
require_once 'Zend/Search/Lucene/Search/Query/MultiTerm.php';
|
||||
$rewrittenQuery = new Zend_Search_Lucene_Search_Query_MultiTerm();
|
||||
|
||||
foreach ($this->_matches as $matchedTerm) {
|
||||
@ -328,19 +330,20 @@ class Zend_Search_Lucene_Search_Query_Range extends Zend_Search_Lucene_Search_Qu
|
||||
$words = array();
|
||||
|
||||
$docBody = $highlighter->getDocument()->getFieldUtf8Value('body');
|
||||
require_once 'Zend/Search/Lucene/Analysis/Analyzer.php';
|
||||
$tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($docBody, 'UTF-8');
|
||||
|
||||
$lowerTermText = ($this->_lowerTerm !== null)? $this->_lowerTerm->text : null;
|
||||
$upperTermText = ($this->_upperTerm !== null)? $this->_upperTerm->text : null;
|
||||
|
||||
if ($this->_inclusive) {
|
||||
foreach ($tokens as $token) {
|
||||
$termText = $token->getTermText();
|
||||
if (($lowerTermText == null || $lowerTermText <= $termText) &&
|
||||
($upperTermText == null || $termText <= $upperTermText)) {
|
||||
$words[] = $termText;
|
||||
}
|
||||
}
|
||||
foreach ($tokens as $token) {
|
||||
$termText = $token->getTermText();
|
||||
if (($lowerTermText == null || $lowerTermText <= $termText) &&
|
||||
($upperTermText == null || $termText <= $upperTermText)) {
|
||||
$words[] = $termText;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
foreach ($tokens as $token) {
|
||||
$termText = $token->getTermText();
|
||||
|
@ -17,16 +17,13 @@
|
||||
* @subpackage Search
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: Term.php 16541 2009-07-07 06:59:03Z bkarwin $
|
||||
* @version $Id: Term.php 18954 2009-11-12 20:01:33Z alexander $
|
||||
*/
|
||||
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query */
|
||||
require_once 'Zend/Search/Lucene/Search/Query.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_Weight_Term */
|
||||
require_once 'Zend/Search/Lucene/Search/Weight/Term.php';
|
||||
|
||||
|
||||
/**
|
||||
* @category Zend
|
||||
@ -82,9 +79,11 @@ class Zend_Search_Lucene_Search_Query_Term extends Zend_Search_Lucene_Search_Que
|
||||
if ($this->_term->field != null) {
|
||||
return $this;
|
||||
} else {
|
||||
require_once 'Zend/Search/Lucene/Search/Query/MultiTerm.php';
|
||||
$query = new Zend_Search_Lucene_Search_Query_MultiTerm();
|
||||
$query->setBoost($this->getBoost());
|
||||
|
||||
require_once 'Zend/Search/Lucene/Index/Term.php';
|
||||
foreach ($index->getFieldNames(true) as $fieldName) {
|
||||
$term = new Zend_Search_Lucene_Index_Term($this->_term->text, $fieldName);
|
||||
|
||||
@ -105,6 +104,7 @@ class Zend_Search_Lucene_Search_Query_Term extends Zend_Search_Lucene_Search_Que
|
||||
{
|
||||
// Check, that index contains specified term
|
||||
if (!$index->hasTerm($this->_term)) {
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Empty.php';
|
||||
return new Zend_Search_Lucene_Search_Query_Empty();
|
||||
}
|
||||
|
||||
@ -120,6 +120,7 @@ class Zend_Search_Lucene_Search_Query_Term extends Zend_Search_Lucene_Search_Que
|
||||
*/
|
||||
public function createWeight(Zend_Search_Lucene_Interface $reader)
|
||||
{
|
||||
require_once 'Zend/Search/Lucene/Search/Weight/Term.php';
|
||||
$this->_weight = new Zend_Search_Lucene_Search_Weight_Term($this->_term, $this, $reader);
|
||||
return $this->_weight;
|
||||
}
|
||||
@ -198,7 +199,7 @@ class Zend_Search_Lucene_Search_Query_Term extends Zend_Search_Lucene_Search_Que
|
||||
*/
|
||||
protected function _highlightMatches(Zend_Search_Lucene_Search_Highlighter_Interface $highlighter)
|
||||
{
|
||||
$highlighter->highlight($this->_term->text);
|
||||
$highlighter->highlight($this->_term->text);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -210,9 +211,9 @@ class Zend_Search_Lucene_Search_Query_Term extends Zend_Search_Lucene_Search_Que
|
||||
{
|
||||
// It's used only for query visualisation, so we don't care about characters escaping
|
||||
if ($this->_term->field !== null) {
|
||||
$query = $this->_term->field . ':';
|
||||
$query = $this->_term->field . ':';
|
||||
} else {
|
||||
$query = '';
|
||||
$query = '';
|
||||
}
|
||||
|
||||
$query .= $this->_term->text;
|
||||
|
@ -17,16 +17,13 @@
|
||||
* @subpackage Search
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: Wildcard.php 16971 2009-07-22 18:05:45Z mikaelkael $
|
||||
* @version $Id: Wildcard.php 18954 2009-11-12 20:01:33Z alexander $
|
||||
*/
|
||||
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query */
|
||||
require_once 'Zend/Search/Lucene/Search/Query.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query_MultiTerm */
|
||||
require_once 'Zend/Search/Lucene/Search/Query/MultiTerm.php';
|
||||
|
||||
|
||||
/**
|
||||
* @category Zend
|
||||
@ -84,7 +81,7 @@ class Zend_Search_Lucene_Search_Query_Wildcard extends Zend_Search_Lucene_Search
|
||||
*/
|
||||
public static function getMinPrefixLength()
|
||||
{
|
||||
return self::$_minPrefixLength;
|
||||
return self::$_minPrefixLength;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -94,7 +91,7 @@ class Zend_Search_Lucene_Search_Query_Wildcard extends Zend_Search_Lucene_Search
|
||||
*/
|
||||
public static function setMinPrefixLength($minPrefixLength)
|
||||
{
|
||||
self::$_minPrefixLength = $minPrefixLength;
|
||||
self::$_minPrefixLength = $minPrefixLength;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -144,7 +141,8 @@ class Zend_Search_Lucene_Search_Query_Wildcard extends Zend_Search_Lucene_Search
|
||||
$matchExpression = '/^' . str_replace(array('\\?', '\\*'), array('.', '.*') , preg_quote($this->_pattern->text, '/')) . '$/';
|
||||
|
||||
if ($prefixLength < self::$_minPrefixLength) {
|
||||
throw new Zend_Search_Lucene_Exception('At least ' . self::$_minPrefixLength . ' non-wildcard characters are required at the beginning of pattern.');
|
||||
require_once 'Zend/Search/Lucene/Exception.php';
|
||||
throw new Zend_Search_Lucene_Exception('At least ' . self::$_minPrefixLength . ' non-wildcard characters are required at the beginning of pattern.');
|
||||
}
|
||||
|
||||
/** @todo check for PCRE unicode support may be performed through Zend_Environment in some future */
|
||||
@ -158,6 +156,7 @@ class Zend_Search_Lucene_Search_Query_Wildcard extends Zend_Search_Lucene_Search
|
||||
foreach ($fields as $field) {
|
||||
$index->resetTermsStream();
|
||||
|
||||
require_once 'Zend/Search/Lucene/Index/Term.php';
|
||||
if ($prefix != '') {
|
||||
$index->skipTo(new Zend_Search_Lucene_Index_Term($prefix, $field));
|
||||
|
||||
@ -168,7 +167,8 @@ class Zend_Search_Lucene_Search_Query_Wildcard extends Zend_Search_Lucene_Search
|
||||
$this->_matches[] = $index->currentTerm();
|
||||
|
||||
if ($maxTerms != 0 && count($this->_matches) > $maxTerms) {
|
||||
throw new Zend_Search_Lucene_Exception('Terms per query limit is reached.');
|
||||
require_once 'Zend/Search/Lucene/Exception.php';
|
||||
throw new Zend_Search_Lucene_Exception('Terms per query limit is reached.');
|
||||
}
|
||||
}
|
||||
|
||||
@ -182,6 +182,7 @@ class Zend_Search_Lucene_Search_Query_Wildcard extends Zend_Search_Lucene_Search
|
||||
$this->_matches[] = $index->currentTerm();
|
||||
|
||||
if ($maxTerms != 0 && count($this->_matches) > $maxTerms) {
|
||||
require_once 'Zend/Search/Lucene/Exception.php';
|
||||
throw new Zend_Search_Lucene_Exception('Terms per query limit is reached.');
|
||||
}
|
||||
}
|
||||
@ -194,10 +195,13 @@ class Zend_Search_Lucene_Search_Query_Wildcard extends Zend_Search_Lucene_Search
|
||||
}
|
||||
|
||||
if (count($this->_matches) == 0) {
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Empty.php';
|
||||
return new Zend_Search_Lucene_Search_Query_Empty();
|
||||
} else if (count($this->_matches) == 1) {
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Term.php';
|
||||
return new Zend_Search_Lucene_Search_Query_Term(reset($this->_matches));
|
||||
} else {
|
||||
require_once 'Zend/Search/Lucene/Search/Query/MultiTerm.php';
|
||||
$rewrittenQuery = new Zend_Search_Lucene_Search_Query_MultiTerm();
|
||||
|
||||
foreach ($this->_matches as $matchedTerm) {
|
||||
@ -216,6 +220,7 @@ class Zend_Search_Lucene_Search_Query_Wildcard extends Zend_Search_Lucene_Search
|
||||
*/
|
||||
public function optimize(Zend_Search_Lucene_Interface $index)
|
||||
{
|
||||
require_once 'Zend/Search/Lucene/Exception.php';
|
||||
throw new Zend_Search_Lucene_Exception('Wildcard query should not be directly used for search. Use $query->rewrite($index)');
|
||||
}
|
||||
|
||||
@ -240,6 +245,7 @@ class Zend_Search_Lucene_Search_Query_Wildcard extends Zend_Search_Lucene_Search
|
||||
public function getQueryTerms()
|
||||
{
|
||||
if ($this->_matches === null) {
|
||||
require_once 'Zend/Search/Lucene/Exception.php';
|
||||
throw new Zend_Search_Lucene_Exception('Search has to be performed first to get matched terms');
|
||||
}
|
||||
|
||||
@ -255,6 +261,7 @@ class Zend_Search_Lucene_Search_Query_Wildcard extends Zend_Search_Lucene_Search
|
||||
*/
|
||||
public function createWeight(Zend_Search_Lucene_Interface $reader)
|
||||
{
|
||||
require_once 'Zend/Search/Lucene/Exception.php';
|
||||
throw new Zend_Search_Lucene_Exception('Wildcard query should not be directly used for search. Use $query->rewrite($index)');
|
||||
}
|
||||
|
||||
@ -269,6 +276,7 @@ class Zend_Search_Lucene_Search_Query_Wildcard extends Zend_Search_Lucene_Search
|
||||
*/
|
||||
public function execute(Zend_Search_Lucene_Interface $reader, $docsFilter = null)
|
||||
{
|
||||
require_once 'Zend/Search/Lucene/Exception.php';
|
||||
throw new Zend_Search_Lucene_Exception('Wildcard query should not be directly used for search. Use $query->rewrite($index)');
|
||||
}
|
||||
|
||||
@ -282,6 +290,7 @@ class Zend_Search_Lucene_Search_Query_Wildcard extends Zend_Search_Lucene_Search
|
||||
*/
|
||||
public function matchedDocs()
|
||||
{
|
||||
require_once 'Zend/Search/Lucene/Exception.php';
|
||||
throw new Zend_Search_Lucene_Exception('Wildcard query should not be directly used for search. Use $query->rewrite($index)');
|
||||
}
|
||||
|
||||
@ -295,6 +304,7 @@ class Zend_Search_Lucene_Search_Query_Wildcard extends Zend_Search_Lucene_Search
|
||||
*/
|
||||
public function score($docId, Zend_Search_Lucene_Interface $reader)
|
||||
{
|
||||
require_once 'Zend/Search/Lucene/Exception.php';
|
||||
throw new Zend_Search_Lucene_Exception('Wildcard query should not be directly used for search. Use $query->rewrite($index)');
|
||||
}
|
||||
|
||||
@ -315,6 +325,7 @@ class Zend_Search_Lucene_Search_Query_Wildcard extends Zend_Search_Lucene_Search
|
||||
}
|
||||
|
||||
$docBody = $highlighter->getDocument()->getFieldUtf8Value('body');
|
||||
require_once 'Zend/Search/Lucene/Analysis/Analyzer.php';
|
||||
$tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($docBody, 'UTF-8');
|
||||
foreach ($tokens as $token) {
|
||||
if (preg_match($matchExpression, $token->getTermText()) === 1) {
|
||||
|
@ -17,21 +17,9 @@
|
||||
* @subpackage Search
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: QueryEntry.php 16971 2009-07-22 18:05:45Z mikaelkael $
|
||||
* @version $Id: QueryEntry.php 18954 2009-11-12 20:01:33Z alexander $
|
||||
*/
|
||||
|
||||
/** Zend_Search_Lucene_Index_Term */
|
||||
require_once 'Zend/Search/Lucene/Index/Term.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_QueryEntry_Term */
|
||||
require_once 'Zend/Search/Lucene/Search/QueryEntry/Term.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_QueryEntry_Phrase */
|
||||
require_once 'Zend/Search/Lucene/Search/QueryEntry/Phrase.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_QueryEntry_Subquery */
|
||||
require_once 'Zend/Search/Lucene/Search/QueryEntry/Subquery.php';
|
||||
|
||||
/**
|
||||
* @category Zend
|
||||
* @package Zend_Search_Lucene
|
||||
|
@ -17,18 +17,12 @@
|
||||
* @subpackage Search
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: Phrase.php 16971 2009-07-22 18:05:45Z mikaelkael $
|
||||
* @version $Id: Phrase.php 18954 2009-11-12 20:01:33Z alexander $
|
||||
*/
|
||||
|
||||
/** Zend_Search_Lucene_Index_Term */
|
||||
require_once 'Zend/Search/Lucene/Index/Term.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_QueryEntry */
|
||||
require_once 'Zend/Search/Lucene/Search/QueryEntry.php';
|
||||
|
||||
/** Zend_Search_Lucene_Analysis_Analyzer */
|
||||
require_once 'Zend/Search/Lucene/Analysis/Analyzer.php';
|
||||
|
||||
/**
|
||||
* @category Zend
|
||||
* @package Zend_Search_Lucene
|
||||
@ -103,11 +97,13 @@ class Zend_Search_Lucene_Search_QueryEntry_Phrase extends Zend_Search_Lucene_Sea
|
||||
*/
|
||||
public function getQuery($encoding)
|
||||
{
|
||||
$query = new Zend_Search_Lucene_Search_Query_Preprocessing_Phrase($this->_phrase,
|
||||
$encoding,
|
||||
($this->_field !== null)?
|
||||
iconv($encoding, 'UTF-8', $this->_field) :
|
||||
null);
|
||||
/** Zend_Search_Lucene_Search_Query_Preprocessing_Phrase */
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Preprocessing/Phrase.php';
|
||||
$query = new Zend_Search_Lucene_Search_Query_Preprocessing_Phrase($this->_phrase,
|
||||
$encoding,
|
||||
($this->_field !== null)?
|
||||
iconv($encoding, 'UTF-8', $this->_field) :
|
||||
null);
|
||||
|
||||
if ($this->_proximityQuery) {
|
||||
$query->setSlop($this->_wordsDistance);
|
||||
|
@ -17,12 +17,9 @@
|
||||
* @subpackage Search
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: Subquery.php 16971 2009-07-22 18:05:45Z mikaelkael $
|
||||
* @version $Id: Subquery.php 18954 2009-11-12 20:01:33Z alexander $
|
||||
*/
|
||||
|
||||
/** Zend_Search_Lucene_Index_Term */
|
||||
require_once 'Zend/Search/Lucene/Index/Term.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_QueryEntry */
|
||||
require_once 'Zend/Search/Lucene/Search/QueryEntry.php';
|
||||
|
||||
|
@ -17,18 +17,12 @@
|
||||
* @subpackage Search
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: Term.php 16971 2009-07-22 18:05:45Z mikaelkael $
|
||||
* @version $Id: Term.php 18954 2009-11-12 20:01:33Z alexander $
|
||||
*/
|
||||
|
||||
/** Zend_Search_Lucene_Index_Term */
|
||||
require_once 'Zend/Search/Lucene/Index/Term.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_QueryEntry */
|
||||
require_once 'Zend/Search/Lucene/Search/QueryEntry.php';
|
||||
|
||||
/** Zend_Search_Lucene_Analysis_Analyzer */
|
||||
require_once 'Zend/Search/Lucene/Analysis/Analyzer.php';
|
||||
|
||||
/**
|
||||
* @category Zend
|
||||
* @package Zend_Search_Lucene
|
||||
@ -92,6 +86,8 @@ class Zend_Search_Lucene_Search_QueryEntry_Term extends Zend_Search_Lucene_Searc
|
||||
if ($parameter !== null) {
|
||||
$this->_similarity = $parameter;
|
||||
} else {
|
||||
/** Zend_Search_Lucene_Search_Query_Fuzzy */
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Fuzzy.php';
|
||||
$this->_similarity = Zend_Search_Lucene_Search_Query_Fuzzy::DEFAULT_MIN_SIMILARITY;
|
||||
}
|
||||
}
|
||||
@ -105,26 +101,30 @@ class Zend_Search_Lucene_Search_QueryEntry_Term extends Zend_Search_Lucene_Searc
|
||||
*/
|
||||
public function getQuery($encoding)
|
||||
{
|
||||
if ($this->_fuzzyQuery) {
|
||||
$query = new Zend_Search_Lucene_Search_Query_Preprocessing_Fuzzy($this->_term,
|
||||
$encoding,
|
||||
($this->_field !== null)?
|
||||
if ($this->_fuzzyQuery) {
|
||||
/** Zend_Search_Lucene_Search_Query_Preprocessing_Fuzzy */
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Preprocessing/Fuzzy.php';
|
||||
$query = new Zend_Search_Lucene_Search_Query_Preprocessing_Fuzzy($this->_term,
|
||||
$encoding,
|
||||
($this->_field !== null)?
|
||||
iconv($encoding, 'UTF-8', $this->_field) :
|
||||
null,
|
||||
$this->_similarity
|
||||
);
|
||||
$this->_similarity
|
||||
);
|
||||
$query->setBoost($this->_boost);
|
||||
return $query;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$query = new Zend_Search_Lucene_Search_Query_Preprocessing_Term($this->_term,
|
||||
$encoding,
|
||||
($this->_field !== null)?
|
||||
/** Zend_Search_Lucene_Search_Query_Preprocessing_Term */
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Preprocessing/Term.php';
|
||||
$query = new Zend_Search_Lucene_Search_Query_Preprocessing_Term($this->_term,
|
||||
$encoding,
|
||||
($this->_field !== null)?
|
||||
iconv($encoding, 'UTF-8', $this->_field) :
|
||||
null
|
||||
);
|
||||
$query->setBoost($this->_boost);
|
||||
$query->setBoost($this->_boost);
|
||||
return $query;
|
||||
}
|
||||
}
|
||||
|
@ -17,7 +17,7 @@
|
||||
* @subpackage Search
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: QueryHit.php 16541 2009-07-07 06:59:03Z bkarwin $
|
||||
* @version $Id: QueryHit.php 18954 2009-11-12 20:01:33Z alexander $
|
||||
*/
|
||||
|
||||
|
||||
@ -64,6 +64,7 @@ class Zend_Search_Lucene_Search_QueryHit
|
||||
|
||||
public function __construct(Zend_Search_Lucene_Interface $index)
|
||||
{
|
||||
require_once 'Zend/Search/Lucene/Proxy.php';
|
||||
$this->_index = new Zend_Search_Lucene_Proxy($index);
|
||||
}
|
||||
|
||||
|
@ -17,50 +17,19 @@
|
||||
* @subpackage Search
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: QueryParser.php 16541 2009-07-07 06:59:03Z bkarwin $
|
||||
* @version $Id: QueryParser.php 18954 2009-11-12 20:01:33Z alexander $
|
||||
*/
|
||||
|
||||
/** Zend_Search_Lucene_Index_Term */
|
||||
require_once 'Zend/Search/Lucene/Index/Term.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query_Term */
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Term.php';
|
||||
/** Internally used classes */
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query_MultiTerm */
|
||||
require_once 'Zend/Search/Lucene/Search/Query/MultiTerm.php';
|
||||
/** Zend_Search_Lucene_Analysis_Analyzer */
|
||||
require_once 'Zend/Search/Lucene/Analysis/Analyzer.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query_Boolean */
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Boolean.php';
|
||||
/** Zend_Search_Lucene_Search_QueryToken */
|
||||
require_once 'Zend/Search/Lucene/Search/QueryToken.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query_Preprocessing_Phrase */
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Preprocessing/Phrase.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query_Preprocessing_Term */
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Preprocessing/Term.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query_Preprocessing_Fuzzy */
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Preprocessing/Fuzzy.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query_Wildcard */
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Wildcard.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query_Range */
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Range.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query_Fuzzy */
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Fuzzy.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query_Empty */
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Empty.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query_Insignificant */
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Insignificant.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_QueryLexer */
|
||||
require_once 'Zend/Search/Lucene/Search/QueryLexer.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_QueryParserContext */
|
||||
require_once 'Zend/Search/Lucene/Search/QueryParserContext.php';
|
||||
|
||||
/** Zend_Search_Lucene_FSM */
|
||||
require_once 'Zend/Search/Lucene/FSM.php';
|
||||
@ -281,7 +250,7 @@ class Zend_Search_Lucene_Search_QueryParser extends Zend_Search_Lucene_FSM
|
||||
$this->addEntryAction(self::ST_CLOSEDINT_RQ_LAST_TERM, $closedRQLastTermAction);
|
||||
|
||||
|
||||
|
||||
require_once 'Zend/Search/Lucene/Search/QueryLexer.php';
|
||||
$this->_lexer = new Zend_Search_Lucene_Search_QueryLexer();
|
||||
}
|
||||
|
||||
@ -380,6 +349,8 @@ class Zend_Search_Lucene_Search_QueryParser extends Zend_Search_Lucene_FSM
|
||||
|
||||
require_once 'Zend/Search/Lucene/Search/QueryParserException.php';
|
||||
try {
|
||||
require_once 'Zend/Search/Lucene/Search/QueryParserContext.php';
|
||||
|
||||
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);
|
||||
@ -388,6 +359,7 @@ class Zend_Search_Lucene_Search_QueryParser extends Zend_Search_Lucene_FSM
|
||||
|
||||
// Empty query
|
||||
if (count(self::$_instance->_tokens) == 0) {
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Insignificant.php';
|
||||
return new Zend_Search_Lucene_Search_Query_Insignificant();
|
||||
}
|
||||
|
||||
@ -416,10 +388,12 @@ class Zend_Search_Lucene_Search_QueryParser extends Zend_Search_Lucene_FSM
|
||||
if (self::$_instance->_suppressQueryParsingExceptions) {
|
||||
$queryTokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($strQuery, self::$_instance->_encoding);
|
||||
|
||||
require_once 'Zend/Search/Lucene/Search/Query/MultiTerm.php';
|
||||
$query = new Zend_Search_Lucene_Search_Query_MultiTerm();
|
||||
$termsSign = (self::$_instance->_defaultOperator == self::B_AND) ? true /* required term */ :
|
||||
null /* optional term */;
|
||||
|
||||
require_once 'Zend/Search/Lucene/Index/Term.php';
|
||||
foreach ($queryTokens as $token) {
|
||||
$query->addTerm(new Zend_Search_Lucene_Index_Term($token->getTermText()), $termsSign);
|
||||
}
|
||||
@ -443,6 +417,7 @@ class Zend_Search_Lucene_Search_QueryParser extends Zend_Search_Lucene_FSM
|
||||
*/
|
||||
public function addTermEntry()
|
||||
{
|
||||
require_once 'Zend/Search/Lucene/Search/QueryEntry/Term.php';
|
||||
$entry = new Zend_Search_Lucene_Search_QueryEntry_Term($this->_currentToken->text, $this->_context->getField());
|
||||
$this->_context->addEntry($entry);
|
||||
}
|
||||
@ -452,6 +427,7 @@ class Zend_Search_Lucene_Search_QueryParser extends Zend_Search_Lucene_FSM
|
||||
*/
|
||||
public function addPhraseEntry()
|
||||
{
|
||||
require_once 'Zend/Search/Lucene/Search/QueryEntry/Phrase.php';
|
||||
$entry = new Zend_Search_Lucene_Search_QueryEntry_Phrase($this->_currentToken->text, $this->_context->getField());
|
||||
$this->_context->addEntry($entry);
|
||||
}
|
||||
@ -515,6 +491,8 @@ class Zend_Search_Lucene_Search_QueryParser extends Zend_Search_Lucene_FSM
|
||||
*/
|
||||
public function subqueryStart()
|
||||
{
|
||||
require_once 'Zend/Search/Lucene/Search/QueryParserContext.php';
|
||||
|
||||
$this->_contextStack[] = $this->_context;
|
||||
$this->_context = new Zend_Search_Lucene_Search_QueryParserContext($this->_encoding, $this->_context->getField());
|
||||
}
|
||||
@ -532,6 +510,7 @@ class Zend_Search_Lucene_Search_QueryParser extends Zend_Search_Lucene_FSM
|
||||
$query = $this->_context->getQuery();
|
||||
$this->_context = array_pop($this->_contextStack);
|
||||
|
||||
require_once 'Zend/Search/Lucene/Search/QueryEntry/Subquery.php';
|
||||
$this->_context->addEntry(new Zend_Search_Lucene_Search_QueryEntry_Subquery($query));
|
||||
}
|
||||
|
||||
@ -563,6 +542,7 @@ class Zend_Search_Lucene_Search_QueryParser extends Zend_Search_Lucene_FSM
|
||||
require_once 'Zend/Search/Lucene/Search/QueryParserException.php';
|
||||
throw new Zend_Search_Lucene_Search_QueryParserException('Range query boundary terms must be non-multiple word terms');
|
||||
} else if (count($tokens) == 1) {
|
||||
require_once 'Zend/Search/Lucene/Index/Term.php';
|
||||
$from = new Zend_Search_Lucene_Index_Term(reset($tokens)->getTermText(), $this->_context->getField());
|
||||
} else {
|
||||
$from = null;
|
||||
@ -573,6 +553,7 @@ class Zend_Search_Lucene_Search_QueryParser extends Zend_Search_Lucene_FSM
|
||||
require_once 'Zend/Search/Lucene/Search/QueryParserException.php';
|
||||
throw new Zend_Search_Lucene_Search_QueryParserException('Range query boundary terms must be non-multiple word terms');
|
||||
} else if (count($tokens) == 1) {
|
||||
require_once 'Zend/Search/Lucene/Index/Term.php';
|
||||
$to = new Zend_Search_Lucene_Index_Term(reset($tokens)->getTermText(), $this->_context->getField());
|
||||
} else {
|
||||
$to = null;
|
||||
@ -583,7 +564,9 @@ class Zend_Search_Lucene_Search_QueryParser extends Zend_Search_Lucene_FSM
|
||||
throw new Zend_Search_Lucene_Search_QueryParserException('At least one range query boundary term must be non-empty term');
|
||||
}
|
||||
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Range.php';
|
||||
$rangeQuery = new Zend_Search_Lucene_Search_Query_Range($from, $to, false);
|
||||
require_once 'Zend/Search/Lucene/Search/QueryEntry/Subquery.php';
|
||||
$entry = new Zend_Search_Lucene_Search_QueryEntry_Subquery($rangeQuery);
|
||||
$this->_context->addEntry($entry);
|
||||
}
|
||||
@ -608,6 +591,7 @@ class Zend_Search_Lucene_Search_QueryParser extends Zend_Search_Lucene_FSM
|
||||
require_once 'Zend/Search/Lucene/Search/QueryParserException.php';
|
||||
throw new Zend_Search_Lucene_Search_QueryParserException('Range query boundary terms must be non-multiple word terms');
|
||||
} else if (count($tokens) == 1) {
|
||||
require_once 'Zend/Search/Lucene/Index/Term.php';
|
||||
$from = new Zend_Search_Lucene_Index_Term(reset($tokens)->getTermText(), $this->_context->getField());
|
||||
} else {
|
||||
$from = null;
|
||||
@ -618,6 +602,7 @@ class Zend_Search_Lucene_Search_QueryParser extends Zend_Search_Lucene_FSM
|
||||
require_once 'Zend/Search/Lucene/Search/QueryParserException.php';
|
||||
throw new Zend_Search_Lucene_Search_QueryParserException('Range query boundary terms must be non-multiple word terms');
|
||||
} else if (count($tokens) == 1) {
|
||||
require_once 'Zend/Search/Lucene/Index/Term.php';
|
||||
$to = new Zend_Search_Lucene_Index_Term(reset($tokens)->getTermText(), $this->_context->getField());
|
||||
} else {
|
||||
$to = null;
|
||||
@ -628,7 +613,9 @@ class Zend_Search_Lucene_Search_QueryParser extends Zend_Search_Lucene_FSM
|
||||
throw new Zend_Search_Lucene_Search_QueryParserException('At least one range query boundary term must be non-empty term');
|
||||
}
|
||||
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Range.php';
|
||||
$rangeQuery = new Zend_Search_Lucene_Search_Query_Range($from, $to, true);
|
||||
require_once 'Zend/Search/Lucene/Search/QueryEntry/Subquery.php';
|
||||
$entry = new Zend_Search_Lucene_Search_QueryEntry_Subquery($rangeQuery);
|
||||
$this->_context->addEntry($entry);
|
||||
}
|
||||
|
@ -17,35 +17,12 @@
|
||||
* @subpackage Search
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: QueryParserContext.php 16971 2009-07-22 18:05:45Z mikaelkael $
|
||||
* @version $Id: QueryParserContext.php 18954 2009-11-12 20:01:33Z alexander $
|
||||
*/
|
||||
|
||||
/** Zend_Search_Lucene_FSM */
|
||||
require_once 'Zend/Search/Lucene/FSM.php';
|
||||
|
||||
/** Zend_Search_Lucene_Index_Term */
|
||||
require_once 'Zend/Search/Lucene/Index/Term.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_QueryToken */
|
||||
require_once 'Zend/Search/Lucene/Search/QueryToken.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query_Term */
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Term.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query_MultiTerm */
|
||||
require_once 'Zend/Search/Lucene/Search/Query/MultiTerm.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query_Boolean */
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Boolean.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_Query_Phrase */
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Phrase.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_BooleanExpressionRecognizer */
|
||||
require_once 'Zend/Search/Lucene/Search/BooleanExpressionRecognizer.php';
|
||||
|
||||
/** Zend_Search_Lucene_Search_QueryEntry */
|
||||
require_once 'Zend/Search/Lucene/Search/QueryEntry.php';
|
||||
|
||||
/**
|
||||
* @category Zend
|
||||
@ -277,8 +254,10 @@ class Zend_Search_Lucene_Search_QueryParserContext
|
||||
*/
|
||||
public function _signStyleExpressionQuery()
|
||||
{
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Boolean.php';
|
||||
$query = new Zend_Search_Lucene_Search_Query_Boolean();
|
||||
|
||||
require_once 'Zend/Search/Lucene/Search/QueryParser.php';
|
||||
if (Zend_Search_Lucene_Search_QueryParser::getDefaultOperator() == Zend_Search_Lucene_Search_QueryParser::B_AND) {
|
||||
$defaultSign = true; // required
|
||||
} else {
|
||||
@ -314,6 +293,7 @@ class Zend_Search_Lucene_Search_QueryParserContext
|
||||
* one or more query entries
|
||||
*/
|
||||
|
||||
require_once 'Zend/Search/Lucene/Search/BooleanExpressionRecognizer.php';
|
||||
$expressionRecognizer = new Zend_Search_Lucene_Search_BooleanExpressionRecognizer();
|
||||
|
||||
require_once 'Zend/Search/Lucene/Exception.php';
|
||||
@ -373,6 +353,7 @@ class Zend_Search_Lucene_Search_QueryParserContext
|
||||
if (count($conjuction) == 1) {
|
||||
$subqueries[] = $conjuction[0][0]->getQuery($this->_encoding);
|
||||
} else {
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Boolean.php';
|
||||
$subquery = new Zend_Search_Lucene_Search_Query_Boolean();
|
||||
|
||||
foreach ($conjuction as $conjuctionEntry) {
|
||||
@ -384,6 +365,7 @@ class Zend_Search_Lucene_Search_QueryParserContext
|
||||
}
|
||||
|
||||
if (count($subqueries) == 0) {
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Insignificant.php';
|
||||
return new Zend_Search_Lucene_Search_Query_Insignificant();
|
||||
}
|
||||
|
||||
@ -392,6 +374,7 @@ class Zend_Search_Lucene_Search_QueryParserContext
|
||||
}
|
||||
|
||||
|
||||
require_once 'Zend/Search/Lucene/Search/Query/Boolean.php';
|
||||
$query = new Zend_Search_Lucene_Search_Query_Boolean();
|
||||
|
||||
foreach ($subqueries as $subquery) {
|
||||
|
@ -17,14 +17,10 @@
|
||||
* @subpackage Search
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: Similarity.php 16541 2009-07-07 06:59:03Z bkarwin $
|
||||
* @version $Id: Similarity.php 18954 2009-11-12 20:01:33Z alexander $
|
||||
*/
|
||||
|
||||
|
||||
/** Zend_Search_Lucene_Search_Similarity_Default */
|
||||
require_once 'Zend/Search/Lucene/Search/Similarity/Default.php';
|
||||
|
||||
|
||||
/**
|
||||
* @category Zend
|
||||
* @package Zend_Search_Lucene
|
||||
@ -326,6 +322,7 @@ abstract class Zend_Search_Lucene_Search_Similarity
|
||||
public static function getDefault()
|
||||
{
|
||||
if (!self::$_defaultImpl instanceof Zend_Search_Lucene_Search_Similarity) {
|
||||
require_once 'Zend/Search/Lucene/Search/Similarity/Default.php';
|
||||
self::$_defaultImpl = new Zend_Search_Lucene_Search_Similarity_Default();
|
||||
}
|
||||
|
||||
|
@ -17,7 +17,7 @@
|
||||
* @subpackage Search
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: MultiTerm.php 16541 2009-07-07 06:59:03Z bkarwin $
|
||||
* @version $Id: MultiTerm.php 18954 2009-11-12 20:01:33Z alexander $
|
||||
*/
|
||||
|
||||
|
||||
@ -76,6 +76,7 @@ class Zend_Search_Lucene_Search_Weight_MultiTerm extends Zend_Search_Lucene_Sear
|
||||
|
||||
foreach ($query->getTerms() as $id => $term) {
|
||||
if ($signs === null || $signs[$id] === null || $signs[$id]) {
|
||||
require_once 'Zend/Search/Lucene/Search/Weight/Term.php';
|
||||
$this->_weights[$id] = new Zend_Search_Lucene_Search_Weight_Term($term, $query, $reader);
|
||||
$query->setWeight($id, $this->_weights[$id]);
|
||||
}
|
||||
|
@ -17,7 +17,7 @@
|
||||
* @subpackage Storage
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: Directory.php 16541 2009-07-07 06:59:03Z bkarwin $
|
||||
* @version $Id: Directory.php 18951 2009-11-12 16:26:19Z alexander $
|
||||
*/
|
||||
|
||||
|
||||
@ -64,14 +64,14 @@ abstract class Zend_Search_Lucene_Storage_Directory
|
||||
|
||||
/**
|
||||
* Purge file if it's cached by directory object
|
||||
*
|
||||
*
|
||||
* Method is used to prevent 'too many open files' error
|
||||
*
|
||||
* @param string $filename
|
||||
* @return void
|
||||
*/
|
||||
abstract public function purgeFile($filename);
|
||||
|
||||
|
||||
/**
|
||||
* Returns true if a file with the given $filename exists.
|
||||
*
|
||||
|
@ -17,16 +17,13 @@
|
||||
* @subpackage Storage
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: Filesystem.php 16541 2009-07-07 06:59:03Z bkarwin $
|
||||
* @version $Id: Filesystem.php 18954 2009-11-12 20:01:33Z alexander $
|
||||
*/
|
||||
|
||||
|
||||
/** Zend_Search_Lucene_Storage_Directory */
|
||||
require_once 'Zend/Search/Lucene/Storage/Directory.php';
|
||||
|
||||
/** Zend_Search_Lucene_Storage_File_Filesystem */
|
||||
require_once 'Zend/Search/Lucene/Storage/File/Filesystem.php';
|
||||
|
||||
|
||||
/**
|
||||
* FileSystem implementation of Directory abstraction.
|
||||
@ -183,6 +180,7 @@ class Zend_Search_Lucene_Storage_Directory_Filesystem extends Zend_Search_Lucene
|
||||
$this->_fileHandlers[$filename]->close();
|
||||
}
|
||||
unset($this->_fileHandlers[$filename]);
|
||||
require_once 'Zend/Search/Lucene/Storage/File/Filesystem.php';
|
||||
$this->_fileHandlers[$filename] = new Zend_Search_Lucene_Storage_File_Filesystem($this->_dirPath . '/' . $filename, 'w+b');
|
||||
|
||||
// Set file permissions, but don't care about any possible failures, since file may be already
|
||||
@ -347,6 +345,7 @@ class Zend_Search_Lucene_Storage_Directory_Filesystem extends Zend_Search_Lucene
|
||||
{
|
||||
$fullFilename = $this->_dirPath . '/' . $filename;
|
||||
|
||||
require_once 'Zend/Search/Lucene/Storage/File/Filesystem.php';
|
||||
if (!$shareHandler) {
|
||||
return new Zend_Search_Lucene_Storage_File_Filesystem($fullFilename);
|
||||
}
|
||||
|
@ -1,176 +1,176 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to license@zend.com so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Search_Lucene
|
||||
* @subpackage Index
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: TermStreamsPriorityQueue.php 16971 2009-07-22 18:05:45Z mikaelkael $
|
||||
*/
|
||||
|
||||
/** Zend_Search_Lucene_Index_TermsStream_Interface */
|
||||
require_once 'Zend/Search/Lucene/Index/TermsStream/Interface.php';
|
||||
|
||||
/** Zend_Search_Lucene_Index_TermsPriorityQueue */
|
||||
require_once 'Zend/Search/Lucene/Index/TermsPriorityQueue.php';
|
||||
|
||||
|
||||
/**
|
||||
* @category Zend
|
||||
* @package Zend_Search_Lucene
|
||||
* @subpackage Index
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Search_Lucene_TermStreamsPriorityQueue implements Zend_Search_Lucene_Index_TermsStream_Interface
|
||||
{
|
||||
/**
|
||||
* Array of term streams (Zend_Search_Lucene_Index_TermsStream_Interface objects)
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $_termStreams;
|
||||
|
||||
/**
|
||||
* Terms stream queue
|
||||
*
|
||||
* @var Zend_Search_Lucene_Index_TermsPriorityQueue
|
||||
*/
|
||||
protected $_termsStreamQueue = null;
|
||||
|
||||
/**
|
||||
* Last Term in a terms stream
|
||||
*
|
||||
* @var Zend_Search_Lucene_Index_Term
|
||||
*/
|
||||
protected $_lastTerm = null;
|
||||
|
||||
|
||||
/**
|
||||
* Object constructor
|
||||
*
|
||||
* @param array $termStreams array of term streams (Zend_Search_Lucene_Index_TermsStream_Interface objects)
|
||||
*/
|
||||
public function __construct(array $termStreams)
|
||||
{
|
||||
$this->_termStreams = $termStreams;
|
||||
|
||||
$this->resetTermsStream();
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset terms stream.
|
||||
*/
|
||||
public function resetTermsStream()
|
||||
{
|
||||
$this->_termsStreamQueue = new Zend_Search_Lucene_Index_TermsPriorityQueue();
|
||||
|
||||
foreach ($this->_termStreams as $termStream) {
|
||||
$termStream->resetTermsStream();
|
||||
|
||||
// Skip "empty" containers
|
||||
if ($termStream->currentTerm() !== null) {
|
||||
$this->_termsStreamQueue->put($termStream);
|
||||
}
|
||||
}
|
||||
|
||||
$this->nextTerm();
|
||||
}
|
||||
|
||||
/**
|
||||
* Skip terms stream up to specified term preffix.
|
||||
*
|
||||
* Prefix contains fully specified field info and portion of searched term
|
||||
*
|
||||
* @param Zend_Search_Lucene_Index_Term $prefix
|
||||
*/
|
||||
public function skipTo(Zend_Search_Lucene_Index_Term $prefix)
|
||||
{
|
||||
$termStreams = array();
|
||||
|
||||
while (($termStream = $this->_termsStreamQueue->pop()) !== null) {
|
||||
$termStreams[] = $termStream;
|
||||
}
|
||||
|
||||
foreach ($termStreams as $termStream) {
|
||||
$termStream->skipTo($prefix);
|
||||
|
||||
if ($termStream->currentTerm() !== null) {
|
||||
$this->_termsStreamQueue->put($termStream);
|
||||
}
|
||||
}
|
||||
|
||||
$this->nextTerm();
|
||||
}
|
||||
|
||||
/**
|
||||
* Scans term streams and returns next term
|
||||
*
|
||||
* @return Zend_Search_Lucene_Index_Term|null
|
||||
*/
|
||||
public function nextTerm()
|
||||
{
|
||||
while (($termStream = $this->_termsStreamQueue->pop()) !== null) {
|
||||
if ($this->_termsStreamQueue->top() === null ||
|
||||
$this->_termsStreamQueue->top()->currentTerm()->key() !=
|
||||
$termStream->currentTerm()->key()) {
|
||||
// We got new term
|
||||
$this->_lastTerm = $termStream->currentTerm();
|
||||
|
||||
if ($termStream->nextTerm() !== null) {
|
||||
// Put segment back into the priority queue
|
||||
$this->_termsStreamQueue->put($termStream);
|
||||
}
|
||||
|
||||
return $this->_lastTerm;
|
||||
}
|
||||
|
||||
if ($termStream->nextTerm() !== null) {
|
||||
// Put segment back into the priority queue
|
||||
$this->_termsStreamQueue->put($termStream);
|
||||
}
|
||||
}
|
||||
|
||||
// End of stream
|
||||
$this->_lastTerm = null;
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns term in current position
|
||||
*
|
||||
* @return Zend_Search_Lucene_Index_Term|null
|
||||
*/
|
||||
public function currentTerm()
|
||||
{
|
||||
return $this->_lastTerm;
|
||||
}
|
||||
|
||||
/**
|
||||
* Close terms stream
|
||||
*
|
||||
* Should be used for resources clean up if stream is not read up to the end
|
||||
*/
|
||||
public function closeTermsStream()
|
||||
{
|
||||
while (($termStream = $this->_termsStreamQueue->pop()) !== null) {
|
||||
$termStream->closeTermsStream();
|
||||
}
|
||||
|
||||
$this->_termsStreamQueue = null;
|
||||
$this->_lastTerm = null;
|
||||
}
|
||||
}
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to license@zend.com so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Search_Lucene
|
||||
* @subpackage Index
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id: TermStreamsPriorityQueue.php 18947 2009-11-12 11:57:17Z alexander $
|
||||
*/
|
||||
|
||||
/** Zend_Search_Lucene_Index_TermsStream_Interface */
|
||||
require_once 'Zend/Search/Lucene/Index/TermsStream/Interface.php';
|
||||
|
||||
|
||||
/**
|
||||
* @category Zend
|
||||
* @package Zend_Search_Lucene
|
||||
* @subpackage Index
|
||||
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Search_Lucene_TermStreamsPriorityQueue implements Zend_Search_Lucene_Index_TermsStream_Interface
|
||||
{
|
||||
/**
|
||||
* Array of term streams (Zend_Search_Lucene_Index_TermsStream_Interface objects)
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $_termStreams;
|
||||
|
||||
/**
|
||||
* Terms stream queue
|
||||
*
|
||||
* @var Zend_Search_Lucene_Index_TermsPriorityQueue
|
||||
*/
|
||||
protected $_termsStreamQueue = null;
|
||||
|
||||
/**
|
||||
* Last Term in a terms stream
|
||||
*
|
||||
* @var Zend_Search_Lucene_Index_Term
|
||||
*/
|
||||
protected $_lastTerm = null;
|
||||
|
||||
|
||||
/**
|
||||
* Object constructor
|
||||
*
|
||||
* @param array $termStreams array of term streams (Zend_Search_Lucene_Index_TermsStream_Interface objects)
|
||||
*/
|
||||
public function __construct(array $termStreams)
|
||||
{
|
||||
$this->_termStreams = $termStreams;
|
||||
|
||||
$this->resetTermsStream();
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset terms stream.
|
||||
*/
|
||||
public function resetTermsStream()
|
||||
{
|
||||
/** Zend_Search_Lucene_Index_TermsPriorityQueue */
|
||||
require_once 'Zend/Search/Lucene/Index/TermsPriorityQueue.php';
|
||||
|
||||
$this->_termsStreamQueue = new Zend_Search_Lucene_Index_TermsPriorityQueue();
|
||||
|
||||
foreach ($this->_termStreams as $termStream) {
|
||||
$termStream->resetTermsStream();
|
||||
|
||||
// Skip "empty" containers
|
||||
if ($termStream->currentTerm() !== null) {
|
||||
$this->_termsStreamQueue->put($termStream);
|
||||
}
|
||||
}
|
||||
|
||||
$this->nextTerm();
|
||||
}
|
||||
|
||||
/**
|
||||
* Skip terms stream up to specified term preffix.
|
||||
*
|
||||
* Prefix contains fully specified field info and portion of searched term
|
||||
*
|
||||
* @param Zend_Search_Lucene_Index_Term $prefix
|
||||
*/
|
||||
public function skipTo(Zend_Search_Lucene_Index_Term $prefix)
|
||||
{
|
||||
$termStreams = array();
|
||||
|
||||
while (($termStream = $this->_termsStreamQueue->pop()) !== null) {
|
||||
$termStreams[] = $termStream;
|
||||
}
|
||||
|
||||
foreach ($termStreams as $termStream) {
|
||||
$termStream->skipTo($prefix);
|
||||
|
||||
if ($termStream->currentTerm() !== null) {
|
||||
$this->_termsStreamQueue->put($termStream);
|
||||
}
|
||||
}
|
||||
|
||||
$this->nextTerm();
|
||||
}
|
||||
|
||||
/**
|
||||
* Scans term streams and returns next term
|
||||
*
|
||||
* @return Zend_Search_Lucene_Index_Term|null
|
||||
*/
|
||||
public function nextTerm()
|
||||
{
|
||||
while (($termStream = $this->_termsStreamQueue->pop()) !== null) {
|
||||
if ($this->_termsStreamQueue->top() === null ||
|
||||
$this->_termsStreamQueue->top()->currentTerm()->key() !=
|
||||
$termStream->currentTerm()->key()) {
|
||||
// We got new term
|
||||
$this->_lastTerm = $termStream->currentTerm();
|
||||
|
||||
if ($termStream->nextTerm() !== null) {
|
||||
// Put segment back into the priority queue
|
||||
$this->_termsStreamQueue->put($termStream);
|
||||
}
|
||||
|
||||
return $this->_lastTerm;
|
||||
}
|
||||
|
||||
if ($termStream->nextTerm() !== null) {
|
||||
// Put segment back into the priority queue
|
||||
$this->_termsStreamQueue->put($termStream);
|
||||
}
|
||||
}
|
||||
|
||||
// End of stream
|
||||
$this->_lastTerm = null;
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns term in current position
|
||||
*
|
||||
* @return Zend_Search_Lucene_Index_Term|null
|
||||
*/
|
||||
public function currentTerm()
|
||||
{
|
||||
return $this->_lastTerm;
|
||||
}
|
||||
|
||||
/**
|
||||
* Close terms stream
|
||||
*
|
||||
* Should be used for resources clean up if stream is not read up to the end
|
||||
*/
|
||||
public function closeTermsStream()
|
||||
{
|
||||
while (($termStream = $this->_termsStreamQueue->pop()) !== null) {
|
||||
$termStream->closeTermsStream();
|
||||
}
|
||||
|
||||
$this->_termsStreamQueue = null;
|
||||
$this->_lastTerm = null;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user