1 <sect1 id="zend.search.lucene.searching">
2 <title>Поиск по индексу<!--Searching an Index--></title>
4 <sect2 id="zend.search.lucene.searching.query_building">
5 <title>Построение запросов<!--Building Queries--></title>
8 Производить поиск по индексу можно двумя способами. Первый способ
9 использует парсер запросов для построения запросов из строки.
10 Второй способ дает возможность создавать свои запросы
11 через программный интерфейс Zend_Search_Lucene.
13 There are two ways to search the index. The first method uses
14 Query Parser to construct query from a string. The second provides
15 the ability to create your own queries through the Zend_Search_Lucene API.
20 В случае выбора парсера запросов учтите следующее:
22 Before choosing to use the provided Query Parser, please consider
29 Если вы программно генерируете строку запроса и затем парсите
30 ее с помощью парсера запросов, то вам следует серьезно подумать
31 о построении запросов непосредственно через программный интерфейс.
32 Другими словами, парсер запросов предназначен для текста, вводимого
33 пользователем, а не генерируемого программным способом.
35 If you are programmatically generating a query string and then parsing
36 it with the query parser then you should seriously consider building
37 your queries directly with the query API. In other words, the query
38 parser is designed for human-entered text, not for program-generated text.
44 Не разбитые на лексемы поля лучше добавлять непосредственно
45 в запросы, а не через парсер запросов. Если значения полей программно
46 генерируются приложением, то должны быть отдельные элементы
47 запроса для этого поля. Анализатор, используемый
48 парсером запросов, предназначен для преобразования
49 введенного пользователем текста в элементы запроса.
50 Программно генерируемые значения, такие, как даты, ключевые слова
51 и т.д., должны генерироваться единообразно.
53 Untokenized fields are best added directly to queries, and not through
54 the query parser. If a field's values are generated programmatically
55 by the application, then so should query clauses for this field.
56 An analyzer, which the query parser uses, is designed to convert
57 human-entered text to terms. Program-generated values, like dates,
58 keywords, etc., should be consistently program-generated.
64 В форме запроса поля с основным текстом должны использовать
65 парсер запросов. Все остальные, такие, как периоды времени,
66 ключевые слова и т.д, лучше добавлять непосредственно
67 через программный интерфейс для запросов. Поля с ограниченным
68 набором значений, которые могут отображаться в виде выпадающего
69 списка, лучше не добавлять в строку запроса, которая
70 парсится, а как элемент запроса.
72 In a query form, fields which are general text should use the query parser.
73 All others, such as date ranges, keywords, etc. are better added directly
74 through the query API. A field with a limit set of values, that can be
75 specified with a pull-down menu should not be added to a query string
76 which is subsequently parsed, but rather added as a TermQuery clause.
82 Булевы запросы позволяют объединять несколько запросов в
83 один. Таким образом, это является наилучшим путем
84 добавления дополнительных критериев пользовательского
85 поиска, определяемых строкой запроса.
87 Boolean queries allow to mix several other queries into new one.
88 Thus it's the best way to add some additional criteria to user search, defined by
98 Оба способа используют один и тот же метод программного интерфейса
101 Both ways use the same API method to search through the index:
105 <programlisting language="php"><![CDATA[<?php
106 require_once('Zend/Search/Lucene.php');
108 $index = Zend_Search_Lucene::open('/data/my_index');
110 $index->find($query);]]> </programlisting>
113 Метод <code>Zend_Search_Lucene::find()</code> автоматически определяет
114 тип ввода и использует парсер запросов для построения соответствующего
115 объекта Zend_Search_Lucene_Search_Query.
117 The <code>Zend_Search_Lucene::find()</code> method determines input type automatically and
118 uses query parser to construct appropriate Zend_Search_Lucene_Search_Query object
124 Важно отметить, что парсер запросов использует стандартный
125 анализатор для разбиения на лексемы отдельных частей строки запроса.
126 Таким образом, все преобразования, проделываемые с индексируемым
127 текстом, также проделываются и с частями строки запроса.
129 It is important to note that query parser uses standard analyzer to tokenize separate parts of query string.
130 Thus all transformations, which are done on indexed text are also done on query string entries.
134 Это могут быть приведение к нижнему регистру для того, чтобы сделать
135 поиск нечувствительным к регистру, удаление запрещенных слов
138 It may be transforming to lower case to make search case-insensitive, removing stop-words, stamming and
139 mauch more other things.
143 В противоположность парсеру запросов, методы API не преобразовывают
144 или фильтруют входные элементы. Таким образом, API является более
145 подходящим для сгенерированных компьютером или не разбитых на
148 As opposed to it, API method doesn't transform or filter input terms. Thus it's more suitable for
149 computer generated or untokenized fields.
153 <sect3 id="zend.search.lucene.searching.query_building.parsing">
154 <title>Парсинг запроса<!--Query parsing--></title>
156 Метод <code>Zend_Search_Lucene_Search_QueryParser::parse()</code>
157 может использоваться для парсинга строки запроса и
158 преобразования ее в объект запроса.
160 <code>Zend_Search_Lucene_Search_QueryParser::parse()</code> method may be used to parse query string
166 Этот объект может использоваться в методах программного
167 интерфейса для объединения программно сгенерированных
168 запросов с введенными пользователем.
170 This object may be used in query construction API methods to combine user entered queries with
171 machine generated queries.
176 Сейчас в некоторых случаях только таким способом можно будет
177 производить поиск значений в полях, которые не были
180 Actually, in some cases it's only way to search for values within untokenized fields:
183 <programlisting language="php"><![CDATA[<?php
184 $userQuery = Zend_Search_Lucene_Search_QueryParser::parse($queryStr);
186 $pathTerm = new Zend_Search_Lucene_Index_Term('/data/doc_dir/' . $filename, 'path');
187 $pathQuery = new Zend_Search_Lucene_Search_Query_Term($pathTerm);
189 $query = new Zend_Search_Lucene_Search_Query_Boolean();
190 $query->addSubquery($userQuery, true /* required */);
191 $query->addSubquery($pathQuery, true /* required */);
193 $hits = $index->find($query);]]></programlisting>
197 Метод <code>Zend_Search_Lucene_Search_QueryParser::parse()</code>
198 также принимает необязательный параметр, через который
199 указывается кодировка строки запроса.
201 <code>Zend_Search_Lucene_Search_QueryParser::parse()</code> method also takes optional encoding parameter,
202 which can specify query string encoding:
204 <programlisting language="php"><![CDATA[<?php
205 $userQuery = Zend_Search_Lucene_Search_QueryParser::parse($queryStr, 'iso-8859-5');]]></programlisting>
209 Если этот параметр опущен, то используется текущая локаль.
211 If encoding is omitted, then current locale is used.
216 Можно также указать используемую по умолчанию кодировку для
217 строки запроса через метод <code>Zend_Search_Lucene_Search_QueryParser::setDefaultEncoding()</code>:
219 It's also possible to specify default query string encoding with
220 <code>Zend_Search_Lucene_Search_QueryParser::setDefaultEncoding()</code> method:
222 <programlisting language="php"><![CDATA[<?php
223 Zend_Search_Lucene_Search_QueryParser::setDefaultEncoding('iso-8859-5');
225 $userQuery = Zend_Search_Lucene_Search_QueryParser::parse($queryStr);]]></programlisting>
229 <code>Zend_Search_Lucene_Search_QueryParser::getDefaultEncoding()</code>
230 возвращает используемую по умолчанию кодировку для строки
231 запроса (пустая строка означает "текущая локаль").
233 <code>Zend_Search_Lucene_Search_QueryParser::getDefaultEncoding()</code> returns current default query
234 string encoding (empty string means "current locale").
240 <sect2 id="zend.search.lucene.searching.results">
241 <title>Результаты поиска<!--Search Results--></title>
243 Результат поиска является массивом объектов
244 Zend_Search_Lucene_Search_QueryHit. Все эти объекты имеют два
245 свойства: <varname>$hit->document</varname> - номер документа в индексе,
246 <varname>$hit->score</varname> - ранг "хита" в результате поиска.
247 Результат упорядочен по рангу ("хиты" с наибольшим рангом идут
251 The search result is an array of Zend_Search_Lucene_Search_QueryHit objects. Each of these has
252 two properties: <varname>$hit->document</varname> is a document number within
253 the index and <varname>$hit->score</varname> is a score of the hit in
254 a search result. Result is ordered by score (top scores come first).
259 Объект Zend_Search_Lucene_Search_QueryHit также предоставляют все
260 поля документа Zend_Search_Lucene_Document как свойства объекта. В
261 данном примере возвращается "хит" и соответствующий ему документ
262 имеет два поля: заголовок и автор.
264 The Zend_Search_Lucene_Search_QueryHit object also exposes each field of the Zend_Search_Lucene_Document found by
265 the hit as a property of the hit. In this example, a hit is returned and
266 the corresponding document has two fields: title and author.
269 <programlisting language="php"><![CDATA[<?php
270 require_once('Zend/Search/Lucene.php');
272 $index = Zend_Search_Lucene::open('/data/my_index');
274 $hits = $index->find($query);
276 foreach ($hits as $hit) {
281 ?>]]></programlisting>
284 Сохраненные в индексе поля всегда возвращаются в кодировке UTF-8.
286 Stored fields are always returned in UTF-8 encoding.
291 Исходный объект документа Zend_Search_Lucene_Document может также
292 быть получен из Zend_Search_Lucene_Search_QueryHit. Вы можете
293 извлечь сохраненные в индексе части документа, используя метод
294 <code>getDocument()</code> объекта индекса и затем получая из через
295 метод <code>getFieldValue()</code>:
297 Optionally, the original Zend_Search_Lucene_Document object can be returned from the
298 Zend_Search_Lucene_Search_QueryHit.
300 You can retrieve stored parts of the document by using the <code>getDocument()</code>
301 method of the index object and then get them by
302 <code>getFieldValue()</code> method:
306 <programlisting language="php"><![CDATA[<?php
307 require_once('Zend/Search/Lucene.php');
309 $index = Zend_Search_Lucene::open('/data/my_index');
311 $hits = $index->find($query);
312 foreach ($hits as $hit) {
313 // возвращает объект для этого "хита"
314 echo $document = $hit->getDocument();
316 // возвращает объект Zend_Search_Lucene_Field
317 // из Zend_Search_Lucene_Document
318 echo $document->getField('title');
320 // возвращает строковое значение объекта Zend_Search_Lucene_Field
321 echo $document->getFieldValue('title');
323 // делает то же самое, что и getFieldValue()
324 echo $document->title;
326 ?>]]></programlisting>
329 Поля, доступные через объект Zend_Search_Lucene_Document, определяются
330 во время индексирования. Поля документа либо только индексируются, либо
331 индексируются и сохраняются в индексе индесирующим приложением
332 (например, LuceneIndexCreation.jar).
334 The fields available from the Zend_Search_Lucene_Document object are determined at
335 the time of indexing. The document fields are either indexed, or
336 index and stored, in the document by the indexing application
337 (e.g. LuceneIndexCreation.jar).
342 Обратите внимание, что идентификатор документа (в нашем примере — 'path')
343 также сохраняется в индексе и должен извлекаться из него.
345 Pay attention, that document identity ('path' in our example) is also stored
346 in the index and must be retrieved from them.
353 <sect2 id="zend.search.lucene.searching.results-scoring">
354 <title>Ранжирование результата<!--Results Scoring--></title>
356 Zend_Search_Lucene использует тот же самый алгоритм ранжирования,
357 что и Java Lucene. Результаты поиска по умолчанию сортируются по
358 рангу (релевантности). "Хиты" с наибольшим рангом идут первыми, и
359 документы, имеющие больший ранг, болльше соответствуют запросу, чем
360 документы с меньшим рангом.
362 Zend_Search_Lucene uses the same scoring algorithms as Java Lucene.
363 Hits in search result are ordered by score by default. Hits with greater score come first, and
364 documents having higher scores match the query more than documents having lower scores.
369 Приблизительно говоря, документы, в которых искомый элемент или фраза
370 встречаются чаще, будут иметь более высокий ранг.
372 Roughly speaking, search hits that contain the searched term or phrase more frequently
373 will have a higher score.
378 Число, соответствующее рангу, может быть получено через
379 свойство <code>score</code>:
381 Score can be retrived by <code>score</code> property of hit:
385 <programlisting language="php"><![CDATA[<?php
386 $hits = $index->find($query);
388 foreach ($hits as $hit) {
391 }]]> </programlisting>
394 Для вычисления ранга используется класс Zend_Search_Lucene_Search_Similarity.
395 За подробностями см. раздел
396 <link linkend="zend.search.lucene.extending.scoring">Расширяемость. Алгоритмы ранжирования</link>.
398 Zend_Search_Lucene_Search_Similarity class is used to calculate score.
399 See <link linkend="zend.search.lucene.extending.scoring">Extensibility. Scoring Algorithms</link> section for details.
405 <sect2 id="zend.search.lucene.searching.sorting">
406 <title>Сортировка результатов поиска<!--Search Result Sorting--></title>
408 По умолчанию результаты поиска сортируются по рангу. Вы можете
409 изменить это поведение установкой поля (полей) для сортировки, типа
410 сортировки и порядка сортировки.
412 Search result is sorted by score by default. You change this by setting a sort field (or fields), sort type
413 and sort order parameters.
418 <varname>$index->find()</varname> может принимать несколько необязательных
421 <varname>$index->find()</varname> call may take several optional parameters:
423 <programlisting language="php"><![CDATA[<?php
424 $index->find($query [, $sortField [, $sortType [, $sortOrder]]] [, $sortField2 [, $sortType [, $sortOrder]]] ...);]]></programlisting>
428 <varname>$sortField</varname> является именем сохраненного в индексе поля
429 для сортировки результата.
431 <varname>$sortField</varname> is a name of stored field to sort result.
436 <varname>$sortType</varname> может быть опущен или принимать значения
437 <code>SORT_REGULAR</code> (сравнивать элементы как обычно, значение по умолчанию),
438 <code>SORT_NUMERIC</code> (сравнивать элементы как числа),
439 <code>SORT_STRING</code> (сравнивать элементы как строки).
441 <varname>$sortType</varname> may be omitted or take values
442 <code>SORT_REGULAR</code> (compare items normally, default value),
443 <code>SORT_NUMERIC</code> (compare items numerically),
444 <code>SORT_STRING</code> (compare items as strings).
449 <varname>$sortOrder</varname> может быть опущен или принимать значения
450 <code>SORT_ASC</code> (сортировать в порядке возрастания, значение по умолчанию),
451 <code>SORT_DESC</code> (сортировать в порядке убывания).
453 <varname>$sortOrder</varname> may be omitted or take values
454 <code>SORT_ASC</code> (sort in ascending order, default value),
455 <code>SORT_DESC</code> (sort in descending order).
463 <programlisting language="php"><![CDATA[<?php
464 $index->find($query, 'quantity', SORT_NUMERIC, SORT_DESC);]]></programlisting>
465 <programlisting language="php"><![CDATA[<?php
466 $index->find($query, 'fname', SORT_STRING, 'lname', SORT_STRING);]]></programlisting>
467 <programlisting language="php"><![CDATA[<?php
468 $index->find($query, 'name', SORT_STRING, 'quantity', SORT_NUMERIC, SORT_DESC);]]></programlisting>
472 Будьте осторожны, когда используете сортировку, отличную от
473 принятой по умолчанию. Для этого нужно полное извлечение документов
474 из индекса, что может привести к резкому снижению
477 Please be careful when using non-default search order.
478 It needs to retrive documents completely from an index and may drammatically slow down search performance.
483 <sect2 id="zend.search.lucene.searching.highlighting">
484 <title>Подсветка результатов поиска<!--Search Results Highlighting--></title>
487 <code>Zend_Search_Lucene_Search_Query::highlightMatches()</code>
488 позволяет подсвечивать в HTML-документе элементы, присутствующие в
489 контексте поискового запроса:
491 <code>Zend_Search_Lucene_Search_Query::highlightMatches()</code>
492 method allows to highlight HTML document terms
493 in context of search query:
495 <programlisting language="php"><![CDATA[<?php
496 $query = Zend_Search_Lucene_Search_QueryParser::parse($queryStr);
497 $hits = $index->find($query);
499 $highlightedHTML = $query->highlightMatches($sourceHTML);]]></programlisting>
503 Метод <code>highlightMatches()</code> для обработки HTML использует
504 класс <code>Zend_Search_Lucene_Document_Html</code> (см.
505 <link linkend="zend.search.lucene.index-creation.html-documents">раздел
506 "HTML-документы"</link>). Поэтому этот метод предъявляет те же
507 требования к HTML-коду, что и используемый класс.
509 <code>highlightMatches()</code> method utilizes
510 <code>Zend_Search_Lucene_Document_Html</code> class
511 (see <link linkend="zend.search.lucene.index-creation.html-documents">HTML
512 documents section</link> for details)
513 for HTML processing. So it has the same requirements for HTML source.