Revision history for ElasticSearch
0.65    2013-05-08
        Add support for ignore_missing to get_aliases()

0.64    2013-02-26
        Default query for count()

0.63    2013-02-12
        Removed unsupported params from mlt()

0.62    2013-01-03
        BUG FIX
        Don't destroy params passed in to new()

        ENHANCEMENT
        Added the 'order' param to index templates

0.61    2012-11-09
        ENHANCEMENT
        Ignore empty queryb/filterb sections

0.60    2012-11-07
        ENHANCEMENT:
        Added a max_content_length attribute to ElasticSearch::Transport
        to avoid posting too large a body to elasticsearch. The value
        is auto-detected in versions 0.19.12 onwards.
        Added doc param to update()

0.59    2012-10-31
        BREAKING CHANGE:
        Added the 'explain' parameter to validate_query(), which now returns
        a hash instead of true|false

        BUG FIXES:
        The queryb->query, filterb->filter SearchBuilder conversions no longer
        change the original parameters

        ENHANCEMENTS:
        Added cluster_reroute()
        Added type_exists()
        Added warmer APIs
        Added explain API
        Added upsert to update()
        Added ignore_indices param to search(), searchqs() and msearch()
        Bulk error handlers now receive the element number of the error
        to identify the original item in the array (required for Elastic::Model)
        Errors now have string comparison overloaded

0.58    2012-08-09
        Added a _method_name parameter to reindex() so that objects other
        than ScrolledSearch can be passed as the $source.  The scrolling
        defaults to $source->next, but with $method_name will be called
        as $source->$method_name.

0.57    2012-07-31
        Minor changes to ElasticSearch::TestServer to make it work consistently
        on Travis CI

0.56    2012-07-31
        BUG FIXES
         - Trying to bulk create a doc that already exists should also trigger
           a conflict error, not a general error.

0.55    2012-07-06
        ENHANCEMENTS
        - Added on_conflict and on_error callbacks to bulk actions and reindex()

0.54    2012-06-30
        NEW FEATURES
         - Added exists()
        ENHANCEMENTS
         - An ElasticSearch::Error::Conflict object now contains the latest
           version number
         - delete_mapping() now throws an error when the index or type is
         - get() now accepts a 'parent' param
         - searchqs() now accecpts 'lenient', 'quote_analyzer' and
           'quote_field_suffix' params
         - msearch() now accepts a 'search_type' param
        BUG FIXES
         - Removed dependencies on Module::Build and base
           missing
         - Worked around bug https://github.com/elasticsearch/elasticsearch/issues/2072
           in ES which causes the default HTTP backend to hang by returning
           a response body to a HEAD request
         - Fixed current_server_version() to work with async backends

0.53    2012-04-14
        Bug fix:
         - the timestamp param to index() should be a 'string', not
           a 'duration'

0.52    2012-03-17
        BREAKING CHANGE:
         - get_alias() now uses the native GET alias request, and its output
           format has changed.

        Bug fix:
         - put_mapping() incorrectly required a single index. Now it
           can contain zero or more indices

0.51    2012-03-05
        index() and create() were missing consistency and replication parameters

0.50    2012-03-02
        - Added msearch()
        - The short-circuit functions for bulk/mget weren't working correctly
          either with as_json or async backends
        - Fixed bug in TestServer where it wasn't shutting down ES correctly
          if it failed to create a new ES.pm object

0.49    2012-02-17
        Don't pass a custom port param through to ElasticSearch::TestServer

0.48    2012-02-17
        BREAKING CHANGE:
        Updated the bulk* methods to support index, type, timestamp and ttl
        args.  As a result, the method signatures have changed.

        ENHANCEMENTS:
         - index(), create() and the index/create bulk actions now accept
           a JSON encoded string as a value for the 'data' param.
         - added update()
         - Added 'fields' to clear_cache
         - Added index_segments()
         - Added validate_query()
         - Added ClusterBlock exception (code 403)
         - Added NotReady exception (code 503)
         - index_stats() now supports the 'all' flag
         - Added params to nodes():
           - http, jvm, network, os, process, thread_pool, transport
         - Added params to nodes_stats():
           - indices, clear, all, fs, http, jvm, network, os, process,
             thread_pool, transport
         - Added params to analyze():
           - tokenizer, filters, field
         - Added param 'partial_fields' to search()
         - ElasticSearch::TestServer will now die if it can't find the
           PID of the started ES process
         - Added drain_buffer(), refill_buffer() and facets() to
           ElasticSearch::ScrolledSearch

        BUG FIXES:
         - Fixed support for as_json in ScrolledSearch
         - Fixed implicit IO::Handle bug when trying to log in older Perls
         - Fixed a bug in index_stats and addded 'get' stats and groups.
         - Corrected spelling of 'quorom' to 'quorum'
         - create() now uses the index op_type instead of /_create to
           fix a bug when creating a doc without an ID
         - put_mapping wasn't respecting a type set with use_type()

0.47    2011-10-24
        Merged patch from AVAR, which ensures that the servers are used in
        random order.

0.46    2011-09-07
        Fixed support for parent/child in reindex() - thanks to PERLER for
        reporting

0.45    2011-08-27
        Doc typo corrected

0.44    2011-08-27
        Added support for deflate() to all HTTP Transport modules.

0.43    2011-08-26
        Added ElasticSearch::Transport::AECurl, and async backend which uses
        libcurl, via AnyEvent::Curl::Multi

0.42    2011-08-26
        Dull Dist::Zilla change, for CPAN

0.41    2011-08-26

        BREAKING CHANGES:
         - ElasticSearch::Transport::Thrift is now in a separate release
         - delete_index() and delete_mapping() now require an index
           parameter, to avoid accidental deletes.
         - the return value for the bulk() methods, when { as_json => 1}
           is specified, is now the JSON equivalent of the normal
           return value, not the raw value from ES

        OTHER:
         - started using Dist::Zilla
         - Added ElasticSearch::Transport::Curl, as a separate release
         - get_aliases now works with {as_json => 1}

0.40    2011-08-10

        BREAKING CHANGE:
         - index_exists now returns an empty list if the index doesn't exist.
           Previously, it threw an error.

        OTHER:
         - Deprecated the use of top level mapping parameters in put_mapping()
           in favour of just using the 'mapping' param
         - IDs could not contain eg "/" before - now fixed with Any::URI::Escape
           ie (URI::Escape or URI::Escape::XS)
         - The 'servers' param to new() now defaults to localhost if not
           specified
         - The "scroll" param to scrolled_search() now defaults to '1m'
         - added search_from and search_size to mlt()
         - added analyze_wildcard and lowercase_expanded_terms to searchqs()
         - mget() now returns [] if no docs specified, instead of dieing
         - Made Test::More v 0.96 a dependency, and fixed the hashbang path
           in the example (thanks to AVAR)

0.39    2011-07-19
         - "type" is now optional for get() requests
         - added index_exists()
         - added mget()
         - added SearchBuilder integration for aliases

0.38    2011-07-03
        - Integrated ElasticSearch::SearchBuilder
        - Deprecated the use of query types as top level params to count()
          and delete_by_query() in favour of query or queryb
        - trace_calls() now also accepts a filehandle (thanks FERREIRA)
        - TestServer now supports ES_TRANSPORT=all

0.37    2011-05-01

        BREAKING CHANGES:
         -  ElasticSearch::ScrolledSearch

            $scrolled_search->next() now returns 1 result by default, instead
            of $size results, to make it easier to write:

                while (my $result = $scroll->next) {}

         - ElasticSearch::TestServer is now an object which subclasses
           ElasticSearch itself.  connect_to_server() has been removed.
           Also, the port parameter can be used to specify a custom start port
           when starting the test server, making it easier to run the
           test server while there is an existing ES server running.

0.36    2011-04-24
        Updated ElasticSearch.pm to work with ElasticSearch version 0.16.0

        New features:
         - no_refresh:
           Disable the automatic discovery of live nodes, to work with
           remote clusters or proxied clusters

         - scrolled_search():
           Convenience iterator to wrap search/scroll requests

         - reindex():
           Utility to reindex data from one index to another, or one
           cluster to another

         - use_index()/use_type():
           Set default index/type parameters

         - searchqs():
           URI/query string search, (as opposed to search() which uses a
           request body)

         - New search_type's : 'scan' and 'count'

         - index_settings():
           Retrieve index settings

0.35    2011-04-07
        Added the 'dynamic_templates' option to put_mapping

0.34    2011-03-20

        Fixed the tests for scrolling - turns out sorting when scrolling works
        correctly. It was my tests which were bad.

0.33    2011-03-19
        Added the ElasticSearch::Transport::HTTPTiny backend

0.32    2011-03-19

         - Added as_json as an arg to all ES requests.
         - Fixed a logic bug when setting the port manually in
           ElasticSearch::TestServer
         - Fixed a bug in ElasticSearch::TestServer which was
           preventing it from working on OSX

         Thanks to PERLER for the above

          - Changed some query syntax in t/10-queryparser.t for perl 5.8.3

0.31    2011-03-16

        Fixed a bad test plan

0.30    2011-03-16

        - Added some missing requirements to Build.PL
        - scroll() now accepts a 'scroll' parameter and works (but
          sorting when scrolling still broken on the server)
        - reindex_es.pl now also preserves the _parent and _routing fields

0.29    2011-03-15
         - Updated the Changes file

0.28    2011-03-14

        Support added for:
         - Percolators
               - create_percolator()
               - delete_percolator()
               - get_percolator()
               - percolate()

         - Open / Close index
               - open_index()
               - close_index()

         - Index templates
               - create_index_template()
               - delete_index_template()
               - index_template()

         - Routing
         - Parent docs
         - Versioning
         - Analyzer
               - analyze()

         - ElasticSearch::QueryParser
               - Parses and filters query strings, to ensure that user
                 data is in an acceptable form for passing to ES

         - ElasticSearch::TestServer
               - starts a test server for use by the test suite
               - factored out to make it easier for others to use

        Also:
         - create_index() now supports adding mappings at the same time
         - Added bulk_create(), bulk_index() and bulk_delete()
         - Bulk actions now accept _id and id etc, which means that
           search results can be passed directly to bulk without renaming
           these parameters
         - Added river_status()
         - New errors
            - ElasticSearch::Error::Conflict - versioning conflict
            - ElasticSearch::Error::Missing - requested index/doct etc missing
            - both these errors inherit from ElasticSearch::Error::Request
         - Added ignore_missing to many methods which allows you to ignore
           Missing errors
         - Added query_parser
         - added timeout() as sugar for $es->transport->timeout()
         - added refresh_servers() as sugar for $es->transport->refresh_servers()

        In ElasticSearch::Transport
         - added max_requests() to force a refresh of known live nodes
           every $max_requests
         - on the first request, the list of live nodes is automatically
           updated
         - made httplite recognise more error states as temporary Connection
           errors
         - added support for recognising 404 and 409 HTTP codes
         - upgraded Thrift to version 5.0
         - improvements to logging

        Miscellaneous:
          - added examples/reindex_es.pl
          - fixed a bug in the Makefile.PL

0.27    2010-10-21
        Fixed an undefined bug in Transport::refresh_servers which would
        die if no nodes were found

0.26    2010-10-20
        Added a missing dependency on parent.pm

0.25    2010-10-20
        Another ambiguous use of localtime in ElasticSearch::Transport

0.24    2010-10-20
        Corrected an ambiguous use of localtime in ElasticSearch::Transport
        Added examples/search_issues.pl
        Minor tidying to tests

0.23    2010-10-19
        POD corrections

0.22    2010-10-19
        Support ElasticSearch version 0.12.0

        Added the bulk() method, for bulk indexing, creating and deleting
        Added create_river(), delete_river() and get_river()
        Added delete_mapping()
        Added error_trace()

        Completely refactored ElasticSearch to enable pluggable backends:
         - The request parser methods now live in ElasticSearch/RequestParser.pm
           although they are loaded into the ElasticSeach namespace
         - Added ElasticSearch::Transport as a transport base class
         - Added ElasticSearch::Transport::HTTP (default) as the LWP backend
         - Added ElasticSearch::Transport::HTTPLite as the HTTP::Lite backend
         - Added ElasticSearch::Transport::Thrift as the Thrift backend
         - Added ElasticSearch::Error class for exception objects
         - Added ElasticSearch::Util with some generally useful utilities
         - A number of methods have from ElasticSearch to
           ElasticSearch::transport including current_server(), servers(),
           refresh_servers()
         - Removed the debug() method - now use $ElasticSearch::DEBUG instead
         - Added filter_keywords to ElasticSearch::Util

0.21    2010-09-18
        Supports ElasticSearch version 0.10.0
        Added the _source parameter to put_mapping()

0.20    2010-09-04
        Supports ElasticSearch version 0.10.0
        Added update_index_settings() plus test
        Added pod coverage test

0.19    2010-08-19
        Supports ElasticSearch version 0.9.1
        Minor bug fix to cluster_state
        Updated tests to use facet_filter instead of filter

0.18    2010-08-01
        Updated Changes file

0.17    2010-08-01

        Supports ElasticSearch version 0.9, which removes support for some
        features of older versions.

      - In search() added support for 'script_fields'
      - In count() and delete_by_query() added support for 'custom_score',
        'fuzzy', 'span_term', 'span_first', 'span_near', 'span_not',
        'span_or'
      - Removed terms() - now handled by search facets
      - Added the 'full' parameter to flush_index()
      - Changed put_mapping() to automatically prefix the type properties
        definition with the type name
      - Removed get_mapping() and replaced it with mapping(), which uses
        the newly exposed GET _mapping API
      - Added current_server_version()
      - Added the 'filter_nodes', 'filter_metadata', 'filter_routing_table'
        and 'filter_indices' params to cluster_state()



0.16    2010-05-20
        Added an ElasticSearch::Error::Timeout error class, to catch
        occassions when the request times out, instead of failing
        for a different reason.

        Also, catch 'Server closed connection' errors, and automatically
        refresh_servers and retry the request.

0.15    2010-05-16
        Fixed a bug in refresh_servers() introduced in 0.14, when forking
        processes.

0.14    2010-05-16
        The object now stores the original servers parameter, so that
        if the nodes disassociate and the live server list is limited,
        the object can still try the original servers.

0.13    2010-05-13
        Added nodes_stats(), shutdown(), restart() and camel_case()
        Removed Alien::ElasticSearch, as it is now easier to install
        ElasticSearch directly.
        Tested against ElasticSearch version 0.7.0

0.12    2010-04-16
        Added scroll() and the indices_boost param to search()
        Tested against ElasticSearch version 0.6.0

0.11    2010-04-07
        Updated changelog

0.10    2010-04-07
        Fixed the duration regex
        Improved docs for shutdown()

0.09    2010-04-07
        Changed refresh_servers to handle http_address and httpAddress
        Added a terms filter test

0.08    2010-04-05
      - Changed all_field to _all

0.07    2010-04-05

      - All tests pass as of version 8cfa04cea3bc2317ee613384ced4da20cf2737aa
        on 2010-04-04:
        http://github.com/elasticsearch/elasticsearch/commit/8cfa04cea3bc2317ee613384ced4da20cf2737aa

      - Updated the API to take into account ElasticSearch's change from
        using camelCase to underscore_separators
      - create() now uses the /_create postfix instead of op_type=create,
        although that flag is still available through index() and set()
      - Changed more_like_this and more_like_this_field to mlt and mlt_field
      - Changed fuzzy_like_this and fuzzy_like_this_field to flt and flt_field
      - Changed term() to use gt/gte/lt/lte instead of from/to and
        fromInclusive/toInclusive
      - put_mapping now defaults to { ignore_conflicts => 0 }, so the
        default now is to complain
      - In mlt, boost_terms:boolean and boost_terms_factor:float have now
        been merged to boost_terms:float

0.06    2010-04-03
      - The test suite now requires Alien::ElasticSearch, and uses its own
        config file and work dir, so as not to interfere with existing
        data
      - Added clear_cache()
      - Added fuzzy_like_this and fuzzy_like_this_field clauses to
        count() and delete_by_query()
      - Added more_like_this()
      - Added more_like_this/more_like_this_field clauses to count()
        and delete_by_query()
      - Changed exclude_from and exclude_to to from_inclusive and to_inclusive
        in the terms() query
      - the filteredQuery clause renamed to 'filtered' as per a change in ES
      - Added aliases() and get_aliases()
      - Deleted the QueryDSL doc, as the ElasticSearch docs are much improved

0.05    2010-03-04
      - Delayed connecting to the cluster until actually required (previously
        it refreshed the server list in new() )
      - Restructured the internals again, to make it easier to read
      - Added cluster_health()
      - Fixed the test suite so that auto-started nodes don't take over
        the terminal
      - Enabled more tests as ElasticSearch now less buggy

0.04    2010-02-23
      - Added terms()
      - Added get_mapping()
      - Renamed create_mapping() to put_mapping()
      - Added ignore_duplicate param to put_mapping
      - skip create-duplicate-mapping test if cluster has more than one nodes

0.03    2010-02-21
      - Corrected the docs for search/count/delete_by_query
      - Added POD for the Query DSL
      - Added a SIG{INT} to the test file, so that it shuts down the servers
        if the test suite is interrupted

0.02    2010-02-21
      - Rewrote the module completely to use a dispatch table -
        makes it easier to extend
      - Added a test suite
      - Added Alien::ElasticSearch so that we can test against a live server

0.01    2010-02-16
        First version, released on an unsuspecting world.