Zend_Search_Lucene-Overview.xml 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509
  1. <sect1 id="zend.search.lucene.overview">
  2. <title>Обзор</title>
  3. <sect2 id="zend.search.lucene.introduction">
  4. <title>Введение</title>
  5. <para>
  6. Zend_Search_Lucene является поисковым движком общего
  7. назначения для полнотекстового поиска, написанным полностью на PHP 5.
  8. Так как он хранит индекс в файловой системе и не требует наличия
  9. сервера баз данных, то дает
  10. возможность реализовать поиск практически для всех веб-сайтов, работающих
  11. под управлением PHP. Zend_Search_Lucene поддерживает следующие
  12. возможности:
  13. <!--
  14. Zend_Search_Lucene is a general purpose text search engine written entirely in PHP 5.
  15. Since it stores its index on the filesystem and does not require a database
  16. server, it can add search capabilities to almost any PHP-driven website.
  17. Zend_Search_Lucene supports the following features:
  18. -->
  19. <itemizedlist>
  20. <listitem>
  21. <para>
  22. Ранжированный поиск — более подходящие результаты возвращаются первыми
  23. <!--
  24. Ranked searching - best results returned first
  25. -->
  26. </para>
  27. </listitem>
  28. <listitem>
  29. <para>
  30. Множество типов запросов: поиск фраз, поиск с шаблонами,
  31. поиск по критерию близости, поиск по диапазону значений
  32. и т.д.
  33. <!--
  34. Many powerful query types: phrase queries, wildcard queries,
  35. proximity queries, range queries and more
  36. -->
  37. <footnote>
  38. <para>
  39. Сейчас поддерживается поиск по одному и нескольким
  40. элементам, фразам, булевы операторы и подзапросы.
  41. <!--
  42. Term, multi term, phrase queries, boolean expressions and subqueries are supported at this time.
  43. -->
  44. </para>
  45. </footnote>
  46. </para>
  47. </listitem>
  48. <listitem>
  49. <para>
  50. Поиск по определенному полю (например: заголовок, автор,
  51. содержимое)
  52. <!--
  53. Search by specific field (e.g., title, author, contents)
  54. -->
  55. </para>
  56. </listitem>
  57. </itemizedlist>
  58. Zend_Search_Lucene произошел от проекта Apache Lucene.
  59. За более подробной информацией см.
  60. <!--
  61. Zend_Search_Lucene was derived from the Apache Lucene project. For more
  62. information on Lucene, visit
  63. -->
  64. <ulink url="http://lucene.apache.org/java/docs/"/>.
  65. </para>
  66. </sect2>
  67. <sect2 id="zend.search.lucene.index-creation.documents-and-fields">
  68. <title>Объекты документа и поля<!--Document and Field Objects--></title>
  69. <para>
  70. Zend_Search_Lucene оперирует с документами как с элементарными
  71. объектами для индексации. Документ делится на именованные поля,
  72. содержащие контент, по которому может производиться поиск.
  73. <!--
  74. Zend_Search_Lucene operates with documents as atomic subjects for indexing. A document is
  75. divided into named fields, and fields have content that can be searched.
  76. -->
  77. </para>
  78. <para>
  79. Документ представлен объектом Zend_Search_Lucene_Document,
  80. этот объект содержит объекты Zend_Search_Lucene_Field,
  81. представляющие собой поля документа.
  82. <!--
  83. A document is represented by the Zend_Search_Lucene_Document object, and this object contains
  84. Zend_Search_Lucene_Field objects that represent the fields.
  85. -->
  86. </para>
  87. <para>
  88. Важно отметить, что в индекс может быть добавлена любая информация.
  89. Данные вашего приложения или метаданные могут сохраняться в
  90. полях документа и после извлекаться вместе с документом в процессе
  91. поиска.
  92. <!--
  93. It is important to note that any kind of information can be added to the index.
  94. Application-specific information or metadata can be stored in the document
  95. fields, and later retrieved with the document during search.
  96. -->
  97. </para>
  98. <para>
  99. Приложение отвественно за процесс индексации.
  100. Как следствие, проиндексированы могут быть данные из любых
  101. источников, доступных приложению. Например, это
  102. могут быть файловая система, база данных, форма HTML и т.д.
  103. <!--
  104. It is the responsibility of your application to control the indexer.
  105. This means that data can be indexed from any source
  106. that is accessible by your application. For example, this could be the
  107. filesystem, a database, an HTML form, etc.
  108. -->
  109. </para>
  110. <para>
  111. Класс <code>Zend_Search_Lucene_Field</code> предоставляет
  112. несколько статических методов для создания полей с различными
  113. характеристиками.
  114. <!--
  115. <code>Zend_Search_Lucene_Field</code> class provides several
  116. static methods to create fields with
  117. different characteristics:
  118. -->
  119. </para>
  120. <programlisting language="php"><![CDATA[<?php
  121. $doc = new Zend_Search_Lucene_Document();
  122. // Данные поля не разбиваются на лексемы,
  123. // но индексируются и полностью сохраняются в индексе.
  124. // Сохраненные данные поля могут быть получены из индекса.
  125. $doc->addField(Zend_Search_Lucene_Field::Keyword('doctype',
  126. 'autogenerated'));
  127. // Данные поля не разбиваются на лексемы и не индексируются,
  128. // но полностью сохраняются в индексе.
  129. $doc->addField(Zend_Search_Lucene_Field::UnIndexed('created',
  130. time()));
  131. // Бинарное поле, данные которого не разбиваются на лексемы и не индексируются,
  132. // но сохраняются в индексе.
  133. $doc->addField(Zend_Search_Lucene_Field::Binary('icon',
  134. $iconData));
  135. // Данные поля разбиваются на лексемы, индексируются
  136. // и полностью сохраняются в индексе.
  137. $doc->addField(Zend_Search_Lucene_Field::Text('annotation',
  138. 'Document annotation text'));
  139. // Данные поля разбиваются на лексемы и индексируются,
  140. // но не сохраняются в индексе.
  141. $doc->addField(Zend_Search_Lucene_Field::UnStored('contents',
  142. 'My document content'));
  143. ?>]]></programlisting>
  144. <para>
  145. Каждый из этх методов (исключая метод <code>Zend_Search_Lucene_Field::Binary()</code>)
  146. имеет необязательный параметр <varname>$encoding</varname>. Через него
  147. указывается кодировка для входных данных.
  148. <!--
  149. Each of these methods (excluding <code>Zend_Search_Lucene_Field::Binary()</code> method) has optional
  150. <varname>$encoding</varname> parаmeter. It specifies input data encoding.
  151. -->
  152. </para>
  153. <para>
  154. Кодировка может различаться как для документов, так и для
  155. полей в одном документе.
  156. <!--
  157. Encoding may differ for different documents as well as for different fields within one document:
  158. -->
  159. <programlisting language="php"><![CDATA[<?php
  160. $doc = new Zend_Search_Lucene_Document();
  161. $doc->addField(Zend_Search_Lucene_Field::Text('title', $title, 'iso-8859-1'));
  162. $doc->addField(Zend_Search_Lucene_Field::UnStored('contents', $contents, 'utf-8'));
  163. ?>]]></programlisting>
  164. </para>
  165. <para>
  166. Если этот параметр опущен, то используется текущая локаль.
  167. Например:
  168. <!--
  169. If encoding parameter is omitted, then current locale is used at processing time. For example:
  170. -->
  171. <programlisting language="php"><![CDATA[<?php
  172. setlocale(LC_ALL, 'de_DE.iso-8859-1');
  173. ...
  174. $doc->addField(Zend_Search_Lucene_Field::UnStored('contents', $contents));
  175. ?>]]></programlisting>
  176. </para>
  177. <para>
  178. Поля всегда сохраняются и возвращаются из индекса в кодировке
  179. UTF-8. Преобразование в UTF-8 производится автоматически.
  180. <!--
  181. Fields are always stored and returned from index in UTF-8 encoding. Conversion to UTF-8 proceeds
  182. automatically.
  183. -->
  184. </para>
  185. <para>
  186. Анализатор текста (<link linkend="zend.search.lucene.extending.analysis">см. далее</link>)
  187. может также преобразовывать текст в другие кодировки. В
  188. настоящее время используемый по умолчанию анализатор преобразует
  189. текст в кодировку 'ASCII//TRANSLIT'. Имейте в виду, что такое
  190. преобразование может зависеть от текущей локали.
  191. <!--
  192. Text analyzers (<link linkend="zend.search.lucene.extending.analysis">see below</link>) may also convert text
  193. to some other encodings. Actually, default analyzer converts text to 'ASCII//TRANSLIT' encoding.
  194. Be care with this, such translation may depend on current locale.
  195. -->
  196. </para>
  197. <para>
  198. Имена полей могут быть любыми.
  199. <!--
  200. Fields' names are defined only by your own choice.
  201. -->
  202. </para>
  203. <para>
  204. Java Lucene по умолчанию использует для поиска поле "contents".
  205. Zend_Search_Lucene по умолчанию производит поиск по всем полям,
  206. но это поведение можно изменить. За подробностями см.
  207. <link linkend="zend.search.lucene.query-language.fields">Поля для поиска</link>.
  208. <!--
  209. Java Lucene uses "contents" field as a default field to search.
  210. Zend_Search_Lucene searches through all fiels by default, but it's also possible to change this behavior.
  211. See <link linkend="zend.search.lucene.query-language.fields">"Default search field"</link> chapter for details.
  212. -->
  213. </para>
  214. </sect2>
  215. <sect2 id="zend.search.lucene.index-creation.understanding-field-types">
  216. <title>Значение типов полей<!--Understanding Field Types--></title>
  217. <itemizedlist>
  218. <listitem>
  219. <para>
  220. Поля <code>Keyword</code> полностью сохраняются и индексируются,
  221. это означает, что можно не только производить поиск в них,
  222. но и отображать их в результатах поиска.
  223. Они не делятся на отдельные слова посредством разбиения
  224. на лексемы. Нумерованные поля БД обычно преобразуются в поля Keyword
  225. в Zend_Search_Lucene.
  226. <!--
  227. <code>Keyword</code> fields are stored and indexed, meaning that they can be searched as well
  228. as displayed in search results. They are not split up into separate words by tokenization.
  229. Enumerated database fields usually translate well to Keyword fields in Zend_Search_Lucene.
  230. -->
  231. </para>
  232. </listitem>
  233. <listitem>
  234. <para>
  235. В полях <code>UnIndexed</code> нельзя производить поиск,
  236. но они возвращаются в результатах поиска. Поля timestamp,
  237. ключевые поля, пути в файловой системе и другие
  238. внешние идентификаторы — хорошие кандидаты для того, чтобы
  239. быть полями UnIndexed.
  240. <!--
  241. <code>UnIndexed</code> fields are not searchable, but they are returned with search hits. Database
  242. timestamps, primary keys, file system paths, and other external identifiers are good
  243. candidates for UnIndexed fields.
  244. -->
  245. </para>
  246. </listitem>
  247. <listitem>
  248. <para>
  249. Поля <code>Binary</code> не разбиваются на лексемы и не индексируются,
  250. но сохраняются для возвращения в результатах поиска.
  251. Они могут использоваться для хранения любых данных,
  252. закодированных в виде бинарной строки — как, например,
  253. иконки.
  254. <!--
  255. <code>Binary</code> fields are not tokenized or indexed, but are stored for retrieval with search hits.
  256. They can be used to store any data encoded as a binary string, such as an image icon.
  257. -->
  258. </para>
  259. </listitem>
  260. <listitem>
  261. <para>
  262. Поля <code>Text</code> сохраняются, разбиваются на лексемы
  263. и индексируются. Текстовые поля подходят для хранения
  264. такой информации, как темы и заголовки — в них нужно не
  265. только искать, но и возвращать с результатами поиска.
  266. <!--
  267. <code>Text</code> fields are stored, indexed, and tokenized.
  268. Text fields are appropriate for storing
  269. information like subjects and titles that need to be searchable
  270. as well as returned with search results.
  271. -->
  272. </para>
  273. </listitem>
  274. <listitem>
  275. <para>
  276. Поля <code>UnStored</code> разбиваются на лексемы и индексируются, но
  277. не сохраняются в индексе. Тексты большого объема лучше
  278. индексировать, используя этот тип поля.
  279. Хранение таких данных создает индекс, который занимает много места
  280. на диске, поэтому если нужно искать в данных, но не выводить их, то
  281. используйте поле UnStored. Поля UnStored полезны,
  282. когда используется индекс Zend_Search_Lucene в
  283. комбинации с реляционной БД. Вы можете индексировать большие
  284. поля данных для поиска с помощью UnStored и извлекать их
  285. из реляционной БД, используя отдельные поля как
  286. идентификаторы.
  287. <!--
  288. <code>UnStored</code> fields are tokenized and indexed, but not stored in the index. Large amounts of
  289. text are best indexed using this type of field. Storing data creates a larger index on
  290. disk, so if you need to search but not redisplay the data, use an UnStored field.
  291. UnStored fields are practical when using a Zend_Search_Lucene index in
  292. combination with a relational database. You can index large data fields with UnStored
  293. fields for searching, and retrieve them from your relational database by using a separate
  294. fields as an identifier.
  295. -->
  296. </para>
  297. <table>
  298. <title>Типы Zend_Search_Lucene_Field<!--Zend_Search_Lucene_Field Types--></title>
  299. <tgroup cols="5">
  300. <thead>
  301. <row>
  302. <entry>Тип поля</entry>
  303. <entry>Сохраняется</entry>
  304. <entry>Индексируется</entry>
  305. <entry>Разбивается на лексемы</entry>
  306. <entry>Бинарное</entry>
  307. </row>
  308. </thead>
  309. <tbody>
  310. <row>
  311. <entry>Keyword</entry>
  312. <entry>Да</entry>
  313. <entry>Да</entry>
  314. <entry>Нет</entry>
  315. <entry>Нет</entry>
  316. </row>
  317. <row>
  318. <entry>UnIndexed</entry>
  319. <entry>Да</entry>
  320. <entry>Нет</entry>
  321. <entry>Нет</entry>
  322. <entry>Нет</entry>
  323. </row>
  324. <row>
  325. <entry>Binary</entry>
  326. <entry>Да</entry>
  327. <entry>Нет</entry>
  328. <entry>Нет</entry>
  329. <entry>Да</entry>
  330. </row>
  331. <row>
  332. <entry>Text</entry>
  333. <entry>Да</entry>
  334. <entry>Да</entry>
  335. <entry>Да</entry>
  336. <entry>Нет</entry>
  337. </row>
  338. <row>
  339. <entry>UnStored</entry>
  340. <entry>Нет</entry>
  341. <entry>Да</entry>
  342. <entry>Да</entry>
  343. <entry>Нет</entry>
  344. </row>
  345. </tbody>
  346. </tgroup>
  347. </table>
  348. </listitem>
  349. </itemizedlist>
  350. </sect2>
  351. <sect2 id="zend.search.lucene.index-creation.html-documents">
  352. <title>HTML-документы<!--HTML documents--></title>
  353. <para>
  354. Zend_Search_Lucene предоставляет возможность парсинга HTML.
  355. Документы могут создаваться непосредственно из HTML-файла или
  356. строки.
  357. <!--
  358. Zend_Search_Lucene offers HTML parsing feature. Documents can be
  359. created directly from HTML file or string:
  360. -->
  361. <programlisting language="php"><![CDATA[<?php
  362. $doc = Zend_Search_Lucene_Document_Html::loadHTMLFile($filename);
  363. $index->addDocument($doc);
  364. ...
  365. $doc = Zend_Search_Lucene_Document_Html::loadHTML($htmlString);
  366. $index->addDocument($doc);
  367. ?>]]></programlisting>
  368. </para>
  369. <para>
  370. Класс <code>Zend_Search_Lucene_Document_Html</code> использует
  371. методы <code>DOMDocument::loadHTML()</code> и
  372. <code>DOMDocument::loadHTMLFile()</code> для парсинга исходного
  373. HTML-кода, поэтому HTML не обязательно должен быть правильно
  374. сформированным или быть XHTML. С другой стороны, он чувствителен к
  375. кодировке, указанной в теге "meta http-equiv" заголовка.
  376. <!--
  377. <code>Zend_Search_Lucene_Document_Html</code> class uses
  378. <code>DOMDocument::loadHTML()</code> and
  379. <code>DOMDocument::loadHTMLFile()</code> methods to parse source
  380. HTML, so it doesn't need HTML to be well formed or
  381. to be XHTML. From the other side it's sensitive to encoding
  382. mentioned in "meta http-equiv" header tag.
  383. -->
  384. </para>
  385. <para>
  386. Класс <code>Zend_Search_Lucene_Document_Html</code> распознает
  387. заголовок, тело документа и его мета-теги.
  388. <!--
  389. <code>Zend_Search_Lucene_Document_Html</code> class recognizes
  390. document title, body and document header meta tags.
  391. -->
  392. </para>
  393. <para>
  394. Поле 'title' будет содержать значение из /html/head/title. Оно
  395. сохраняется в индексе, разбивается на лексемы и его содержимое
  396. доступно для поиска.
  397. <!--
  398. 'title' field is actually /html/head/title value. It's stored
  399. within index, tokenized and available for search through.
  400. -->
  401. </para>
  402. <para>
  403. Поле 'body' будет содержать тело документа. Оно не включает в себя
  404. скрипты, комментарии и атрибуты тегов.
  405. <!--
  406. 'body' field is actually body content. It doesn't include scripts,
  407. comments and tags' attributes.
  408. -->
  409. </para>
  410. <para>
  411. Методы <code>loadHTML()</code> и <code>loadHTMLFile()</code> класса
  412. <code>Zend_Search_Lucene_Document_Html</code> также имеют второй
  413. необязательный аргумент. Если он установлен в true, то содержимое
  414. тела документа сохраняется в индексе и может быть получено из
  415. индекса. По умолчанию тело документа разбивается на лексемы и
  416. индексируется, но не сохраняется в индексе.
  417. <!--
  418. <code>loadHTML()</code> and <code>loadHTMLFile()</code> methods of
  419. <code>Zend_Search_Lucene_Document_Html</code> class
  420. also have second optional argument. If it's set to true, then body
  421. content is also stored within index and can
  422. be retrieved from index. Body is only tokenized and indexed, but
  423. not stored by default.
  424. -->
  425. </para>
  426. <para>
  427. К мета-тегам заголовка документа создаются дополнительные поля. При
  428. этом имя поля берется из атрибута 'name', содержимое поля - из
  429. атрибута 'content', это содержимое разбивается на лексемы,
  430. индексируется и сохраняется в индексе, и, таким образом, документы
  431. можно будет искать по их мета-тегам - например, по ключевым словам
  432. (keywords).
  433. <!--
  434. Document header meta tags produce additional document fields.
  435. Field name is taken from 'name' attribute,
  436. 'content' attribute gives field value, which is tokenized, indexed
  437. and stored, so documents may be searched by their meta tags
  438. (for example, by keywords).
  439. -->
  440. </para>
  441. <para>
  442. К сгенерированным документам можно добавлять любые другие поля.
  443. <!--
  444. Parsed documents may be extended by user with any other field:
  445. -->
  446. <programlisting language="php"><![CDATA[<?php
  447. $doc = Zend_Search_Lucene_Document_Html::loadHTML($htmlString);
  448. $doc->addField(Zend_Search_Lucene_Field::UnIndexed('created',
  449. time()));
  450. $doc->addField(Zend_Search_Lucene_Field::UnIndexed('created',
  451. time()));
  452. $doc->addField(Zend_Search_Lucene_Field::Text('annotation',
  453. 'Document annotation text'));
  454. $index->addDocument($doc);
  455. ?>]]></programlisting>
  456. </para>
  457. <para>
  458. Линки из исходного документа не добавляются в генерируемый документ,
  459. но могут быть получены через методы
  460. <code>Zend_Search_Lucene_Document_Html::getLinks()</code> и
  461. <code>Zend_Search_Lucene_Document_Html::getHeaderLinks()</code>:
  462. <!--
  463. Document links are not included into generated document, but may be
  464. retrieved with
  465. <code>Zend_Search_Lucene_Document_Html::getLinks()</code> and
  466. <code>Zend_Search_Lucene_Document_Html::getHeaderLinks()</code>
  467. methods:
  468. -->
  469. <programlisting language="php"><![CDATA[<?php
  470. $doc = Zend_Search_Lucene_Document_Html::loadHTML($htmlString);
  471. $linksArray = $doc->getLinks();
  472. $headerLinksArray = $doc->getHeaderLinks();
  473. ?>]]></programlisting>
  474. </para>
  475. </sect2>
  476. </sect1>