writer.php.svn-base

来自「PHP 知识管理系统(基于树结构的知识管理系统), 英文原版的PHP源码。」· SVN-BASE 代码 · 共 507 行 · 第 1/2 页

SVN-BASE
507
字号
<?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-2007 Zend Technologies USA Inc. (http://www.zend.com) * @license    http://framework.zend.com/license/new-bsd     New BSD License *//** Zend_Search_Lucene_Index_SegmentWriter */require_once 'Zend/Search/Lucene/Index/SegmentWriter.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';/** * @category   Zend * @package    Zend_Search_Lucene * @subpackage Index * @copyright  Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com) * @license    http://framework.zend.com/license/new-bsd     New BSD License */class Zend_Search_Lucene_Index_Writer{    /**     * @todo Implement Analyzer substitution     * @todo Implement Zend_Search_Lucene_Storage_DirectoryRAM and Zend_Search_Lucene_Storage_FileRAM to use it for     *       temporary index files     * @todo Directory lock processing     */    /**     * Number of documents required before the buffered in-memory     * documents are written into a new Segment     *     * Default value is 10     *     * @var integer     */    public $maxBufferedDocs = 10;    /**     * Largest number of documents ever merged by addDocument().     * Small values (e.g., less than 10,000) are best for interactive indexing,     * as this limits the length of pauses while indexing to a few seconds.     * Larger values are best for batched indexing and speedier searches.     *     * Default value is PHP_INT_MAX     *     * @var integer     */    public $maxMergeDocs = PHP_INT_MAX;    /**     * Determines how often segment indices are merged by addDocument().     *     * With smaller values, less RAM is used while indexing,     * and searches on unoptimized indices are faster,     * but indexing speed is slower.     *     * With larger values, more RAM is used during indexing,     * and while searches on unoptimized indices are slower,     * indexing is faster.     *     * Thus larger values (> 10) are best for batch index creation,     * and smaller values (< 10) for indices that are interactively maintained.     *     * Default value is 10     *     * @var integer     */    public $mergeFactor = 10;    /**     * File system adapter.     *     * @var Zend_Search_Lucene_Storage_Directory     */    private $_directory = null;    /**     * Changes counter.     *     * @var integer     */    private $_versionUpdate = 0;    /**     * List of the segments, created by index writer     * Array of Zend_Search_Lucene_Index_SegmentInfo objects     *     * @var array     */    private $_newSegments = array();    /**     * List of segments to be deleted on commit     *     * @var array     */    private $_segmentsToDelete = array();    /**     * Current segment to add documents     *     * @var Zend_Search_Lucene_Index_SegmentWriter_DocumentWriter     */    private $_currentSegment = null;    /**     * Array of Zend_Search_Lucene_Index_SegmentInfo objects for this index.     *     * It's a reference to the corresponding Zend_Search_Lucene::$_segmentInfos array     *     * @var array Zend_Search_Lucene_Index_SegmentInfo     */    private $_segmentInfos;    /**     * List of indexfiles extensions     *     * @var array     */    private static $_indexExtensions = array('.cfs' => '.cfs',                                             '.fnm' => '.fnm',                                             '.fdx' => '.fdx',                                             '.fdt' => '.fdt',                                             '.tis' => '.tis',                                             '.tii' => '.tii',                                             '.frq' => '.frq',                                             '.prx' => '.prx',                                             '.tvx' => '.tvx',                                             '.tvd' => '.tvd',                                             '.tvf' => '.tvf',                                             '.del' => '.del',                                             '.sti' => '.sti' );    /**     * Opens the index for writing     *     * IndexWriter constructor needs Directory as a parameter. It should be     * a string with a path to the index folder or a Directory object.     * Second constructor parameter create is optional - true to create the     * index or overwrite the existing one.     *     * @param Zend_Search_Lucene_Storage_Directory $directory     * @param array $segmentInfos     * @param boolean $create     */    public function __construct(Zend_Search_Lucene_Storage_Directory $directory, &$segmentInfos, $create = false)    {        $this->_directory    = $directory;        $this->_segmentInfos = &$segmentInfos;        if ($create) {            foreach ($this->_directory->fileList() as $file) {                if ($file == 'deletable' ||                    $file == 'segments'  ||                    isset(self::$_indexExtensions[ substr($file, strlen($file)-4)]) ||                    preg_match('/\.f\d+$/i', $file) /* matches <segment_name>.f<decimal_nmber> file names */) {                        $this->_directory->deleteFile($file);                    }            }            $segmentsFile = $this->_directory->createFile('segments');            $segmentsFile->writeInt((int)0xFFFFFFFF);            // write version (is initialized by current time            // $segmentsFile->writeLong((int)microtime(true));            $version = microtime(true);            $segmentsFile->writeInt((int)($version/((double)0xFFFFFFFF + 1)));            $segmentsFile->writeInt((int)($version & 0xFFFFFFFF));            // write name counter            $segmentsFile->writeInt(0);            // write segment counter            $segmentsFile->writeInt(0);            $deletableFile = $this->_directory->createFile('deletable');            // write counter            $deletableFile->writeInt(0);        } else {            $segmentsFile = $this->_directory->getFileObject('segments');            $format = $segmentsFile->readInt();            if ($format != (int)0xFFFFFFFF) {                throw new Zend_Search_Lucene_Exception('Wrong segments file format');            }        }    }    /**     * Adds a document to this index.     *     * @param Zend_Search_Lucene_Document $document     */    public function addDocument(Zend_Search_Lucene_Document $document)    {        if ($this->_currentSegment === null) {            $this->_currentSegment =                new Zend_Search_Lucene_Index_SegmentWriter_DocumentWriter($this->_directory, $this->_newSegmentName());        }        $this->_currentSegment->addDocument($document);        if ($this->_currentSegment->count() >= $this->maxBufferedDocs) {            $this->commit();        }        $this->_versionUpdate++;        $this->_maybeMergeSegments();    }    /**     * Merge segments if necessary     */    private function _maybeMergeSegments()    {        $segmentSizes = array();        foreach ($this->_segmentInfos as $segId => $segmentInfo) {            $segmentSizes[$segId] = $segmentInfo->count();        }        $mergePool   = array();        $poolSize    = 0;        $sizeToMerge = $this->maxBufferedDocs;        asort($segmentSizes, SORT_NUMERIC);        foreach ($segmentSizes as $segId => $size) {            // Check, if segment comes into a new merging block            while ($size >= $sizeToMerge) {                // Merge previous block if it's large enough                if ($poolSize >= $sizeToMerge) {                    $this->_mergeSegments($mergePool);                }                $mergePool   = array();                $poolSize    = 0;

⌨️ 快捷键说明

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