Sphinx Client API для Ruby

Apr 05
2007 11:39 · English (14,551 views)

Sphinx Client API используется для взаимодействия с демоном searchd и получения данных от Sphinx. Он используется в больших приложениях, оперирующих огромными объемами данных, для реализации быстрого и релевантного поиска. Ruby API — это портированный PHP API, который можно найти в дистрибутиве Sphinx. Ниже вы найдете информацию о том, как установить и использовать API.

Предупреждение: Если Вы использовали плагин до выхода версии 0.3.0, проверьте документацию, так как я убрал различия между реализацией API на PHP и Ruby, а потому все фукнции были переименованы.

Установка

Sphinx Client API для Ruby реализован как плагин для Ruby on Rails (но Вы также можете использовать его в автономных приложениях на Ruby, зависимостей от других библиотек нет). Все, что нужно - это загрузить исходный код плагина и распаковать его в каталог vendor/plugins/sphinx.

Документация

Вы можете найти документацию здесь. Кроме того, можно самостоятельно построить документацию, выполнив следующую команду в каталоге vendor/plugins/sphinx:

rake rdoc

Вот короткий пример использования:

@sphinx = Sphinx::Client.new
@sphinx.SetSortMode(Sphinx::Client::SPH_SORT_ATTR_ASC, 'created_at')
results = @sphinx.Query('test')

puts "Searched for:"
results['words'].each do |word, info|
  puts "    #{word} found #{info['hits']} times in #{info['docs']} documents"
end
print "\nResults #{results['total']} of #{results['total_found']}; "
puts "Total time: #{results['time']}"
results['matches'].each do |doc|
  puts "Document ##{doc['id']} (weight #{doc['weight']}):"
  doc['attrs'].each do |attr, value|
    puts "    #{attr}: #{value}"
  end
end

Загрузка

Последняя версия “Sphinx Client API” — 0.3.1, и она может быть загружена отсюда:

версия0.3.1ЗагрузитьSphinx Client API

Кроме того, вы можете скачать библиотеку для текущего нестабильного снапшота Sphinx 0.9.8 r1112 здесь: Sphinx Client API v0.4.0-r1112. ПРЕДУПРЕЖДЕНИЕ: это версия находится в разработке, она недостаточно протестирована и не готова к релизу. Даже если она уже используется на живых сайтах, в ней все еще есть ошибки, возможно критические. Используйте ее на свой страх и риск, и сообщайте обо всех проблемах, с которыми вы столкнулись.

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

Список изменений

  • v0.3.1 (9 декабря 2007)
    • Исправлена ошибка с порядком сортировки результатов поиска.
  • v0.3.0 (3 апреля 2007)
    • Исправлена ошибка с обработкой атрибутов в результатах запроса (спасибо shawn).
    • Исправлена ошибка с округлением временем обработки запроса (спасибо michael).
    • Обновлено API в соответствии с PHP API для Sphinx 0.9.7.
    • Добавлены тесты RSpec
  • v0.2.0 (20 декабря 2006)
    • Улучшена обработка исключений.
    • Обновлено API в соответствии с PHP API для Sphinx 0.9.7 RC2.
  • v0.1.0 (26 ноября 2006)
    • Базовая реализация библиотеки.

Другие плагины

Полный список плагинов, которые я написал, можно найти здесь.

10 отзывов на 'Sphinx Client API для Ruby'

Подписаться на комментарии по RSS или TrackBack на 'Sphinx Client API для Ruby'.

1
Quang
сказал 18.06.2007 в 7.08

Hi, I have a huge data in MySQl. Before I found Sphinx, I intend to build my old indexes and then build a tag cloud base on those indexes.
Now I wonder, can Sphinx and Client API help me in building tag cloud base on Sphinx indexes ?

2
Quang
сказал 18.06.2007 в 7.10

Sorry, in the previous comment. I mean “my own indexes”, not “my old indexes”.
My English is not good :D !

3
сказал 14.08.2007 в 18.27

[...] - Rails wrapper for Ruby API for Sphinx, a full-text search [...]

4
сказал 09.12.2007 в 21.33

[...] I have a good news: Sphinx Client API has been updated and now it supports all brand new features of the unstable Sphinx 0.9.8 development snapshot. What does it mean for you as a developer? What features you will get if you would decide to switch to the new version? I will describe most valuable improvements of the Sphinx in this article, and will show how to use them with new Sphinx Client API 0.4.0 r909. [...]

5
сказал 20.05.2008 в 5.30

[...] ruby/rails plugin rather than trying to reinvent the wheel. I found two plugins; acts_as_sphinx and Sphinx Client API for Ruby (SCAFR). They are both very similar except acts_as_sphinx has act methods to load models from the [...]

6
сказал 20.05.2008 в 5.33

Wanted to let you know I used your API with some refactoring in my project. Pls see my post for more information at http://www.weebadde.com/?p=8. I am happy contribute the refactored code.

7
Leonid S. Pavlov
сказал 07.06.2008 в 13.52

Hi!

This is my port of BuildKeywords Sphinx function from sphinxapi.php. Maybe you find it interesting and include it in future versions of your plugin.

—-

# = sphinx_ex.rb - extend Sphinx Client API by Dmytro Shteflyuk
#
# Author::    Leonid S. Pavlov <mailto:leonid.pavlov at gmail dot com>.
# Copyright:: Copyright (c) 2008 Leonid S. Pavlov
# License::   Distributes under the same terms as Ruby


module Sphinx
  class Client

    SEARCHD_COMMAND_KEYWORDS = 3
    VER_COMMAND_KEYWORDS = 0x100
   
    # Keywords generation
    #
    # Connect to searchd server, and generate keyword list for a given query.
    #
    # * <tt>query</tt> is query string
    # * <tt>index</tt> is index name (or names) to query
    # * <tt>hits</tt> is the bool flag for counting words hits in indexed documents
    #
    # Returns an array of words on success.
    # Returns false on failure.
    #
    # Usage example:
    #    sphinx.BuildKeywords('test1', '*', true)
    #
    def BuildKeywords(query, index, hits)
      assert { query.instance_of? String }
      assert { index.instance_of? String }
      assert { hits.instance_of?(TrueClass) || hits.instance_of?(FalseClass) }

      sock = self.Connect

      # build request
      request = Request.new         # v.1.0 req   
      request.put_string query      # req query
      request.put_string index      # req index
      request.put_int hits ? 1 : 0  # req hits

      # send query, get response
      len = request.to_s.length
      request = [SEARCHD_COMMAND_KEYWORDS, VER_COMMAND_KEYWORDS, len].pack('nnN') + request.to_s     # add header
      sock.send(request, 0)     
      response = GetResponse(sock, VER_COMMAND_KEYWORDS)

      # parse response
      pos = 0
      res = []
      rlen = response.length
      nwords = response[pos, 4].unpack('N*').first
      pos += 4

      for i in 0...nwords do
        len = response[pos, 4].unpack('N*').first; pos += 4
        tokenized = response[pos, len]
        pos += len;

        len = response[pos, 4].unpack('N*').first; pos += 4
        normalized = response[pos, len]
        pos += len;

        res << { 'tokenized' => tokenized, 'normalized' => normalized }

        if (hits)
          ndocs, nhits = response[pos, 8].unpack('N*N*')
          pos += 8
          res[i].merge!('docs' => ndocs, 'hits' => nhits)
        end

        if pos > rlen
          @error = 'incomplete reply'
          raise SphinxResponseError, @error
        end
      end

      return res
    end

  end
end
8
сказал 09.06.2008 в 14.36

забавый баг на стыке CodeColorer’а и Google Reader’а:

текст внутри колореровского контейнера “тянется” под следующие посты в ридере… с чего бы это?

9
сказал 03.07.2008 в 21.14

[...] your users’ searches, sphinx and memcache. Spice and stuff: a good ruby sphinx api - try this. You’ll also need a decent memcache api in ruby - go for the creators’ recommendation, [...]

10
сказал 15.08.2008 в 9.48

[...] and stuff: a good ruby sphinx api - try this. You’ll also need a decent memcache api in ruby - go for the creators’ recommendation, [...]

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

Вы можете использовать простые теги форматирования 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