Release 0.4.0
[RUBYEXT] Added that custom Hash#to_json allows passing options
[FIX] Added a Results::Item#type method
Added a Index#settings method to retrieve index settings as a Hash
Added support for the "scan" search in the Ruby API

Given the support for search types (since karmi/tire@d764c0d), we can now
expose the "scan" search type in the Ruby API and DSL.

Example
-------

    # Let's index some data
    documents = (1..100).map { |i| { id: i, type: 'test', title: "Document #{i}" } }

    Tire.index 'scantest' do
      delete
      create :settings => { :number_of_shards => 1, :number_of_replicas => 0 }
      import documents
      refresh
    end

    # Let's initiate a scan search request
    s = Tire.scan 'scantest'

    # The #each method returns the document batches as received from ElasticSearch,
    # where invididual hits are wrapped as Results::Item
    s.each do |results|
      puts results.map(&:title)
    end

    # The #each_document method returns each individual documents, as received from ElasticSearch,
    # wrapped as a Results::Item
    s.each_document do |document|
      puts "#{count}: #{document.title}"
      count += 1
    end

Information
-----------

The object being returned is fully Enumerable-compatible.

See the unit and integration tests for details on usage.

Inspired by Michael Grassotti's and Erick Tryzelaar's work at:

* https://github.com/grasscode/tire/commit/63fefb9b56073180356e676fea2e327adc09f7dc
* https://gist.github.com/2240721

See the ElasticSearch documentation:

* http://www.elasticsearch.org/guide/reference/api/search/search-type.html
* http://www.elasticsearch.org/guide/reference/api/search/scroll.html

Closes #196.
Added support for reindexing the index documents into new index

Added a `Tire::Index#reindex` method which uses the "scan/scroll" API to retrieve
documents from index A and import them into index B.

If the new index does not exists, it is created: you may pass settings as an options hash.

You may pass a Tire DSL query as a block to the method.

Example:
--------

    require 'tire'

    Tire.configure { logger STDERR }

    Tire.index('scantest-new') { delete }

    documents = (1..100).map do |i|
      { id: i, type: 'test', title: "Document #{i}" }
    end

    puts "", "Importing data into ElasticSearch..."

    Tire.index 'scantest' do
      delete and create :settings => { :number_of_shards => 1, :number_of_replicas => 0 }
      import documents
      refresh
    end

    Tire.index('scantest').reindex 'scantest-new', settings: { number_of_shards: 3 } do
      query { string '10*' }
    end
[TESTS] Fixed syntax errors in tests under Ruby 1.8

Closes #321.
[TESTS] Fixed incorrect expectations on Ruby 1.8
Added support for index aliases

This commit adds support for:

* Tire::aliases
* Tire::Index#aliases
* Tire::Index#add_alias
* Tire::Index#remove_alias

So, to add an alias for an index, you can do:

    Tire.index('articles') do
      add_alias 'articles_aliased
    end

or:

    Tire.index('articles').add_alias 'articles_aliased'

See the index unit tests for documentation.

See <http://www.elasticsearch.org/guide/reference/api/admin-indices-aliases.html>
for more documentation on the feature in ElasticSearch.

Closes #209, fixes #92.
[#209] Added support for creating index aliases with configuration, cleaned up

* You can do `@index.add_alias 'index-aliased', :routing => '1'` now
* Fixed incorrect curl-formatted logs from alias operations
* More consistent naming
* Fixed expectations for Ruby 1.8
* Added integration test

Fixes #209.
[GEMS] Update development dependencies ("yajl" and "mongoid")

Closes #325
[TEST] Added test showing highlighting for multiple fields

Closes #262
[#262] Simplified highlighting tests, improved test case name
[TEST] Clean up indices created by integration tests
[BULK] Changed, that Index#bulk_store runs against an index endpoint, not against `/_bulk`

Closes #327, fixes #328.
Added Index#url and simplified the Tire::Index class and tests

Closes #328, fixes #327
Release 0.4.1
[HTTP] Fixed incorrect handling of PUT requests in the Curb client
[FIX] Fixed, that blocks passed to `Tire::Index.new` or `Tire.index` losed the scope

Without this patch, blocks being passed to `Tire::Index.new` losed the scope, because
only `instance_eval` was called.

This was inconsistent with the `Tire::Search.new` behaviour, as documented eg. in
<http://karmi.github.com/tire/#section-48>

Thanks to @ahfeel for reporting.
[ALIASES] Added `Tire::Alias`, interface and DSL to manage aliases as resources

* Added `Alias.all`, `Alias.all("some_index")` and `Alias.find("my_alias")`
* Added rich interface for managing aliases as resources
* Changed Index#add_alias and Index#remove_alias to use Tire::Alias interface
* Changed the `Tire.aliases` method to use `Alias.all`
* Added unit and integration tests

See <http://www.elasticsearch.org/guide/reference/api/admin-indices-aliases.html> for feature overview.

The `Tire::Alias` class provides a rich interface for managing aliases.

To create an alias pointing to multiple indices:

    Tire::Alias.create name: 'my_alias', indices: ['index_1', 'index_2']

You may pass the routing and other configurations:

    a = Tire::Alias.new name:    'index_anne',
                        indices: ['index_2012_04', 'index_2012_03', 'index_2012_02'],
                        routing: 1,
                        filter:  { :terms => { :user => 'anne' } }
    a.save

Of course, you may use the Ruby API directly:

    a = Tire::Alias.new
    a.name('index_anne')
    a.index('index_2012_04')
    a.index('index_2012_03')
    # ...
    a.save

But you may prefer the DSL-ish block syntax:

    Tire::Alias.new name: 'index_anne' do |a|
      a.index 'index_2012_04'
      a.index 'index_2012_03'
      a.filter :terms, username: 'anne'
    end

To update an existing alias, find it by name, update its configuration and save it:

    a = Tire::Alias.find('my_alias')
    a.indices.delete 'index_A'
    a.indices.add    'index_B'
    a.indices.add    'index_C'
    a.save

Or do it with a block, again:

    Tire::Alias.find('articles_aliased') do |a|
      a.indices.remove 'articles_2'
      puts '---', "#{a.name} says: /me as JSON >", a.as_json, '---'
      a.save
    end

To remove indices from alias, you may want to use the `Alias#indices.delete_if` method:

    require 'active_support/core_ext/numeric'
    require 'active_support/core_ext/date/calculations'

    a = Tire::Alias.find('articles_aliased')
    a.indices.delete_if do |i|
      Time.parse( i.gsub(/articles_/, '') ) < 4.weeks.ago rescue false
    end
    a.save

To get all aliases, use the `Tire::Alias.all` method:

    Tire::Alias.all.each do |a|
      puts "#{a.name.rjust(30)} points to: #{a.indices}"
    end

To get aliases for a specific index, pass its name to `Alias.all`:

    Tire::Alias.all('articles').each do |a|
      puts "Alias '#{a.name}': #{a.inspect}."
    end

See the 'sliding window' scenario in the corresponding integration test:

    <https://github.com/karmi/tire/blob/aliases/test/integration/index_aliases_test.rb#L66-118>

Fixes #62, fixes #92, fixes #209.