Zend_Search_Lucene-IndexCreation.xml 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419
  1. <sect1 id="zend.search.lucene.index-creation">
  2. <title>Индексация<!--Building Indexes--></title>
  3. <sect2 id="zend.search.lucene.index-creation.creating">
  4. <title>Создание нового индекса<!--Creating a New Index--></title>
  5. <para>
  6. Возможности по созданию и обновлению индекса
  7. реализованы в модуле Zend_Search_Lucene и Java Lucene.
  8. Вы можете использовать обе эти возможности.
  9. <!--
  10. Index creation and updating capabilities are implemented within Zend_Search_Lucene module and Java Lucene.
  11. You can use both of these capabilities.
  12. -->
  13. </para>
  14. <para>
  15. Приведенный ниже листинг кода PHP дает пример того, как
  16. индексировать файл, используя программный интерфейс Zend_Search_Lucene
  17. для индексирования.
  18. <!--
  19. The PHP code listing below provides an example of how to index a file
  20. using Zend_Search_Lucene indexing API:
  21. -->
  22. </para>
  23. <programlisting language="php"><![CDATA[<?php
  24. // Создание индекса
  25. $index = Zend_Search_Lucene::create('/data/my-index');
  26. $doc = new Zend_Search_Lucene_Document();
  27. // Сохранение URL документа для того, чтобы идентифицировать его
  28. // в результатах поиска
  29. $doc->addField(Zend_Search_Lucene_Field::Text('url', $docUrl));
  30. // Индексирование содержимого документа
  31. $doc->addField(Zend_Search_Lucene_Field::UnStored('contents', $docContent));
  32. // Добавление документа в индекс
  33. $index->addDocument($doc);
  34. ?>]]></programlisting>
  35. <para>
  36. Только что добавленные документы можно сразу извлекать из индекса.
  37. <!--
  38. Newly added documents could be immediately retrieved from an index.
  39. -->
  40. </para>
  41. </sect2>
  42. <sect2 id="zend.search.lucene.index-creation.updating">
  43. <title>Обновление индекса<!--Updating Index--></title>
  44. <para>
  45. Та же самая процедура используется при обновлении существующего
  46. индекса. Единственное отличие состоит в том, что вместо метода
  47. create() вызывается метод open():
  48. <!--
  49. The same procedure is used to update an existing index. The only difference
  50. is that the open() method is called instead of the create() method:
  51. -->
  52. </para>
  53. <programlisting language="php"><![CDATA[<?php
  54. // Открытие существующего индекса
  55. $index = Zend_Search_Lucene::open('/data/my-index');
  56. $doc = new Zend_Search_Lucene_Document();
  57. // Сохраниение URL документа для того, чтобы идентифицировать его в результатах поиска.
  58. $doc->addField(Zend_Search_Lucene_Field::Text('url', $docUrl));
  59. // Индексация содержимого документа.
  60. $doc->addField(Zend_Search_Lucene_Field::UnStored('contents', $docContent));
  61. // Добавление документа в индекс.
  62. $index->addDocument($doc);
  63. ?>]]> </programlisting>
  64. </sect2>
  65. <sect2 id="zend.search.lucene.index-creation.document-updating">
  66. <title>Обновление документов<!--Updating Documents--></title>
  67. <para>
  68. Формат файлов индекса Lucene не поддерживает обновление документов.
  69. Для обновления документ должен быть удален и добавлен снова.
  70. <!--
  71. Lucene index file format doesn't support document updating. Document should be removed and re-added to do this.
  72. -->
  73. </para>
  74. <para>
  75. Метод <code>Zend_Search_Lucene::delete()</code> оперирует с внутренним
  76. идентификатором индекса документа. Он может быть получен из результата
  77. запроса ("хит") через свойство 'id':
  78. <!--
  79. <code>Zend_Search_Lucene::delete()</code> method operates with an internal index document id. It can be retrieved
  80. from a query hit by 'id' property:
  81. -->
  82. </para>
  83. <programlisting language="php"><![CDATA[<?php
  84. $removePath = ...;
  85. $hits = $index->find('path:' . $removePath);
  86. foreach ($hits as $hit) {
  87. $index->delete($hit->id);
  88. }
  89. ?>]]></programlisting>
  90. </sect2>
  91. <sect2 id="zend.search.lucene.index-creation.counting">
  92. <title>Получение размера индекса<!--Retrieving Index size--></title>
  93. <para>
  94. В Zend_Search_Lucene есть два способа получения размера индекса.
  95. <!--
  96. There are two methods to retrieve index size in Zend_Search_Lucene.
  97. -->
  98. </para>
  99. <para>
  100. Метод <code>Zend_Search_Lucene::maxDoc()</code> возвращает число,
  101. на единицу большее, чем наибольший возможный номер документа.
  102. Фактически это общее количество документов в индексе, включая
  103. удаленные. У этого метода есть синоним -
  104. <code>Zend_Search_Lucene::count()</code>.
  105. <!--
  106. <code>Zend_Search_Lucene::maxDoc()</code> returns one greater than the largest possible document number.
  107. It's actually overall number of the documents in the index including deleted documents.
  108. So it has a synonym: <code>Zend_Search_Lucene::count()</code>.
  109. -->
  110. </para>
  111. <para>
  112. <code>Zend_Search_Lucene::numDocs()</code> возвращает общее
  113. количество не удаленных документов.
  114. <!--
  115. <code>Zend_Search_Lucene::numDocs()</code> returns the total number of non-deleted documents.
  116. -->
  117. </para>
  118. <programlisting language="php"><![CDATA[<?php
  119. $indexSize = $index->count();
  120. $documents = $index->numDocs();
  121. ?>]]></programlisting>
  122. <para>
  123. Метод <code>Zend_Search_Lucene::isDeleted($id)</code> может
  124. использоваться для проверки того, был ли документ удален.
  125. <!--
  126. <code>Zend_Search_Lucene::isDeleted($id)</code> method may be used to check if document is deleted.
  127. -->
  128. </para>
  129. <programlisting language="php"><![CDATA[<?php
  130. for ($count = 0; $count < $index->maxDoc(); $count++) {
  131. if ($index->isDeleted($count)) {
  132. echo "Document #$id is deleted.\n";
  133. }
  134. }
  135. ?>]]></programlisting>
  136. <para>
  137. При оптимизации индекса производится очищение индекса от удаленных
  138. документов и сжатие диапазона используемых идентификаторов. Поэтому
  139. внутренний идентификатор документа может изменяться
  140. <!--
  141. Index optimization removes deleted documents and squeezes documents' IDs. So internal document id may be changed.
  142. -->
  143. </para>
  144. </sect2>
  145. <sect2 id="zend.search.lucene.index-creation.optimization">
  146. <title>Оптимизация индекса<!--Index optimization--></title>
  147. <para>
  148. Индекс Lucene состоит из сегментов. Каждый сегмент является
  149. независимой порцией данных.
  150. <!--
  151. Lucene index is consist of segments. Each segment is a completely
  152. independent portion of data.
  153. -->
  154. </para>
  155. <para>
  156. Файлы сегментов индекса Lucene по своей природе не могут обновляться.
  157. Обновление сегмента требует его полной реорганизации.
  158. За подробностями см. форматы файлов индекса
  159. (<ulink url="http://lucene.apache.org/java/docs/fileformats.html">http://lucene.apache.org/java/docs/fileformats.html</ulink>).
  160. Новые документы добавляются в индекс путем создания новых сегментов.
  161. <!--
  162. Lucene index segment files can't be updated by their nature.
  163. A segment update needs full segment
  164. reorganization. See Lucene index file formats for details
  165. (<ulink url="http://lucene.apache.org/java/docs/fileformats.html">http://lucene.apache.org/java/docs/fileformats.html</ulink>).
  166. Thus new documents are added to the index by creating new segment.
  167. -->
  168. </para>
  169. <para>
  170. Увеличение числа сегментов ухудшает качество индекса,
  171. но оптимизация индекса восстанавливает его. Оптимизация сводится к
  172. объединению нескольких сегментов в один. Этот процедура также не
  173. обновляет сегменты. Она создает новый большой сегмент, который
  174. содержит новый оптимизированный сегмент вместо набора старых
  175. сегментов и обновляет список сегментов (файл 'segments').
  176. <!--
  177. Increasing number of segments reduces quality of the index,
  178. but index optimization restores it.
  179. Optimization is reduced to merging several segments into one.
  180. This process also doesn't update segments.
  181. It generates new large segment, which contains new optimized
  182. segment instead of the set of old segments,
  183. and updates segment list ('segments' file).
  184. -->
  185. </para>
  186. <para>
  187. Полная оптимизация индекса может производиться через вызов метода
  188. <code>Zend_Search_Lucene::optimize()</code>. Он объединяет все
  189. сегменты индекса в один.
  190. <!--
  191. Full index optimization can be invoked by <code>Zend_Search_Lucene::optimize()</code> call. It merges all
  192. index segments into new one:
  193. -->
  194. </para>
  195. <programlisting language="php"><![CDATA[<?php
  196. // Открытие существующего индекса
  197. $index = Zend_Search_Lucene::open('/data/my-index');
  198. // Оптимизация индекса
  199. $index->optimize();
  200. ?>]]></programlisting>
  201. <para>
  202. Автоматическая оптимизация индекса выполняется для
  203. поддержания индекса в согласованном состоянии.
  204. <!--
  205. Automatic index optimization is performed to keep index in a consistent state.
  206. -->
  207. </para>
  208. <para>
  209. Автоматическая оптимизация является итеративным процессом,
  210. управление которым производится посредством нескольких опций.
  211. В процессе этой оптимизации очень маленькие сегменты объединяются
  212. в сегменты большего размера, затем эти сегменты объединяются
  213. в еще большие и т.д.
  214. <!--
  215. Automatic optimization is an iterative process managed by several index options.
  216. It merges very small segments
  217. into larger one, then merges these larger segments into more larger and so on.
  218. -->
  219. </para>
  220. <sect3 id="zend.search.lucene.index-creation.optimization.maxbuffereddocs">
  221. <title>Опция автоматической оптимизации <emphasis>MaxBufferedDocs</emphasis><!--<emphasis>MaxBufferedDocs</emphasis> auto-optimization option--></title>
  222. <para>
  223. <emphasis>MaxBufferedDocs</emphasis> является наименьшим
  224. количеством документов, необходимым для того, чтобы
  225. документы из памяти были переписаны в новый сегмент.
  226. <!--
  227. <emphasis>MaxBufferedDocs</emphasis> is a minimal number of
  228. documents required before
  229. the buffered in-memory documents are written into a new Segment.
  230. -->
  231. </para>
  232. <para>
  233. <emphasis>MaxBufferedDocs</emphasis> может быть получен или
  234. установлен через методы <varname>$index->getMaxBufferedDocs()</varname>
  235. и <varname>$index->setMaxBufferedDocs($maxBufferedDocs)</varname>
  236. соответственно.
  237. <!--
  238. <emphasis>MaxBufferedDocs</emphasis> can be retrieved or set by
  239. <varname>$index->getMaxBufferedDocs()</varname> or
  240. <varname>$index->setMaxBufferedDocs($maxBufferedDocs)</varname> calls.
  241. -->
  242. </para>
  243. <para>
  244. Значение опции по умолчанию равно 10.
  245. <!--
  246. Default value is 10.
  247. -->
  248. </para>
  249. </sect3>
  250. <sect3 id="zend.search.lucene.index-creation.optimization.maxmergedocs">
  251. <title>Опция автоматической оптимизации <emphasis>MaxMergeDocs</emphasis><!--<emphasis>MaxMergeDocs</emphasis> auto-optimization option--></title>
  252. <para>
  253. <emphasis>MaxMergeDocs</emphasis> является наибольшим количеством
  254. документов при достижении которого они всегда объединяются
  255. методом addDocument().
  256. Меньшие значения (т.е. меньше, чем 10.000) являются наилучшими для
  257. интерактивной индексации, так как ограничивает продолжительность
  258. пауз в течение индексации до нескольких секунд.
  259. Большие значения являются наилучшими для пакетной индексации и
  260. более быстрого поиска.
  261. <!--
  262. <emphasis>MaxMergeDocs</emphasis> is a largest number of documents
  263. ever merged by addDocument().
  264. Small values (e.g., less than 10.000) are best for interactive
  265. indexing, as this limits the length
  266. of pauses while indexing to a few seconds. Larger values are
  267. best for batched indexing and speedier
  268. searches.
  269. -->
  270. </para>
  271. <para>
  272. <emphasis>MaxMergeDocs</emphasis> может быть получен или
  273. установлен через методы <varname>$index->getMaxMergeDocs()</varname>
  274. и <varname>$index->setMaxMergeDocs($maxMergeDocs)</varname>
  275. соответственно.
  276. <!--
  277. <emphasis>MaxMergeDocs</emphasis> can be retrieved or set by
  278. <varname>$index->getMaxMergeDocs()</varname> or
  279. <varname>$index->setMaxMergeDocs($maxMergeDocs)</varname> calls.
  280. -->
  281. </para>
  282. <para>
  283. Значение опции по умолчанию равно PHP_INT_MAX.
  284. <!--
  285. Default value is PHP_INT_MAX.
  286. -->
  287. </para>
  288. </sect3>
  289. <sect3 id="zend.search.lucene.index-creation.optimization.mergefactor">
  290. <title>Опция автоматической оптимизации <emphasis>MergeFactor</emphasis><!--<emphasis>MergeFactor</emphasis> auto-optimization option--></title>
  291. <para>
  292. <emphasis>MergeFactor</emphasis> определяет, как часто
  293. сегменты индекса объединяются с помощью addDocument().
  294. Чем менше значение, тем меньше и объем
  295. оперативной памяти, используемой в процессе индексации, и поиск
  296. по неоптимизированному индексу производится быстрее,
  297. но скорость индексации снижается. Чем больше значение,
  298. тем больше и объем используемой оперативной памяти,
  299. и индексация производится быстрее,
  300. в то время как поиск по неоптимизированному индексу производится медленнее.
  301. Таким образом, большие значения (&gt; 10) являются наилучшими
  302. в случае пакетной индексации, а меньшие (&lt; 10) —
  303. для индексов, которые поддерживаются интерактивно.
  304. <!--
  305. <emphasis>MergeFactor</emphasis> determines how often segment
  306. indices are merged by addDocument().
  307. With smaller values, less RAM is used while indexing, and
  308. searches on unoptimized indices are faster,
  309. but indexing speed is slower. With larger values, more RAM is
  310. used during indexing, and while searches
  311. on unoptimized indices are slower, indexing is faster. Thus
  312. larger values (&gt; 10) are best for batch
  313. index creation, and smaller values (&lt; 10) for indices that
  314. are interactively maintained.
  315. -->
  316. </para>
  317. <para>
  318. <emphasis>MergeFactor</emphasis> является хорошим средством
  319. оценки среднего количества сегментов, объединяемых в одном
  320. прохождении автоматической оптимизации. Слишком большие значения
  321. приводят к созданию большого количества сегментов то того, как
  322. они объединятся в один новый. Это может вызвать
  323. сообщение об ошибке "failed to open stream: Too many open files".
  324. Данное ограничение зависит от операционной системы.
  325. <!--
  326. <emphasis>MergeFactor</emphasis> is a good estimation for average
  327. number of segments merged by one auto-optimization pass.
  328. Too large values produce large number of segments while they are
  329. not merged into new one. It may be a cause of
  330. "failed to open stream: Too many open files" error message.
  331. This limitation is system dependant.
  332. -->
  333. </para>
  334. <para>
  335. <emphasis>MergeFactor</emphasis> может быть получен или
  336. установлен через методы <varname>$index->getMergeFactor()</varname>
  337. и <varname>$index->setMergeFactor($mergeFactor)</varname>
  338. соответственно.
  339. <!--
  340. <emphasis>MergeFactor</emphasis> can be retrieved or set by
  341. <varname>$index->getMergeFactor()</varname> or
  342. <varname>$index->setMergeFactor($mergeFactor)</varname> calls.
  343. -->
  344. </para>
  345. <para>
  346. Значение опции по умолчанию равно 10.
  347. <!--
  348. Default value is 10.
  349. -->
  350. </para>
  351. <para>
  352. Lucene Java и Luke (Lucene Index Toolbox -
  353. <ulink url="http://www.getopt.org/luke/">http://www.getopt.org/luke/</ulink>)
  354. также могут использоваться для оптимизации индекса.
  355. <!--
  356. Lucene Java and Luke (Lucene Index Toolbox - <ulink url="http://www.getopt.org/luke/">http://www.getopt.org/luke/</ulink>)
  357. can also be used to optimize index.
  358. -->
  359. </para>
  360. </sect3>
  361. </sect2>
  362. <sect2 id="zend.search.lucene.index-creation.limitations">
  363. <title>Ограничения<!--Limitationas--></title>
  364. <para>
  365. Ограничения зависят от платформы.
  366. <!--
  367. Limitations are platform dependent.
  368. -->
  369. </para>
  370. <para>
  371. Для 32-битной платформы максимальный размер индекса составляет 2Гб.
  372. <!--
  373. Maximum index size is 2GB for 32-bit platforms.
  374. -->
  375. </para>
  376. </sect2>
  377. </sect1>
  378. <!--
  379. vim:se ts=4 sw=4 et:
  380. -->