Поисковая машина Sphinx: основные возможности, применение

В наши дни вряд ли кто-то захочет выбирать товары в интернет-магазине, где нужно разбираться в категориях или прокручивать длинные списки товаров.

Существует множество доступных инструментов, которые могут сделать внутренний поиск по сайту быстрым, интуитивно понятным и адаптированным к любым потребностям клиентов.

Поисковая машина Sphinx, кажется, обещает именно это. Полнотекстовая поисковая система является одновременно гибкой и быстрой.

Sphinx работает как автономный сервер и не хранит текст для себя. Он создает индекс, основанный на запросе SQL, который извлекает документы из базы данных, сохраняет индексы и на более позднем этапе возвращает строки, соответствующие запросу.

Что такое Sphinx

Поисковая машина Sphinx – это полнотекстовая поисковая система, которая бесплатна, быстра и масштабируема. Она предназначена для производительности и актуальности. Не имеет аналогов ни в одной традиционной базе данных.

Большое количество известных сайтов с высоким трафиком полагаются на него для продвинутого уровня поиска и масштабируемости

Основные возможности Sphinx

Sphinx помогает включить и повысить ценность поиска и масштабируемости благодаря следующим характеристикам, которые делают его популярным среди тысяч разработчиков и продавцов электронной коммерции.

  1. Высокая скорость поиска (до 150-250 Мбит/с на ядре с 1 000 000 документов).
  2. Поддержка распределенного поиска в реальном времени.
  3. Высокая скорость индексации (до 10-15 Мбит/с на одно ядро).
  4. Высокая масштабируемость (самый большой из известных кластеров способен индексировать до 3 000 000 000 документов и может обрабатывать более 50 миллионов запросов в день).
  5. Одновременная поддержка нескольких полей (до 32 по умолчанию) для полнотекстового поиска документов.
  6. Возможность поддерживать ряд дополнительных атрибутов для каждого документа (например, группы, метки времени и т. д.).
  7. Использование стоп-слов.
  8. Поддержка различных API языков программирования (например, для PHP, Python, Java, Perl, Ruby, .NET и C ++ и т. д.).
  9. Возможность обрабатывать как однобайтовые кодировки, так и UTF-8.
  10. Морфологический поиск.
  11. Интеграция с наиболее популярными системами управления базами данных (например, MySQL, PostgreSQL)

В целом поисковая машина Sphinx имеет более 50 различных функций (и это число постоянно растет).

Как работает Sphinx

Вся сложность схемы работы поисковика суммируется в 2 ключевых моментах:

  • используя исходную таблицу, Sphinx создает собственную базу данных индексов;
  • затем, когда пользователь отправляет запрос API, Sphinx возвращает массив идентификаторов, которые соответствуют идентификаторам в исходной таблице.

Зачем использовать Sphinx

Основная причина, по которой следует его использовать, - скорость поиска. Обычные поиски пользователя в MySQL занимают значительно больше времени, чем поиск в Sphinx. Пользователь начинает замечать разницу, как только его база данных будет иметь миллионы записей. Если база данных небольшая (например, форум из 100 пользователей), это не совсем то, что нужно. Хотя можно попробовать. Плюс есть интересные функции, такие как морфология слова (если пользователь ищет кошек, это будет соответствовать кошке, если он ищет бега, это будет соответствовать бегу, бегам и т. д.).

Другая причина – это полнотекстовый поиск. Задумывался ли кто-то о том, что во время осуществления поиска двух слов в Google он будет искать их в том же абзаце или в двух абзацах (или в предложении), но не по всей странице? Sphinx же позволяет делать похожие вещи.

Масштабируемость заключается в следующем. Если у пользователя большие базы данных на многих серверах, Sphinx позаботится об этом. И приложение будет считать, что оно работает на одном сервере. Sphinx может снять большую часть нагрузки с PHP-серверов с точки зрения обработки и поиска информации.

Sphinx немного отличается от того, к чему пользователь привык с запросами MySQL. Так что не стоит ожидать получить все мгновенно.

Что такое индексация

Sphinx извлекает данные из таблицы в базе данных MySQL и выполняет для них процесс, называемый индексацией. Индексация создает файл, который можно легко найти с помощью Sphinx. Например, если пользователь попытается найти документ в Microsoft Word, он будет искать слова одно за другим в тексте документа. В очень больших документах поиск может быть очень медленным. С другой стороны, Sphinx производит индексацию перед выполнением любых поисков. Это создает индекс, который можно эффективно искать, а не отыскивать слово за словом по всему документу. Хорошим примером является индекс энциклопедии. Если пользователь хочет найти информацию о кошках, он мог бы делать то же, что и Microsoft Word, и читать каждую страницу энциклопедии в поисках появления слова «кошка». Или он может посмотреть алфавитный указатель в конце книги, где написано, что о кошках информация размещена на страницах 104, 195 и 653. Так гораздо проще.

Можно искать только то, что проиндексировано

Что необходимо помнить, так это то, что Sphinx может искать только в индексе. Это означает, что каждый раз, когда пользователь хочет найти последние результаты, он должен обновить индекс.

Доступ к данным

Если пользователь уже работал с PHP с MySQL, ему будет намного проще. В противном случае ему, вероятно, следует изучить PHP и MySQL.

Поисковая машина Sphinx обычно возвращает идентификаторы MySQL, а не данные.

Главное, что необходимо помнить о Sphinx, это то, что он не извлекает данные. В первую очередь он получает идентификаторы документов. Sphinx делает интенсивную часть, которая ищет конкретные записи. Затем пользователь может выполнить простую часть через MySQL, который получает этот документ. Так, например, если Sphinx извлекает идентификаторы документов 1, 5 и 7 из индекса, то потребуется выполнить запрос в MySQL для получения записей (вероятно, с идентификаторами 1,5 и 7). Можно подумать, что это примитивно, но MySQL требует очень мало ресурсов для поиска идентификатора документа по сравнению с поиском слова.

Пример. Скажем, Sphinx вытаскивает документы с идентификаторами 1, 5, 7 (SELECT * FROM documents WHERE id IN (1,5,7)).

Пользователь сообщает MySQL, что нужно выбрать все столбцы из таблицы документов (или любой другой, в которой был результат), где идентификатор (или то, что было названо его полем) равен 1, 5 или 7. И затем можно использовать mysql_fetch_array в PHP, дабы посмотреть на данные и делать с ними, что угодно.

После того как будет освоена работа в Sphinx для упорядочивания результатов, можно сохранить порядок следующим образом:

  1. Сохранение порядка результатов в массиве (просто сохранить свойство id для совпадений).
  2. Выполнение IMPLODE для массива с использованием $result = implode(",", $array), где $array – это массив результатов пользователя. Result будет хранить строку идентификаторов результатов, разделенных запятой. · SELECT * FROM documents WHERE id IN ($result) ORDER BY FIELD(id,$result).

Здесь пользователь сообщает MySQL, что необходимо упорядочить результаты по полю id в порядке, указанном в $result.

Это может показаться сложным, но к этому быстро привыкаешь, и вскоре пользователь сам напишет функции, которые справятся со всем этим для него.

Заключительные выводы

Использование Sphinx вместо MySQL может обеспечить значительные преимущества в скорости. Sphinx идеально подходит для поиска статических таблиц. Но в то же время для часто обновляемых строк возможность использования простых индексных файлов отсутствует. Вместо этого нужно либо внедрить дельта-файлы, либо перейти на индексацию в реальном времени. И то, и другое решение несет дополнительные затраты производительности. И в заключение: для более эффективной работы в Sphinx необходимо планирование, потому что пользователь должен заблаговременно установить все необходимые источники и индексные файлы.

Замена Sphinx для MySQL не тривиальна, но и не так сложна, чтобы отказаться от этой возможности. В случае если необходима высокая скорость поиска, следует подумать о переходе с MySQL на Sphinx, даже когда пользователь не нуждается в полнотекстовом поиске.

Комментарии