<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/css" href="http://wiki2.linuxformat.ru/skins/common/feed.css?97"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki2.linuxformat.ru/index.php?action=history&amp;feed=atom&amp;title=LXF128%3ASphinx</id>
		<title>LXF128:Sphinx - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://wiki2.linuxformat.ru/index.php?action=history&amp;feed=atom&amp;title=LXF128%3ASphinx"/>
		<link rel="alternate" type="text/html" href="http://wiki2.linuxformat.ru/index.php?title=LXF128:Sphinx&amp;action=history"/>
		<updated>2026-05-13T22:21:32Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.11.1</generator>

	<entry>
		<id>http://wiki2.linuxformat.ru/index.php?title=LXF128:Sphinx&amp;diff=11517&amp;oldid=prev</id>
		<title>Crazy Rebel: викификация, оформление, иллюстрация</title>
		<link rel="alternate" type="text/html" href="http://wiki2.linuxformat.ru/index.php?title=LXF128:Sphinx&amp;diff=11517&amp;oldid=prev"/>
				<updated>2011-03-15T15:07:43Z</updated>
		
		<summary type="html">&lt;p&gt;викификация, оформление, иллюстрация&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая статья&lt;/b&gt;&lt;/p&gt;&lt;div&gt;: '''''Sphinx''''' Скоростная полнотекстовая поисковая система для вашего web-сайта&lt;br /&gt;
&lt;br /&gt;
==''Sphinx'': Найдется, что настроено==&lt;br /&gt;
&lt;br /&gt;
: Безусловно, готовый поиск по сайту от популярных поисковых систем можно добавить за несколько минут, но это не дает гибкости вашего собственного движка. '''Никита Шультайс''' представляет ''Sphinx''!&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF128_80_1.jpg|300px]]Сравнительная скорость полнотекстового поиска (мс) по 100 000 записям объемом 456 МБ. В поиске участвуют ''MySQL'' и два поисковых движка: ''Luсene'' и ''Sphinx''.|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
Для организации поиска по сайту одни web-мастеры используют сервисы от Google или Яндекса, другие делают SQL-выборку по базе данных. Мы же применим движок для полнотекстового поиска ''Sphinx'': он одинаково легко работает и с английским, и с русским языком, распространяется под лицензией GPL2 и доступен на самых популярных ОС: Linux, Windows, FreeBSD, Mac OS X. Вот некоторые его характеристики:&lt;br /&gt;
* Высокая скорость индексации (до 10 МБ/с на новых машинах).&lt;br /&gt;
* Высокая скорость поиска (0,1 с по тексту объемом 2–4 ГБ)&lt;br /&gt;
* Поддержка индекса до 100 ГБ.&lt;br /&gt;
* Поддержка ''MySQL, PostgreSQL'' и произвольных XML-данных.&lt;br /&gt;
* API доступа к индексу для большинства интерпретируемых языков: ''PHP, Python, Perl, Ruby'', а также ''Java''.&lt;br /&gt;
&lt;br /&gt;
Заинтригованы? Тогда приступим.&lt;br /&gt;
&lt;br /&gt;
===Установка===&lt;br /&gt;
&lt;br /&gt;
Установим ''Sphinx'' из исходных текстов: скачаем их с официального сайта http://www.sphinxsearch.com и дадим стандартные команды:&lt;br /&gt;
&lt;br /&gt;
 $ tar xzvf sphinx-0.9.9.tar.gz&lt;br /&gt;
 $ cd sphinx&lt;br /&gt;
 $ ./configure&lt;br /&gt;
 $ make&lt;br /&gt;
 $ make install&lt;br /&gt;
&lt;br /&gt;
Как обычно, ''configure'' может принимать еще и параметры:&lt;br /&gt;
* '''--with-mysql''' – компиляция с поддержкой ''MySQL'' (включено по умолчанию)&lt;br /&gt;
* '''--with-pgsql''' – компиляция с поддержкой ''PostgreSQL'' (выключено по умолчанию)&lt;br /&gt;
* '''--without-mysql''' – компиляция без поддержки ''MySQL''&lt;br /&gt;
&lt;br /&gt;
В своих примерах я буду использовать распространенную связку – ''MySQL'' и ''PHP'', хотя на практике работаю с ''PostreSQL'' и ''Python''.&lt;br /&gt;
&lt;br /&gt;
===Начинаем работу===&lt;br /&gt;
&lt;br /&gt;
''Sphinx'' состоит из трех основных частей:&lt;br /&gt;
* Утилита ''indexer'' – индексирует данные по заданным правилам.&lt;br /&gt;
* Демон ''searchd'' – отвечает за поиск по индексу и выдачу результатов&lt;br /&gt;
* Интерфейс доступа к ''searchd'' – консольная утилита ''search'' или библиотеки API для различных языков.&lt;br /&gt;
&lt;br /&gt;
Сперва создадим базу данных и добавим в неё таблицу с информацией, по которой и будем осуществлять поиск. С первым, думаю, вы разберетесь сами (SQL-код показан ниже), а тестовая таблица с данными есть на диске LXF. Онасодержит несколько записей из раздела «Легковые автомобили» сайта с объявлениями.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=SQL&amp;gt;&lt;br /&gt;
 CREATE TABLE auto (&lt;br /&gt;
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,&lt;br /&gt;
  name VARCHAR(255) NOT NULL,&lt;br /&gt;
  description TEXT NOT NULL DEFAULT '',&lt;br /&gt;
  add_date DATE NOT NULL,&lt;br /&gt;
  price INT NOT NULL,&lt;br /&gt;
  rating INT NOT NULL DEFAULT 0&lt;br /&gt;
 );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Перед поиском по данным их необходимо проиндексировать утилитой ''indexer'', входящей в комплект поставки ''Sphinx''. Она читает файл конфигурации и индексирует данные в соответствии с его параметрами. Создадим такой файл, с именем '''sphinx.conf''':&lt;br /&gt;
&lt;br /&gt;
 source test_src {&lt;br /&gt;
   type = mysql&lt;br /&gt;
   sql_host = localhost&lt;br /&gt;
   sql_user = user&lt;br /&gt;
   sql_pass = password&lt;br /&gt;
   sql_db = sphinx&lt;br /&gt;
   sql_query_pre = SET NAMES utf8&lt;br /&gt;
   sql_query = \&lt;br /&gt;
      SELECT * FROM test;&lt;br /&gt;
 }&lt;br /&gt;
 index test_src {&lt;br /&gt;
   source = test_src&lt;br /&gt;
   charset_type = utf-8&lt;br /&gt;
   path = /var/www/sphinx/data/test&lt;br /&gt;
   enable_star = 1&lt;br /&gt;
   morphology = stem_enru&lt;br /&gt;
   min_word_len = 3&lt;br /&gt;
   min_prefix_len = 0&lt;br /&gt;
   min_infix_len = 3&lt;br /&gt;
   html_strip = 1&lt;br /&gt;
 }&lt;br /&gt;
 indexer {&lt;br /&gt;
   mem_limit = 256M&lt;br /&gt;
   max_iops = 40&lt;br /&gt;
 }&lt;br /&gt;
 searchd {&lt;br /&gt;
   listen = localhost:3312&lt;br /&gt;
   pid_file = /var/log/searchd/sphinx.pid&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Файл конфигурации состоит из ряда блоков. '''Source test_src''' описывает источник данных, его тип (у нас – '''mysql''') и параметры. В '''sql_query''' указан запрос, поставляющий данные для индексации. Можно задавать поля таблицы или вставить '''*''' для индексации всех полей, что мы и делаем. '''sql_query_pre''' отвечает за ''SQL''-запрос, сообщающий ''MySQL'' (до извлечения информации из базы данных), что прием и передача данных будут в кодировке '''UTF-8'''. Безэтого могут быть проблемы с поиском по русским текстам.&lt;br /&gt;
&lt;br /&gt;
В блоке '''index test_src''' – параметры индексации: '''source''' указывает на источник, для которого они применяются, '''path''' – на место хранения индекса. Все программы из ''Sphinx (indexer, searchd)'' должны иметь доступ к данному каталогу на чтение и запись. '''enable_star''' разрешает поиск с использованием групповых символов (wildcard). Этот параметр влияет только на поиск, и при его изменении не нужна переиндексация данных: достаточно перезапустить демон ''searchd''. '''morphology''' определяет, морфологии каких языков учитывать при создании индекса: у нас это английский и русский. '''min_word_len''' задает минимальную длину слова при поиске, отсекая часто используемые короткие союзы, местоимения, предлоги и пр. '''min_prefix_len''' – минимальная длина префикса. Если здесь стоит 0, то префиксы не индексируются. Зачем это нужно? Если задать '''min_prefix_len = 3''', то при разборе слова «сигнализация» в индекс будут занесены «сиг», «сигн», «сигна», «сигнал», ..., «сигнализация». Теперь, если в поиске набрать «сиг», запрос по сути будет «сиг*». Это резко увеличит индекс, время поиска и количество результатов. '''min_infix_len''' – расширенный вариант '''min_prefix_len'''. В нашем примере поисковый запрос будет иметь вид «*сиг», «сиг*» и «*сиг*». '''min_infix_len''' также увеличивает индекс и время поиска. А '''html_strip''' позволяет не учитывать при поиске HTML-тэги. Так как HTML не несет смысловой нагрузки, то и искать по нему незачем, ведь тэги в браузере не видны.&lt;br /&gt;
&lt;br /&gt;
Блок '''indexer''' содержит два параметра (их может быть и больше, или вообще ни одного): '''mem_limit''' – лимит используемой оперативной памяти, по умолчанию 32 МБ, и '''max_iops''' – лимит числа операций ввода/вывода, по умолчанию 0 (не ограничено). Индексация интенсивно обращается к диску, и если диск нужен другим программам, число операций ввода/вывода следует сократить.&lt;br /&gt;
&lt;br /&gt;
Блок '''searchd''' отвечает за параметры запуска поискового процесса. '''port''' – порт, который будет прослушивать демон, его номер должен быть уникальным для компьютера, чтобы не возникло конфликтов. '''pid_file''' – путь до pid-файла процесса.&lt;br /&gt;
&lt;br /&gt;
Так как блоки '''source''' и '''index''' имеют свои имена, а блок '''index''' соответствует определенному источнику, то в одном файле конфигурации может быть описано несколько источников и индексов.&lt;br /&gt;
&lt;br /&gt;
Создав файл конфигурации, запустим индексатор ''indexer'':&lt;br /&gt;
&lt;br /&gt;
 indexer --all --config /var/www/sphinx/sphinx.conf&lt;br /&gt;
&lt;br /&gt;
Параметр '''--all''' требует переиндексировать все индексы, определенные в '''sphinx.conf'''. В случае успеха вывод консоли будет:&lt;br /&gt;
&lt;br /&gt;
 1 Sphinx 0.9.8.1-release (r1533)&lt;br /&gt;
 2 Copyright (c) 2001-2008, Andrew Aksyonoff&lt;br /&gt;
 3&lt;br /&gt;
 4 using config file '/var/www/sphinx/sphinx.conf'...&lt;br /&gt;
 5 indexing index 'test_src'...&lt;br /&gt;
 6 collected 20 docs, 0.0 MB&lt;br /&gt;
 7 sorted 0.0 Mhits, 98.9% done&lt;br /&gt;
 8 total 20 docs, 1877 bytes&lt;br /&gt;
 9 total 0.216 sec, 8692.75 bytes/sec, 92.62 docs/sec&lt;br /&gt;
&lt;br /&gt;
Из них можно узнать, сколько индексировано документов и сколько времени и места на это ушло. В каталоге '''/var/www/sphinx/data''', указанном в параметре '''path''' блока '''index test_src''', создано несколько файлов с именем '''test''', но разными расширениями: '''test.spi, test.spd''' и т. д. Они отвечают за разные части индекса: заголовки, список слов, списки соответствия ID документа и ID слова и т. д.&lt;br /&gt;
&lt;br /&gt;
Теперь запустим поискового демона (''searchd''):&lt;br /&gt;
&lt;br /&gt;
 searchd --config /var/www/sphinx/sphinx.conf&lt;br /&gt;
&lt;br /&gt;
Учтите, что между '''--config''' и путем до файла конфигурации находится '''пробел''', а не символ ‘'''='''’. Наконец, попробуем поиск!&lt;br /&gt;
&lt;br /&gt;
 search --config /var/www/sphinx/sphinx.conf --index auto_src toyota&lt;br /&gt;
&lt;br /&gt;
Если нам это удастся, вы увидите следующие строки&lt;br /&gt;
&lt;br /&gt;
 1 Sphinx 0.9.8.1-release (r1533)&lt;br /&gt;
 2 Copyright (c) 2001-2008, Andrew Aksyonoff&lt;br /&gt;
 3&lt;br /&gt;
 4 using config file '/var/www/sphinx/sphinx.conf'...&lt;br /&gt;
 5 index 'auto_src': query 'toyota ': returned 5 matches of 5 total in 0.000 sec&lt;br /&gt;
 6&lt;br /&gt;
 7 displaying matches:&lt;br /&gt;
 8 1. document=2, weight=2&lt;br /&gt;
 9 2. document=3, weight=1&lt;br /&gt;
 10 3. document=4, weight=1&lt;br /&gt;
 11 4. document=14, weight=1&lt;br /&gt;
 12 5. document=19, weight=1&lt;br /&gt;
 13&lt;br /&gt;
 14 words:&lt;br /&gt;
 15 1. ‘toyota’: 5 documents, 6 hits&lt;br /&gt;
&lt;br /&gt;
Первые две строки «говорят» о версии ''Sphinx'' и его создателе. Встроке 4 указан используемый файл конфигурации. Затем, через двоеточие, идут название индекса, текст запроса («toyota») и результат: найдено 5 соответствий из 5 за 0.000 секунд (ваше время, разумеется, может быть другим). Наконец, приведены все найден ные документы и их вес (weight). Документ с номером 2 (строка 8) имеет наибольший вес: в нашей базе данных в записи с id=2 слово «toyota» встречается дважды: в названии и в описании. Со строки 14 идет отчет о частоте появления слов в документе: «toyota» встречается в 5 документах 6 раз. Выполнив команду &lt;br /&gt;
&lt;br /&gt;
 search --config /var/www/sphinx/sphinx.conf --index auto_src toyota vitz&lt;br /&gt;
&lt;br /&gt;
мы увидим следующий вывод:&lt;br /&gt;
 ...&lt;br /&gt;
 displaying matches:&lt;br /&gt;
 1. document=14, weight=2&lt;br /&gt;
 2. document=19, weight=2&lt;br /&gt;
 words:&lt;br /&gt;
 1. 'toyota': 5 documents, 6 hits&lt;br /&gt;
 2. 'vitz': 2 documents, 2 hits&lt;br /&gt;
&lt;br /&gt;
Поисковый движок учёл частоту появления всех слов запроса и нашел два документа, причем в одном из них (document=19) сочетание «toyota vitz» находится в заголовке. Во втором, в заголовке присутствует «toyota», а «vitz» – в поле описания. Но учтено только количество слов, а не их расположение. При добавке в команду атрибута '''-p''' будет учтена вся фраза.&lt;br /&gt;
&lt;br /&gt;
 search --config /var/www/sphinx/sphinx.conf -p --index auto_src toyota vitz&lt;br /&gt;
 ...&lt;br /&gt;
 displaying matches:&lt;br /&gt;
 1. document=19, weight=2&lt;br /&gt;
 words:&lt;br /&gt;
 1. 'toyota': 5 documents, 6 hits&lt;br /&gt;
 2. 'vitz': 2 documents, 2 hits&lt;br /&gt;
&lt;br /&gt;
Статистика появления слов осталась неизменной, но теперь поисковому запросу соответствует только один документ.&lt;br /&gt;
&lt;br /&gt;
===Ищем из ''PHP''===&lt;br /&gt;
&lt;br /&gt;
Сам по себе поиск из консоли не очень полезен, но его можно привязать к нашему сайту. Для этого в ''Sphinx'', в каталоге api дистрибутива, есть набор библиотек для разных языков ''Sphinx''. Мы будем использовать ''PHP'', и нам понадобится модуль '''sphinxapi.php'''.&lt;br /&gt;
&lt;br /&gt;
Создадим каталог '''sphinx''' в корне нашего сервера под управлением ''Apache'' и добавим в него файл '''index.php''' следующего содержания (я предполагаю, что с HTML и ''PHP'' вы уже знакомы):&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Заголовок=Справка о весе|Содержание=Вес (weight) – это значимость документа. Чем он больше, тем более соответствует запросу найденный документ. Для вычисления веса используется ранжирование фразы и статистическое ранжирование. Ранжирование фразы основано на длине самой длинной общей подпоследовательности. Статистическое ранжирование основывается только на количестве слов в документе. В зависимости от режима поиска мы можем получить разные веса документов для одного&lt;br /&gt;
и того же запроса.|Ширина=250px}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=php&amp;gt;&lt;br /&gt;
 1 &amp;lt;html&amp;gt;&lt;br /&gt;
 2 &amp;lt;head&amp;gt;&lt;br /&gt;
 3 &amp;lt;meta http-equiv=”Content-Type” content=”text/html; charset=utf-8” /&amp;gt;&lt;br /&gt;
 4 &amp;lt;title&amp;gt;Поиск по базе&amp;lt;/title&amp;gt;&lt;br /&gt;
 5 &amp;lt;/head&amp;gt;&lt;br /&gt;
 6 &amp;lt;body&amp;gt;&lt;br /&gt;
 7 &amp;lt;?&lt;br /&gt;
 8 require(“sphinxapi.php”);&lt;br /&gt;
 9 if ($_GET &amp;amp;&amp;amp; $_GET['text']) $text = $_GET['text']; else $text = “”;&lt;br /&gt;
 10&lt;br /&gt;
 11 print '&amp;lt;form action=”.” method=”get”&amp;gt;&lt;br /&gt;
 12 &amp;lt;input type=”text” name=”text” value=”'.$text.'” /&amp;gt;&lt;br /&gt;
 13 &amp;lt;input type=”submit” value=”Найти”/&amp;gt;&amp;lt;/form&amp;gt;';&lt;br /&gt;
 14&lt;br /&gt;
 15 $mode = SPH_MATCH_ALL;&lt;br /&gt;
 16 $index = “test_src”;&lt;br /&gt;
 17&lt;br /&gt;
 18 $cl = new SphinxClient();&lt;br /&gt;
 19 $cl-&amp;gt;SetServer(“localhost”, 3312);&lt;br /&gt;
 20 $cl-&amp;gt;SetMatchMode($mode);&lt;br /&gt;
 21 $res = $cl-&amp;gt;Query ($text, $index);&lt;br /&gt;
 22&lt;br /&gt;
 23 $ids = “”;&lt;br /&gt;
 24 if ($res === false) {&lt;br /&gt;
 25  print “Ошибка запроса: “ . $cl-&amp;gt;GetLastError() . “&amp;lt;br/&amp;gt;”;&lt;br /&gt;
 26 } else {&lt;br /&gt;
 27  if ($res['total'] &amp;gt; 0) {&lt;br /&gt;
 28   foreach ($res[“matches”] as $key=&amp;gt;$docinfo) $ids .= $key.”,“;&lt;br /&gt;
 29  }&lt;br /&gt;
 30 }&lt;br /&gt;
 31&lt;br /&gt;
 32 $ids = substr($ids, 0, strrpos($ids, “, “));&lt;br /&gt;
 33&lt;br /&gt;
 34 mysql_connect(“localhost”, “user”, “password”);&lt;br /&gt;
 35 mysql_select_db(“sphinx”);&lt;br /&gt;
 36 mysql_query('SET NAMES UTF8');&lt;br /&gt;
 37 $res = mysql_query(“SELECT * FROM auto WHERE id IN (“.$ids.”);”);&lt;br /&gt;
 38&lt;br /&gt;
 39 if ($ids) {&lt;br /&gt;
 40  print “&amp;lt;table border='1'&amp;gt;”;&lt;br /&gt;
 41 for ($data=array(); $row=mysql_fetch_assoc($res); $data[] = $row) {&lt;br /&gt;
 42  print “&amp;lt;tr&amp;gt;”;&lt;br /&gt;
 43  print “&amp;lt;td&amp;gt;”.$row[“name”].”&amp;lt;/td&amp;gt;”;&lt;br /&gt;
 44  print “&amp;lt;td&amp;gt;”.$row[“description”].”&amp;lt;/td&amp;gt;”;&lt;br /&gt;
 45  print “&amp;lt;td&amp;gt;”.$row[“price”].”&amp;lt;/td&amp;gt;”;&lt;br /&gt;
 46  print “&amp;lt;/tr&amp;gt;”;&lt;br /&gt;
 47  }&lt;br /&gt;
 48 print “&amp;lt;/table&amp;gt;”;&lt;br /&gt;
 49 }&lt;br /&gt;
 50 ?&amp;gt;&lt;br /&gt;
 51&lt;br /&gt;
 52 &amp;lt;/body&amp;gt;&lt;br /&gt;
 53 &amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF128_83_1.jpg|300px]]Наша учебная программа не блещет красотой, но машину под желания виртуального покупателя подбирает споро.|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
Первые шесть и последние две строки относятся к простей шему HTML. Cтрока 8 подключает модуль для работы со ''Sphinx'', а строки 9–13 – создание и обработка формы для отправки запроса. Строка 15 задаетрежим поиска '''SPH_MATCH_ALL''' – соответствие всем словам из запроса. Затем дано название индекса «test_src»: оно должно совпадать с названием индекса в файле '''sphinx.conf'''. Строка 18 создает экземпляр класса '''SphinxClient''', для взаимодействия с поисковым сервером. Далее укажем параметры сервера (URL и порт), передаем режим поиска и в строке 21 создаем запрос.&lt;br /&gt;
&lt;br /&gt;
Строка 24 проверяет, получен ли какой-либо результат, и если нет, '''$cl-&amp;gt;GetLastError()''' выводит последнюю ошибку. А если да, мы проверяем количество найденных документов (строка 27), а в строке 28 в цикле заполняем переменную '''$ids''' их номерами. &lt;br /&gt;
&lt;br /&gt;
''Sphinx'' хранит только индекс, сами документы находятся в базе; максимум, что мы получим при поиске – номера ('''id''') документов и некоторые целочисленные поля. Переменная '''$ids''' как раз и хранит номера найденных документов, через запятую, а так как в конце всегда будет лишняя запятая, строка 32 её удаляет.&lt;br /&gt;
&lt;br /&gt;
В строках 34–36 мы соединяемся с базой данных и устанавливаем UTF-8 как рабочую кодировку, а затем выполняем SQL-запрос. Строки 39–49 – вывод данных согласно нашему запросу.&lt;br /&gt;
&lt;br /&gt;
Открыв страницу в браузере, вы увидите уже не сухую статистику, а вполне конкретный текст.&lt;br /&gt;
&lt;br /&gt;
===Режимы поиска===&lt;br /&gt;
&lt;br /&gt;
Итак, ранжирование документов при выводе задается режимом поиска через метод '''SetMatchMode()'''. Мы применяли режим '''SPH_MATCH_ALL''', с проверкой вхождения всех слов запроса (нет хоть одного – документ не попадает в результат); но есть и другие:&lt;br /&gt;
* '''SPH_MATCH_ANY''' проверяет вхождение любого слова из запроса. Если хотя бы одно есть в документе, то он будет найден.&lt;br /&gt;
* '''SPH_MATCH_PHRASE''' проверяет вхождение фразы целиком.&lt;br /&gt;
* '''SPH_MATCH_BOOLEAN''' позволяет включать в запрос логические выражения. Например, при вводе ‘toyota &amp;amp; vitz’ будет проверяться вхождение обоих слов, как в '''SPH_MATCH_ALL'''; ‘toyota | vitz’– тоже, что '''SPH_MATCH_ANY'''; ‘toyota -vitz’ или ‘toyota!vitz’ отберёт все документы со словом toyota, кроме тех, чтосодержат ‘vitz’.&lt;br /&gt;
* SPH_MATCH_EXTENDED позволяет использовать более сложные выражения, нежели '''SPH_MATCH_BOOLEAN'''.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим последний режим подробнее, на примерах.&lt;br /&gt;
* Поиск слов в заданном поле. При вводе ‘toyota vitz’ выведутся два документа: ‘toyota vitz’ и ‘toyota raum’. Во втором документе слово vitz имеется в описании, и вряд ли это верный результат. Зато с конструкцией ‘@name toyota vitz’ сочетание toyota vitz будет искаться только в поле name. Можно также ограничить число слов, участвующих в поиске. Например, введя @description[5]ОТС, мы получим один документ; хотя аббревиатура ОТС встречается в двух, но во втором она не входит в первые пять слов поля description.&lt;br /&gt;
* Поиск фразы. «Toyota vitz», взятой в двойные кавычки, включает режим точного соответствия фразы '''SPH_MATCH_PHRASE'''.&lt;br /&gt;
* Использование кворума – минимального числа слов, которое должно встретиться. Например, «литье тонировка сигнализация»/2 означает, что для успешного поиска достаточно, чтобы в документе присутствовали любые два слова. Таких документов у нас 5, причем только в одном встречаются все три слова.&lt;br /&gt;
* Близкое расположение слов. Если мы введем «защита двигателя» в двойных кавычках, то не найдем ни одного совпадения, так как в документах не встречается такая фраза. Но, введя «защита двигателя»~3, мы найдем документ, где присутствует сочетание «защита картера и двигателя», а между словами «защита» и «двигателя» будет не более трёх слов. Кстати, ввод слов в обратном порядке («двигателя защита»~3) даст такой же результат.&lt;br /&gt;
* Строгое следование. Фразе «ОТС &amp;lt;&amp;lt; хозяин» будут соответствовать документы, где слово «ОТС» стоит перед словом «хозяин», но не наоборот. Поэтому, введя такой запрос, мы найдем только один документ, хотя слова «ОТС» и «хозяин» встречаются в двух.&lt;br /&gt;
&lt;br /&gt;
Режим поиска '''SPH_MATCH_EXTENDED''' также поддерживает логические выражения '''SPH_MATCH_BOOLEAN''' и другие, более сложные. Узнать подробности вы можете, обратившись к официальной документации http://www.sphinxsearch.com/docs/.&lt;br /&gt;
&lt;br /&gt;
Для задания другого режима поиска, введите нечто вроде&lt;br /&gt;
&lt;br /&gt;
 $mode = SPH_MATCH_EXTENDED&lt;br /&gt;
&lt;br /&gt;
в строке 15 листинга. Обратите внимание, что '''SPH_MATCH_EXTENDED''' вставляется без кавычек, потому что это импортированная константа, определенная в библиотеке '''sphinxapi.php'''.&lt;br /&gt;
&lt;br /&gt;
Помимо сложных запросов, ''Sphinx'' поддерживает заменитель '''*''' (звездочка) для любого режима поиска. Ввод toy* тоже даст список всех документов, где присутствует Toyota. Важно, что нужно определить минимум 3 символа, иначе поиск не сработает. Меняя параметр '''min_word_len''' в файле '''sphinx.conf''', это ограничение можно скорректировать.&lt;br /&gt;
&lt;br /&gt;
===И еще===&lt;br /&gt;
&lt;br /&gt;
Еще один режим поиска – '''SPH_MATCH_EXTENDED2''' – позволяет использовать метод '''SetRankingMode()''' для ручного задания механизмов ранжирования. Как отмечено выше, при ранжировании результатов учитывается как вся поисковая фраза, так и количество ключевых слов. Но иногда требуется изменить это поведение, например, для увеличения скорости. Поэтому ''Sphinx'' поддерживает самостоятельное определение алгоритма ранжирования:&lt;br /&gt;
* '''SPH_RANK_PROXIMITY_BM25''', выбран по умолчанию. Сначала ищет соответствие фразе, а затем использует алгоритм BM25 для ранжирования по частоте появления слов.&lt;br /&gt;
* '''SPH_RANK_BM25''', используется только статистическое ранжирование BM25. Работает быстрее, но может привести к ухудшению результата при запросе, содержащем более одного слова.&lt;br /&gt;
* '''SPH_RANK_NONE''', отключает режим ранжирования и задает для всех документов, в которых найдено совпадение, вес, равный единице. Самый быстрый метод.&lt;br /&gt;
* '''SPH_RANK_WORDCOUNT''', ранжирует по числу вхождений ключевых слов.&lt;br /&gt;
* '''SPH_RANK_PROXIMITY''', вычисляет насколько результат близок к поисковой фразе.&lt;br /&gt;
&lt;br /&gt;
Помимо таблиц, ''Sphinx'' может индексировать данные из особым образом оформленного XML-файла. Такой подход позволяет объединять в одном месте информацию из разных источников, и искать уже не в конкретном разделе, а по всему сайту. А вкупе с большим количеством параметров индексирования и поиска (не рассмотренных в этой статье) ваш интернет-ресурс будет снабжен поисковой системой мощнее, чем в состоянии предло жить Яндекс или Google. '''LXF'''&lt;br /&gt;
&lt;br /&gt;
===''SphinxClient'': другие методы===&lt;br /&gt;
&lt;br /&gt;
Помимо рассмотренных нами возможностей, класс '''SphinxClient''' предлагает и другие методы, как то:&lt;br /&gt;
&lt;br /&gt;
* '''SetRetries''' – устанавливает число попыток получения результатов от сервера и задержку между попытками в миллисекундах. Сам API не выполняет повторы, он только указывает об этом ''searchd''. Несколько попыток для получения результатов может использоваться, если произошел сбой в соединении или сервер слишком занят обработкой других запросов.&lt;br /&gt;
&lt;br /&gt;
Применительно к нашему коду, пример мо жет выглядеть так:&lt;br /&gt;
&lt;br /&gt;
 $cl-&amp;gt;SetRetries(3,500);&lt;br /&gt;
&lt;br /&gt;
Мы выполняем три попытки с задержкой в 500 мс.&lt;br /&gt;
&lt;br /&gt;
* '''SetLimits''' – устанавливает смещение и число выводимых документов. С помощью этого метода можно организовывать постраничный просмотр результатов поиска. '''SetLimits()''' принимает четыре параметра, обязательными из которых являются только первые два, идентичные аргументам конструкции '''LIMIT''' в ''MySQL'' – '''$offset''' задает смещение, а '''$limit''' – число документов. Дополнительными являются:&lt;br /&gt;
# '''$max_matches''' – определяет, сколько документов ''searchd'' будет держать в памяти во время поиска. Хранение документов в оперативной памяти позволяет ускорить поиск, но слишком большее значение может оставить другие процессы без ресурсов.&lt;br /&gt;
# '''$cutoff''' – предназначен для контроля производительности. Параметр указывает ''searchd'', после скольких найденных документов поиск следует прекратить.&lt;br /&gt;
&lt;br /&gt;
 $cl-&amp;gt;SetLimits(0,20);&lt;br /&gt;
&lt;br /&gt;
возвращает первые 20 совпадений.&lt;/div&gt;</summary>
		<author><name>Crazy Rebel</name></author>	</entry>

	</feed>