blob: d622f845674d79642cbb61160b5c8ee2b94f522f (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to version 1.0 of the Zend Framework
* license, that is bundled with this package in the file LICENSE, and
* is available through the world-wide-web at the following URL:
* http://www.zend.com/license/framework/1_0.txt. If you did not receive
* a copy of the Zend Framework license and are unable to obtain it
* through the world-wide-web, please send a note to license@zend.com
* so we can mail you a copy immediately.
*
* @package Zend_Search_Lucene
* @subpackage Search
* @copyright Copyright (c) 2005-2006 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
*/
/** 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';
/**
* @package Zend_Search_Lucene
* @subpackage Search
* @copyright Copyright (c) 2005-2006 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
*/
class Zend_Search_Lucene_Search_Query_Term extends Zend_Search_Lucene_Search_Query
{
/**
* Term to find.
*
* @var Zend_Search_Lucene_Index_Term
*/
private $_term;
/**
* Term sign.
* If true then term is required
* If false then term is prohibited.
*
* @var bool
*/
private $_sign;
/**
* Documents vector.
* Bitset or array of document IDs
* (depending from Bitset extension availability).
*
* @var mixed
*/
private $_docVector = null;
/**
* Term positions vector.
* Array: docId => array( pos1, pos2, ... )
*
* @var array
*/
private $_termPositions;
/**
* Zend_Search_Lucene_Search_Query_Term constructor
*
* @param Zend_Search_Lucene_Index_Term $term
* @param boolean $sign
*/
public function __construct( $term, $sign = true )
{
$this->_term = $term;
$this->_sign = $sign;
}
/**
* Constructs an appropriate Weight implementation for this query.
*
* @param Zend_Search_Lucene $reader
* @return Zend_Search_Lucene_Search_Weight
*/
protected function _createWeight($reader)
{
return new Zend_Search_Lucene_Search_Weight_Term($this->_term, $this, $reader);
}
/**
* Score specified document
*
* @param integer $docId
* @param Zend_Search_Lucene $reader
* @return float
*/
public function score( $docId, $reader )
{
if($this->_docVector===null) {
if (extension_loaded('bitset')) {
$this->_docVector = bitset_from_array( $reader->termDocs($this->_term) );
} else {
$this->_docVector = array_flip($reader->termDocs($this->_term));
}
$this->_termPositions = $reader->termPositions($this->_term);
$this->_initWeight($reader);
}
$match = extension_loaded('bitset') ? bitset_in($this->_docVector, $docId) :
isset($this->_docVector[$docId]);
if ($this->_sign && $match) {
return $reader->getSimilarity()->tf(count($this->_termPositions[$docId]) ) *
$this->_weight->getValue() *
$reader->norm($docId, $this->_term->field);
} else {
return 0;
}
}
}
|