Zend_Search_Lucene-Extending.xml 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690
  1. <sect1 id="zend.search.lucene.extending">
  2. <title>Расширяемость<!--Extensibility--></title>
  3. <sect2 id="zend.search.lucene.extending.analysis">
  4. <title>Анализ текста<!--Text Analysis--></title>
  5. <para>
  6. Класс <code>Zend_Search_Lucene_Analysis_Analyzer</code> используется
  7. индексатором для разбиения текстовых полей документа на лексемы.
  8. <!--
  9. <code>Zend_Search_Lucene_Analysis_Analyzer</code> class is used by indexer to tokenize document
  10. text fields.
  11. -->
  12. </para>
  13. <para>
  14. Методы
  15. <code>Zend_Search_Lucene_Analysis_Analyzer::getDefault()</code> и
  16. <code>Zend_Search_Lucene_Analysis_Analyzer::setDefault()</code>
  17. используются для получения и установки анализатора по умолчанию.
  18. <!--
  19. <code>Zend_Search_Lucene_Analysis_Analyzer::getDefault()</code> and <code>
  20. Zend_Search_Lucene_Analysis_Analyzer::setDefault()</code> methods are used
  21. to get and set default analyzer.
  22. -->
  23. </para>
  24. <para>
  25. Таким образом, вы можете устанавливать собственный анализатор текста
  26. или выбирать его из ряда предопределенных анализаторов:
  27. <code>Zend_Search_Lucene_Analysis_Analyzer_Common_Text</code> и
  28. <code>Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive</code>
  29. (по умолчанию). Оба интерпретируют лексему как последовательность
  30. букв. <code>Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive</code>
  31. приводит лексемы к нижнему регистру.
  32. <!--
  33. Thus you can assign your own text analyzer or choose it from the set of predefined analyzers:
  34. <code>Zend_Search_Lucene_Analysis_Analyzer_Common_Text</code> and
  35. <code>Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive</code> (default).
  36. Both of them interpret token as a sequence of letters.
  37. <code>Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive</code>
  38. converts tokens to lower case.
  39. -->
  40. </para>
  41. <para>
  42. Переключение между анализаторами:
  43. <!--
  44. To switch between analyzers:
  45. -->
  46. </para>
  47. <programlisting language="php"><![CDATA[<?php
  48. Zend_Search_Lucene_Analysis_Analyzer::setDefault(
  49. new Zend_Search_Lucene_Analysis_Analyzer_Common_Text());
  50. ...
  51. $index->addDocument($doc);]]></programlisting>
  52. <para>
  53. <code>Zend_Search_Lucene_Analysis_Analyzer_Common</code>
  54. спроектирован для того, чтобы быть родительским классом для всех
  55. анализаторов, определяемых пользователем. В наследующем классе
  56. достаточно определить методы <code>reset()</code> и
  57. <code>nextToken()</code>, которые берут строку из свойства $_input
  58. и возвращают лексемы шаг за шагом (<constant>NULL</constant> означает конец
  59. потока).
  60. <!--
  61. <code>Zend_Search_Lucene_Analysis_Analyzer_Common</code> is designed to be a parent for all user
  62. defined analyzers. User should only define the <code>reset()</code> and <code>nextToken()</code> methods,
  63. which take string from $_input member and returns tokens step by step
  64. (<constant>NULL</constant> indicates end of stream).
  65. -->
  66. </para>
  67. <para>
  68. Метод <code>nextToken()</code> должен использовать метод
  69. <code>normalize()</code> для каждой лексемы. Это позволит
  70. использовать фильтры лексем с вашим анализатором.
  71. <!--
  72. The <code>nextToken()</code> method should apply the <code>normalize()</code> method to each
  73. token. It will allow you to use token filters with your analyzer.
  74. -->
  75. </para>
  76. <para>
  77. Ниже приведен пример пользовательского анализатора, котрорый
  78. принимает слова с цифрами как элементы:
  79. <!--
  80. Here is an example of a custom Analyzer, which takes words with digits as terms:
  81. -->
  82. <example>
  83. <title>Собственный анализатор текста<!--Custom text Analyzer.--></title>
  84. <programlisting language="php"><![CDATA[<?php
  85. /** Это созданный пользователем текстовый анализатор, который интерпретирует слова с цифрами как один элемент. */
  86. /** Zend_Search_Lucene_Analysis_Analyzer hierarchy */
  87. require_once 'Zend/Search/Lucene/Analysis/Analyzer.php';
  88. class My_Analyzer extends Zend_Search_Lucene_Analysis_Analyzer_Common
  89. {
  90. private $_position;
  91. /**
  92. * Установка позиции в начальное состояние
  93. */
  94. public function reset()
  95. {
  96. $this->_position = 0;
  97. }
  98. /**
  99. * API для разбиения на лексемы
  100. * Получение следующей лексемы
  101. * Возвращает null, если достигнут конец потока
  102. *
  103. * @return Zend_Search_Lucene_Analysis_Token|null
  104. */
  105. public function nextToken()
  106. {
  107. if ($this->_input === null) {
  108. return null;
  109. }
  110. while ($this->_position < strlen($this->_input)) {
  111. // пропуск пробела
  112. while ($this->_position < strlen($this->_input) &&
  113. !ctype_alnum( $this->_input[$this->_position] )) {
  114. $this->_position++;
  115. }
  116. $termStartPosition = $this->_position;
  117. // чтение лексемы
  118. while ($this->_position < strlen($this->_input) &&
  119. ctype_alnum( $this->_input[$this->_position] )) {
  120. $this->_position++;
  121. }
  122. // Пустая лексема, конец потока
  123. if ($this->_position == $termStartPosition) {
  124. return null;
  125. }
  126. $token = new Zend_Search_Lucene_Analysis_Token(
  127. substr($this->_input,
  128. $termStartPosition,
  129. $this->_position - $termStartPosition),
  130. $termStartPosition,
  131. $this->_position);
  132. $token = $this->normalize($token);
  133. if ($token !== null) {
  134. return $token;
  135. }
  136. // Продолжение, если лексема пропущена
  137. }
  138. return null;
  139. }
  140. }
  141. Zend_Search_Lucene_Analysis_Analyzer::setDefault(
  142. new My_Analyzer());]]></programlisting>
  143. </example>
  144. </para>
  145. </sect2>
  146. <sect2 id="zend.search.lucene.extending.filters">
  147. <title>Фильтрация лексем<!--Tokens Filtering--></title>
  148. <para>
  149. Анализатор <code>Zend_Search_Lucene_Analysis_Analyzer_Common</code>
  150. также предоставляет механизм фильтрации лексем.
  151. <!--
  152. <code>Zend_Search_Lucene_Analysis_Analyzer_Common</code> analyzer also offers tokens filtering
  153. mechanism.
  154. -->
  155. </para>
  156. <para>
  157. Класс <code>Zend_Search_Lucene_Analysis_TokenFilter</code> является
  158. уровнем абстракции для таких фильтров. Он должен использоваться как
  159. предок для ваших собственных фильтров.
  160. <!--
  161. <code>Zend_Search_Lucene_Analysis_TokenFilter</code> class is an abstract level for such filters.
  162. It should be used as an ancestor for your own filters.
  163. -->
  164. </para>
  165. <para>
  166. Пользовательские фильтры должны реализовать метод
  167. <code>normalize()</code>, который может преобразовывать лексему или
  168. сигнализировать, что лексема должна быть пропущена.
  169. <!--
  170. Custom filter must implement <code>normalize()</code> method which may transform input token or signal that
  171. token should be skipped.
  172. -->
  173. </para>
  174. <para>
  175. В предоставляемом анализаторе уже определены три фильтра:
  176. <!--
  177. There are three filters already defined in Analysis subpackage:
  178. -->
  179. <itemizedlist>
  180. <listitem>
  181. <para>
  182. <code>Zend_Search_Lucene_Analysis_TokenFilter_LowerCase</code>
  183. <!--
  184. <code>Zend_Search_Lucene_Analysis_TokenFilter_LowerCase</code> filter.
  185. -->
  186. </para>
  187. </listitem>
  188. <listitem>
  189. <para>
  190. <code>Zend_Search_Lucene_Analysis_TokenFilter_ShortWords</code>
  191. <!--
  192. <code>Zend_Search_Lucene_Analysis_TokenFilter_ShortWords</code> filter.
  193. -->
  194. </para>
  195. </listitem>
  196. <listitem>
  197. <para>
  198. <code>Zend_Search_Lucene_Analysis_TokenFilter_StopWords</code>
  199. <!--
  200. <code>Zend_Search_Lucene_Analysis_TokenFilter_StopWords</code> filter.
  201. -->
  202. </para>
  203. </listitem>
  204. </itemizedlist>
  205. </para>
  206. <para>
  207. Фильтр <code>LowerCase</code> уже используется для анализатора
  208. <code>Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive</code>,
  209. который применяется по умолчанию.
  210. <!--
  211. <code>LowerCase</code> filter is already used for
  212. <code>Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive</code> analyzer
  213. which is default.
  214. -->
  215. </para>
  216. <para>
  217. <code>ShortWords</code> и <code>StopWords</code> могут
  218. использоваться с уже включенными анализаторами или вашими
  219. собственными:
  220. <!--
  221. <code>ShortWords</code> and <code>StopWords</code> may be used with already defined or your own
  222. analyzers like this:
  223. -->
  224. </para>
  225. <programlisting language="php"><![CDATA[<?php
  226. $stopWords = array('a', 'an', 'at', 'the', 'and', 'or', 'is', 'am');
  227. $stopWordsFilter = new Zend_Search_Lucene_Analysis_TokenFilter_StopWords($stopWords);
  228. $analyzer = new Zend_Search_Lucene_Analysis_Analyzer_Common_TextNum_CaseInsensitive();
  229. $analyzer->addFilter($stopWordsFilter);
  230. Zend_Search_Lucene_Analysis_Analyzer::setDefault($analyzer);]]></programlisting>
  231. <programlisting language="php"><![CDATA[<?php
  232. $shortWordsFilter = new Zend_Search_Lucene_Analysis_TokenFilter_ShortWords();
  233. $analyzer = new Zend_Search_Lucene_Analysis_Analyzer_Common_TextNum_CaseInsensitive();
  234. $analyzer->addFilter($shortWordsFilter);
  235. Zend_Search_Lucene_Analysis_Analyzer::setDefault($analyzer);]]></programlisting>
  236. <para>
  237. Конструктор
  238. <code>Zend_Search_Lucene_Analysis_TokenFilter_StopWords</code>
  239. принимает массив стоп-слов в качестве аргумента. Но стоп-слова можно
  240. также загружать и из файла:
  241. <!--
  242. <code>Zend_Search_Lucene_Analysis_TokenFilter_StopWords</code> constructor takes an array of stop-words
  243. as an input. But stop-words may be also loaded from a file:
  244. -->
  245. </para>
  246. <programlisting language="php"><![CDATA[<?php
  247. $stopWordsFilter = new Zend_Search_Lucene_Analysis_TokenFilter_StopWords();
  248. $stopWordsFilter->loadFromFile($my_stopwords_file);
  249. $analyzer = new Zend_Search_Lucene_Analysis_Analyzer_Common_TextNum_CaseInsensitive();
  250. $analyzer->addFilter($stopWordsFilter);
  251. Zend_Search_Lucene_Analysis_Analyzer::setDefault($analyzer);]]></programlisting>
  252. <para>
  253. Файл должен быть текстовым с одним словом в каждой строке. Символом
  254. '#' помечаются строки с комментариями.
  255. <!--
  256. File should be a common text file with one word in each string. '#' marks string as a comment.
  257. -->
  258. </para>
  259. <para>
  260. Конструктор
  261. <code>Zend_Search_Lucene_Analysis_TokenFilter_ShortWords</code>
  262. имеет один необязательный параметр, это ограничение длины слова.
  263. Его значение по умолчанию равно 2.
  264. <!--
  265. <code>Zend_Search_Lucene_Analysis_TokenFilter_ShortWords</code> constructor has one optional argument.
  266. It's a words length limit. Default value is 2.
  267. -->
  268. </para>
  269. </sect2>
  270. <sect2 id="zend.search.lucene.extending.scoring">
  271. <title>Алгоритмы ранжирования<!--Scoring Algorithms--></title>
  272. <para>
  273. Ранг <literal>q</literal> документа
  274. <literal>d</literal> определяется следующим образом:
  275. <!--
  276. The score of query <literal>q</literal> for document <literal>d</literal>
  277. is defined as follows:
  278. -->
  279. </para>
  280. <para>
  281. <code>score(q,d) = sum( tf(t in d) * idf(t) * getBoost(t.field in d) * lengthNorm(t.field in d) ) *
  282. coord(q,d) * queryNorm(q)</code>
  283. </para>
  284. <para>
  285. tf(t in d) - <code>Zend_Search_Lucene_Search_Similarity::tf($freq)</code>
  286. - коэффициент ранга, основанный на том, насколько часто встречается
  287. элемент или фраза в документе.
  288. <!--
  289. tf(t in d) - <code>Zend_Search_Lucene_Search_Similarity::tf($freq)</code>
  290. - a score factor based on a term or phrase's frequency in a document.
  291. -->
  292. </para>
  293. <para>
  294. idf(t) - <code>Zend_Search_Lucene_Search_SimilaritySimilarity::tf($term, $reader)</code>
  295. - коэффициент ранга для простого элемента применительно к определенному
  296. индексу.
  297. <!--
  298. idf(t) - <code>Zend_Search_Lucene_Search_SimilaritySimilarity::tf($term, $reader)</code>
  299. - a score factor for a simple term for the specified index.
  300. -->
  301. </para>
  302. <para>
  303. getBoost(t.field in d) - коэффициент усиления для поля элемента.
  304. <!--
  305. getBoost(t.field in d) - boost factor for the term field.
  306. -->
  307. </para>
  308. <para>
  309. lengthNorm($term) - значение нормализации для поля, получаемое из
  310. общего количества элементов, содержащихся в поле. Это значение
  311. хранится внутри индекса. Эти значения вместе с коэффициентом усиления поля
  312. хранятся в индексе, результатом их умножения является
  313. ранг для каждого поля.
  314. <!--
  315. lengthNorm($term) - the normalization value for a field given the total
  316. number of terms contained in a field. This value is stored within the index.
  317. These values, together with field boosts, are stored in an index and multiplied
  318. into scores for hits on each field by the search code.
  319. -->
  320. </para>
  321. <para>
  322. Совпадения в длинных полях менее точны, поэтому реализации этого метода
  323. обычно возвращают тем меньшие значения, чем
  324. больше число лексем, и тем большие значения, чем меньше число лексем.
  325. <!--
  326. Matches in longer fields are less precise, so implementations of this method
  327. usually return smaller values when numTokens is large, and larger values when numTokens is small.
  328. -->
  329. </para>
  330. <para>
  331. сoord(q,d) - <code>Zend_Search_Lucene_Search_Similarity::coord($overlap, $maxOverlap)</code>
  332. - коэффициент ранга, основанный на относительной доле всех элементов запроса,
  333. найденных в документе.
  334. <!--
  335. coord(q,d) - <code>Zend_Search_Lucene_Search_Similarity::coord($overlap, $maxOverlap)</code> - a
  336. score factor based on the fraction of all query terms that a document contains.
  337. -->
  338. </para>
  339. <para>
  340. Присутствие большого количества элементов запроса означает лучшее
  341. соответствие запросу, поэтому реализации этого метода обычно возвращают
  342. бОльшие значения, когда соотношение между этими параметрами большое
  343. и меньшие значения, когда соотношение между ними небольшое.
  344. <!--
  345. The presence of a large portion of the query terms indicates a better match
  346. with the query, so implementations of this method usually return larger values
  347. when the ratio between these parameters is large and smaller values when
  348. the ratio between them is small.
  349. -->
  350. </para>
  351. <para>
  352. queryNorm(q) - значение нормализации для запроса, получаемое из суммы
  353. возведенных в квадрат весов каждого из элементов запроса. Это значение
  354. затем умножается в вес каждого элемента запроса.
  355. <!--
  356. queryNorm(q) - the normalization value for a query given the sum of the squared weights
  357. of each of the query terms. This value is then multiplied into the weight of each query
  358. term.
  359. -->
  360. </para>
  361. <para>
  362. Это не влияет на ранжирование, цель нормализации состоит в том, чтобы
  363. сделать соизмеримыми ранги, полученные при различных запросах.
  364. <!--
  365. This does not affect ranking, but rather just attempts to make scores from different
  366. queries comparable.
  367. -->
  368. </para>
  369. <para>
  370. Алгоритм ранжирования может быть изменен через определение своего
  371. собственного класса. Для этого надо создать потомка класса
  372. Zend_Search_Lucene_Search_Similarity, как показано ниже, затем
  373. использовать метод
  374. <code>Zend_Search_Lucene_Search_Similarity::setDefault($similarity);</code>
  375. для установки объекта как используемого по умолчанию.
  376. <!--
  377. Scoring algorithm can be customized by defining your own Similarity class. To do this
  378. extend Zend_Search_Lucene_Search_Similarity class as defined below, then use
  379. <code>Zend_Search_Lucene_Search_Similarity::setDefault($similarity);</code> method to set it as default.
  380. -->
  381. </para>
  382. <programlisting language="php"><![CDATA[<?php
  383. class MySimilarity extends Zend_Search_Lucene_Search_Similarity {
  384. public function lengthNorm($fieldName, $numTerms) {
  385. return 1.0/sqrt($numTerms);
  386. }
  387. public function queryNorm($sumOfSquaredWeights) {
  388. return 1.0/sqrt($sumOfSquaredWeights);
  389. }
  390. public function tf($freq) {
  391. return sqrt($freq);
  392. }
  393. /**
  394. * Сейчас не используется. Подсчитывает сумму соответствий неточной фразе,
  395. * основанную на изменяемом расстоянии.
  396. */
  397. public function sloppyFreq($distance) {
  398. return 1.0;
  399. }
  400. public function idfFreq($docFreq, $numDocs) {
  401. return log($numDocs/(float)($docFreq+1)) + 1.0;
  402. }
  403. public function coord($overlap, $maxOverlap) {
  404. return $overlap/(float)$maxOverlap;
  405. }
  406. }
  407. $mySimilarity = new MySimilarity();
  408. Zend_Search_Lucene_Search_Similarity::setDefault($mySimilarity);
  409. ?>]]> </programlisting>
  410. </sect2>
  411. <sect2 id="zend.search.lucene.extending.storage">
  412. <title>Контейнеры хранения<!--Storage Containers--></title>
  413. <para>
  414. Абстрактный класс <code>Zend_Search_Lucene_Storage_Directory</code>
  415. определяет функционал директории.
  416. <!--
  417. An abstract class <code>Zend_Search_Lucene_Storage_Directory</code> defines
  418. directory functionality.
  419. -->
  420. </para>
  421. <para>
  422. Конструктор <code>Zend_Search_Lucene</code> использует строку или
  423. объект <code>Zend_Search_Lucene_Storage_Directory</code> как входные данные.
  424. <!--
  425. The <code>Zend_Search_Lucene</code> constructor uses either a string or a
  426. <code>Zend_Search_Lucene_Storage_Directory</code> object
  427. as an input.
  428. -->
  429. </para>
  430. <para>
  431. <code>Zend_Search_Lucene_Storage_Directory_Filesystem</code> реализует
  432. функционал директории для файловой системы.
  433. <!--
  434. <code>Zend_Search_Lucene_Storage_Directory_Filesystem</code> class implements directory
  435. functionality for file system.
  436. -->
  437. </para>
  438. <para>
  439. Если для конструктора <code>Zend_Search_Lucene</code> в качестве входных
  440. данных испольуется строка, то считыватель индекса (объект
  441. <code>Zend_Search_Lucene</code>) рассматривает ее как путь в файловой
  442. системе и сама инстанцирует объекты
  443. <code>Zend_Search_Lucene_Storage_Directory_Filesystem</code>.
  444. <!--
  445. If a string is used as an input for the <code>Zend_Search_Lucene</code> constructor, then the index
  446. reader (<code>Zend_Search_Lucene</code> object) treats it as a file system path and instantiates
  447. <code>Zend_Search_Lucene_Storage_Directory_Filesystem</code> objects by themselves.
  448. -->
  449. </para>
  450. <para>
  451. Вы можете определить собственную реализацию директории,
  452. создав потомка класса <code>Zend_Search_Lucene_Storage_Directory</code>.
  453. <!--
  454. You can define your own directory implementation by extending the
  455. <code>Zend_Search_Lucene_Storage_Directory</code> class.
  456. -->
  457. </para>
  458. <para>
  459. Методы <code>Zend_Search_Lucene_Storage_Directory</code>:
  460. <!--
  461. <code>Zend_Search_Lucene_Storage_Directory</code> methods:
  462. -->
  463. </para>
  464. <programlisting><![CDATA[<?php
  465. abstract class Zend_Search_Lucene_Storage_Directory {
  466. /**
  467. * Закрывает средство хранения.
  468. *
  469. * @return void
  470. */
  471. abstract function close();
  472. /**
  473. * Создает новый пустой файл с данным именем в директории.
  474. *
  475. * @param string $name
  476. * @return void
  477. */
  478. abstract function createFile($filename);
  479. /**
  480. * Удаляет существующий файл в директории.
  481. *
  482. * @param string $filename
  483. * @return void
  484. */
  485. abstract function deleteFile($filename);
  486. /**
  487. * Возвращает true, если файл с данным именем существует.
  488. *
  489. * @param string $filename
  490. * @return boolean
  491. */
  492. abstract function fileExists($filename);
  493. /**
  494. * Возвращает длину файла в директории.
  495. *
  496. * @param string $filename
  497. * @return integer
  498. */
  499. abstract function fileLength($filename);
  500. /**
  501. * Возвращает время последнего изменения файла в формате UNIX.
  502. *
  503. * @param string $filename
  504. * @return integer
  505. */
  506. abstract function fileModified($filename);
  507. /**
  508. * Переименовывает существующий файл в директории.
  509. *
  510. * @param string $from
  511. * @param string $to
  512. * @return void
  513. */
  514. abstract function renameFile($from, $to);
  515. /**
  516. * Устанавливает время изменения файла в текущее.
  517. *
  518. * @param string $filename
  519. * @return void
  520. */
  521. abstract function touchFile($filename);
  522. /**
  523. * Возвращает объект Zend_Search_Lucene_Storage_File для данного файла в директории.
  524. *
  525. * @param string $filename
  526. * @return Zend_Search_Lucene_Storage_File
  527. */
  528. abstract function getFileObject($filename);
  529. }
  530. ?>]]></programlisting>
  531. <para>
  532. Метод <code>getFileObject($filename)</code> класса
  533. <code>Zend_Search_Lucene_Storage_Directory</code> возвращает
  534. объект <code>Zend_Search_Lucene_Storage_File</code>.
  535. <!--
  536. <code>getFileObject($filename)</code> method of <code>Zend_Search_Lucene_Storage_Directory</code>
  537. class returns a <code>Zend_Search_Lucene_Storage_File</code> object.
  538. -->
  539. </para>
  540. <para>
  541. Абстрактный класс <code>Zend_Search_Lucene_Storage_File</code> реализует
  542. абстракцию файла и примитивы чтения файла индекса.
  543. <!--
  544. <code>Zend_Search_Lucene_Storage_File</code> abstract class implements file abstraction and index
  545. file reading primitives.
  546. -->
  547. </para>
  548. <para>
  549. Вы должны создать класс, наследующий от <code>Zend_Search_Lucene_Storage_File</code>
  550. для своей реализации директории.
  551. <!--
  552. You must also extend <code>Zend_Search_Lucene_Storage_File</code> for your Directory implementation.
  553. -->
  554. </para>
  555. <para>
  556. Только два метода класса <code>Zend_Search_Lucene_Storage_File</code> должны быть
  557. перегружены в вашей реализации:
  558. <!--
  559. Only two methods of <code>Zend_Search_Lucene_Storage_File</code> must be overloaded in your
  560. implementation:
  561. -->
  562. </para>
  563. <programlisting><![CDATA[<?php
  564. class MyFile extends Zend_Search_Lucene_Storage_File {
  565. /**
  566. * Устанавливает индикатор позиции и перемещает указатель файла.
  567. * Новая позиция, измеряемая в байтах от начала файла,
  568. * получается добавлением смещения к позиции, определяемой аргументом $whence,
  569. * который может принимать следующие значения:
  570. * SEEK_SET - Устанавливает позицию равной смещению в байтах.
  571. * SEEK_CUR - Устанавливает позицию равной текущей позиции плюс смещение.
  572. * SEEK_END - Устанавливает позицию равной концу файла плюс смещение.
  573. * (Для перемещения позиции относительно конца файла вы должны передать отрицательное значение смещения)
  574. * В случае успеха возвращает 0; иначе -1
  575. *
  576. * @param integer $offset
  577. * @param integer $whence
  578. * @return integer
  579. */
  580. public function seek($offset, $whence=SEEK_SET) {
  581. ...
  582. }
  583. /**
  584. * Считывает $length байт из файла и перемещает указатель файла.
  585. *
  586. * @param integer $length
  587. * @return string
  588. */
  589. protected function _fread($length=1) {
  590. ...
  591. }
  592. }
  593. ?>]]></programlisting>
  594. </sect2>
  595. </sect1>
  596. <!--
  597. vim:se ts=4 sw=4 et:
  598. -->