Новые версии библиотеки Sphinx Client API 0.3.1 и 0.4.0 r909 для Sphinx 0.9.8 r909

Dec 09
2007 21:33 (MySQL, Плагины RoR) · English (2,822 views)

Sphinx Search Engine У меня есть хорошие новости: обновился Sphinx Client API и теперь он поддерживает все новые возможности нестабильной ветки Sphinx 0.9.8. Что это означает для вас как разработчика? Какие возможности вы получите, если решите использовать новую версию? В этой статье я расскажу о наиболее значимых улучшениях Sphinx, и покажу, как использовать их с новой версией Sphinx Client API 0.4.0 r909.

Содержание

Поддержка множественных запросов

Что это означает? Множественные запросы означают отправку нескольких поисковых запросов в Sphinx за раз. Это позволяет сократить накладные расходы, связанные с сетью. Но более важно то, что в случае использования пакетных запросов движок получает возможность оптимизировать “сходные” запросы. Вот цитата с домашней страницы Sphinx:

Один из типичных паттернов использования Sphinx является получение нескольких “отображений” результатов поиска. Например, одно может потребовать нарисовать количество результатов по категориям вместе с результатами поиска по продуктам, другое — график результатов по времени. Да, это все можно было легко сделать и раньше используя группировки. Однако, приходилось выполнять один и тот же запрос несколько раз, используя различные настройки.

С этого момента, если вы отправляете подобные запросы используя новый интерфейс пакетных запросов (к слову, старый добрый интерфейс Query() никуда не девался, и совместимость со старыми клиентами на месте), Sphinx замечает, что полнотекстовый поисковый запрос тот же самый, а отличия только в настройках сортировки/группировки. В этом случае он осуществляет тяжелый полнотекстовый поиск только один раз, а затем строит несколько разных (по-разному отсортированных/сгруппированных) результирущих наборов данных. Я получил ускорение в 1.5-2 раза на моих простых синтетических запросах; в зависимости от разных факторов, ускорение может быть даже больше на практике.

Для осуществления множественного запроса, нужно добавить несколько запросов используя метод AddQuery (параметры точно совпадают с параметрами метода Query), и затем вызвать метод RunQueries. Обратите внимание, что все параметры, фильтры, настройки запроса сохраняются между вызовами AddQuery. Это означает, что если вы указали режим сортировки используя SetSortMode перед первым вызовом AddQuery, то режим сортировки для второго вызова AddQuery будет тем же. На данный момент вы можете сбросить только настройки фильтров (используя ResetFilters) и группировок (ResetGroupBy). Кстати, вы можете использовать Query как обычно для выполнения единичного запроса, но не пытайтесь вызывать этот метод после того, как добавили запрос в пакет используя AddQuery.

Хватит разглагольствовать, давайте рассмотрим пример:

sphinx = Sphinx::Client.new
sphinx.SetFilter('group_id', [1])
sphinx.AddQuery('wifi')

sphinx.ResetFilters
sphinx.SetFilter('group_id', [2])
sphinx.AddQuery('wifi')

results = sphinx.RunQueries
pp results

В результате мы получим массив из двух хэшей:

[{"total_found"=>2,
  "status"=>0,
  "matches"=>
   [{"attrs"=>{"group_id"=>1, "created_at"=>1175658647}, "weight"=>2, "id"=>3},
    {"attrs"=>{"group_id"=>1, "created_at"=>1175658490}, "weight"=>1, "id"=>1}],
  "error"=>"",
  "words"=>{"wifi"=>{"hits"=>6, "docs"=>3}},
  "time"=>"0.000",
  "attrs"=>{"group_id"=>1, "created_at"=>2},
  "fields"=>["name", "description"],
  "total"=>2,
  "warning"=>""},
 {"total_found"=>1,
  "status"=>0,
  "matches"=>
   [{"attrs"=>{"group_id"=>2, "created_at"=>1175658555}, "weight"=>2, "id"=>2}],
  "error"=>"",
  "words"=>{"wifi"=>{"hits"=>6, "docs"=>3}},
  "time"=>"0.000",
  "attrs"=>{"group_id"=>1, "created_at"=>2},
  "fields"=>["name", "description"],
  "total"=>1,
  "warning"=>""}]

Каждый хэш содержит такие же данные, как и результат вызова Query. Кроме того, в хэшах есть поля error и warning, содержащие ошибку и предупреждение соответственно (если они не пустые).

Обратите внимание: я добавил вызов ResetFilters перед созданием второго запроса. Без этого вызова запрос содержал бы два фильтра с конфликтующими условиями, потому в результате мы не получили бы ни одного совпадения.

Расширеный движок V2

Новый поисковый движок (кодовое название “расширеный движок V2″) постепенно заменит все существующие на данный момент режимы поиска. Сейчас он полностью идентичен расширенному режиму по функциональности, но использует намного меньше мощности процессора на некоторых запросах. Вот что говорит автор Sphinx:

Я уже заметил улучшения в 3-5 раз в некоторых случаях. Единственный случай, когда новый движок медленнее — это когда происходит обработка сложных расширенных запросов с десятками-тысячами слов; но грядущие оптимизации это исправят.

Движок V2 в настоящее время находится на стадии альфа-тестирования, и никак не влияет на другие режимы поиска. Временно добавлен режим SPH_MATCH_EXTENDED2 для того, чтобы упростить тестирование. Мы активно тестируем движок (под синтетической нагрузкой, и затем под реальной) в данный момент. Ваши независимые результаты тестов приветствуются!

Итак, для использования нового движка мы должны использовать режим SPH_MATCH_EXTENDED2. Так давайте сделаем это!

sphinx = Sphinx::Client.new
sphinx.SetMatchMode(Sphinx::Client::SPH_MATCH_EXTENDED2)
sphinx.Query('wifi')

Легко, не правда ли? Вы должны попробовать это лично, чтобы оценить мощность нового движка. Обратите внимание, что это временный режим, и он будет удален после релиза.

Поддержка 64-битных ID документов и слов

До версии 0.9.8 Sphinx ограничивался индексированием до 4 миллиардов документов из-за использования 32-битных ключей. Сейчас появилась возможность использовать 64-битные ID, и новая возможность не влияет на производительность 32-битных ключей. Давайте рассмотрим пример. Для начала выполним запрос к БД с 32-битными ключами:

sphinx = Sphinx::Client.new
result = sphinx.Query('wifi')
pp result['matches'][0]['id'].class

Как вы заметили, класс поля id — это Fixnum. Попробуем выполнить запрос к индексу с 64-битными ключами. Вы получите Bignum в результате, и это означает, что вы можете использовать свыше 4 миллиардов документов!

Атрибуты с множественными значениями

Обычные атрибуты позволяют присоединить только одно значение к каждому документу. Однако, в некоторых случаях (например, для тегов и категорий) необходимо подцепить несколько значений одного атрибута и иметь возможность применять фильтры к списку значений. В этих случаях мы можем использовать атрибуты с множественными значениями.

sphinx = Sphinx::Client.new
sphinx.SetFilter('tag', [1,5])
pp sphinx.Query('wifi')

В случае, когда tag — это атрибут с множественным значением, вы получите результат вроде:

{"total_found"=>2,
 "status"=>0,
 "matches"=>
  [{"attrs"=>
     {"tag"=>[4, 5],
      "group_id"=>2,
      "created_at"=>1175658555},
    "weight"=>2,
    "id"=>2},
   {"attrs"=>
     {"tag"=>[1, 2, 3],
      "group_id"=>1,
      "created_at"=>1175658490},
    "weight"=>1,
    "id"=>1}],
 "error"=>"",
 "words"=>{"wifi"=>{"hits"=>6, "docs"=>3}},
 "time"=>"0.000",
 "attrs"=>
  {"price"=>5,
   "tag"=>1073741825,
   "is_active"=>4,
   "group_id"=>1,
   "created_at"=>2},
 "fields"=>["name", "description"],
 "total"=>2,
 "warning"=>""}

Как вы заметили, атрибуты с множественными значениями возвращаются как массив целых.

Geodistance

Sphinx теперь позволяет вычислять географическое расстояние между двумя точками, заданными широтой и долготой (в радианах). Так вы можете теперь задать “якорную точку” для запроса (и названия атрибутов для получения широты и долготы документа), и затем использовать виртуальный атрибут “@geodist” как в фильтрах, так и в выражениях сортировки. В этом случае будет рассчитываться расстояние в метрах от якорной точки до каждого найденного документа, и затем может использоваться для фильтрации и/или сортировки, а также будет возвращено как виртуальный атрибут.

sphinx = Sphinx::Client.new
sphinx.SetGeoAnchor('lat', 'long', 0.87248, 0.63195)
result = sphinx.Query('wifi')

Загрузка

Как всегда, вы можете загрузить Sphinx Client API с домашней страницы проекта. Обратите внимание, что версия 0.3.1 клиентского API предназначена для использования со Sphinx 0.9.7, а Sphinx Client API 0.4.0 r909 требует версию Sphinx 0.9.8 r909. Вы можете загрузить Sphinx из раздела Download на домашней странице Sphinx.

4 отзывов на 'Новые версии библиотеки Sphinx Client API 0.3.1 и 0.4.0 r909 для Sphinx 0.9.8 r909'

Подписаться на комментарии по RSS или TrackBack на 'Новые версии библиотеки Sphinx Client API 0.3.1 и 0.4.0 r909 для Sphinx 0.9.8 r909'.

1
сказал 18.01.2008 в 11.43

Dmytro, any plans with the new release of sphinx (as of Jan 14, 2007)?
I saw some new cool features like the ranking engine for ext2 mode.

2
сказал 18.01.2008 в 11.46

It will be published today or tomorrow.

3
сказал 18.01.2008 в 11.49

Oh, thanks, I was trying to do it myself, but I’ve got stuck while translating some of the new functions added to php api.

4
сказал 19.01.2008 в 18.42

Вышла версия Sphinx Client API 0.4.0-r1065 для Sphinx 0.9.8 r1065! Забрать можно здесь.

Оставить отзыв

Вы можете использовать простые теги форматирования HTML (вроде <a>, <ul> and others). Чтобы вставить пример код, используйте <code lang="php">$a = "hello";</code> (поддерживаемые языки: ruby, php, yaml, html, csharp, javascript). Также Вы можете использовать <code>$a = "hello";</code>, синтаксис не будет подсвечен. Если вы не хотите использовать тег <code>, замените символ < на &lt;.

Отправить

 
Copyright © 2005 - 2008, Dmytro Shteflyuk