The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
Changes 020
MANIFEST 05
META.json 11
META.yml 11
Makefile.PL 11
README 11
lib/Search/Elasticsearch/Bulk.pm 22
lib/Search/Elasticsearch/Client/0_90/Direct/Cluster.pm 22
lib/Search/Elasticsearch/Client/0_90/Direct/Indices.pm 22
lib/Search/Elasticsearch/Client/0_90/Direct.pm 211
lib/Search/Elasticsearch/Client/Direct/Cat.pm 222
lib/Search/Elasticsearch/Client/Direct/Cluster.pm 32
lib/Search/Elasticsearch/Client/Direct/Indices.pm 23
lib/Search/Elasticsearch/Client/Direct/Nodes.pm 22
lib/Search/Elasticsearch/Client/Direct/Snapshot.pm 22
lib/Search/Elasticsearch/Client/Direct.pm 3114
lib/Search/Elasticsearch/Cxn/Factory.pm 33
lib/Search/Elasticsearch/Cxn/HTTPTiny.pm 22
lib/Search/Elasticsearch/Cxn/Hijk.pm 39
lib/Search/Elasticsearch/Cxn/LWP.pm 22
lib/Search/Elasticsearch/CxnPool/Sniff.pm 22
lib/Search/Elasticsearch/CxnPool/Static/NoPing.pm 22
lib/Search/Elasticsearch/CxnPool/Static.pm 22
lib/Search/Elasticsearch/Error.pm 22
lib/Search/Elasticsearch/Logger/LogAny.pm 22
lib/Search/Elasticsearch/Role/API/0_90.pm 1716
lib/Search/Elasticsearch/Role/API.pm 2285
lib/Search/Elasticsearch/Role/Bulk.pm 22
lib/Search/Elasticsearch/Role/Client/Direct.pm 22
lib/Search/Elasticsearch/Role/Client.pm 22
lib/Search/Elasticsearch/Role/Cxn/HTTP.pm 314
lib/Search/Elasticsearch/Role/Cxn.pm 22
lib/Search/Elasticsearch/Role/CxnPool/Sniff.pm 22
lib/Search/Elasticsearch/Role/CxnPool/Static/NoPing.pm 22
lib/Search/Elasticsearch/Role/CxnPool/Static.pm 22
lib/Search/Elasticsearch/Role/CxnPool.pm 22
lib/Search/Elasticsearch/Role/Is_Sync.pm 22
lib/Search/Elasticsearch/Role/Logger.pm 22
lib/Search/Elasticsearch/Role/Scroll.pm 1917
lib/Search/Elasticsearch/Role/Serializer/JSON.pm 22
lib/Search/Elasticsearch/Role/Serializer.pm 22
lib/Search/Elasticsearch/Role/Transport.pm 22
lib/Search/Elasticsearch/Scroll.pm 3037
lib/Search/Elasticsearch/Serializer/JSON/Cpanel.pm 22
lib/Search/Elasticsearch/Serializer/JSON/PP.pm 22
lib/Search/Elasticsearch/Serializer/JSON/XS.pm 22
lib/Search/Elasticsearch/Serializer/JSON.pm 22
lib/Search/Elasticsearch/TestServer.pm 22
lib/Search/Elasticsearch/Transport.pm 22
lib/Search/Elasticsearch/Util/API/Path.pm 22
lib/Search/Elasticsearch/Util/API/QS.pm 68
lib/Search/Elasticsearch/Util.pm 22
lib/Search/Elasticsearch.pm 22
t/60_Cxn/40_fork_httptiny.t 05
t/60_Cxn/41_fork_lwp.t 05
t/60_Cxn/42_fork_hijk.t 05
t/60_Cxn/43_fork_netcurl.t 05
t/70_Helper/50_scroll.t 33
t/lib/es_sync.pl 13
t/lib/es_sync_fork.pl 042
t/release-no-tabs.t 05
61 files changed (This is a version diff) 191511
@@ -1,5 +1,25 @@
 Revision history for Search::Elasticsearch
 
+1.14    2014-07-24
+        Added support for indexed scripts and indexed templates.
+
+1.13    2014-06-13
+        Breaking change:
+            The Scroll helper used to pass the scroll ID to
+            scroll() and clear_scroll() in the query string by default,
+            with the scroll_in_body parameter to change the behaviour.
+            This was causing frequent errors with long scroll IDs, so
+            the new default behaviour is to pass the scroll ID in the
+            body, with the scroll_in_qs parameter to change that
+            behaviour.
+        All Search::Elasticsearch HTTP backends are now fork safe.
+        Added track_scores param to search()
+        Added create param to indices.put_template()
+        Removed index_templates param from cluster.state()
+        Removed indices_boost param from search()
+        Added percolate_format param to percolate()
+        Added cat.fielddata()
+
 1.12    2014-05-09
         Fixed bug when trying to reindex from a subref
         Added search_shards()
@@ -110,6 +110,10 @@ t/50_Cxn_Pool/70_live.t
 t/60_Cxn/10_basic.t
 t/60_Cxn/20_process_response.t
 t/60_Cxn/30_http.t
+t/60_Cxn/40_fork_httptiny.t
+t/60_Cxn/41_fork_lwp.t
+t/60_Cxn/42_fork_hijk.t
+t/60_Cxn/43_fork_netcurl.t
 t/70_Helper/10_bulk_add_action.t
 t/70_Helper/20_bulk_helpers.t
 t/70_Helper/30_bulk_flush.t
@@ -121,6 +125,7 @@ t/lib/LogCallback.pl
 t/lib/MockCxn.pm
 t/lib/default_cxn.pl
 t/lib/es_sync.pl
+t/lib/es_sync_fork.pl
 t/lib/index_test_data.pl
 t/release-eol.t
 t/release-no-tabs.t
@@ -97,6 +97,6 @@
          "web" : "https://github.com/elasticsearch/elasticsearch-perl"
       }
    },
-   "version" : "1.12"
+   "version" : "1.14"
 }
 
@@ -55,4 +55,4 @@ requires:
 resources:
   bugtracker: https://github.com/elasticsearch/elasticsearch-perl/issues
   repository: git://github.com/elasticsearch/elasticsearch-perl.git
-version: '1.12'
+version: '1.14'
@@ -63,7 +63,7 @@ my %WriteMakefileArgs = (
     "Test::More" => "0.98",
     "lib" => 0
   },
-  "VERSION" => "1.12",
+  "VERSION" => "1.14",
   "test" => {
     "TESTS" => "t/*.t t/10_Basic/*.t t/20_Serializer/*.t t/30_Logger/*.t t/40_Transport/*.t t/50_Cxn_Pool/*.t t/60_Cxn/*.t t/70_Helper/*.t t/90_Client_Spec/*.t"
   }
@@ -2,7 +2,7 @@ NAME
     Search::Elasticsearch - The official client for Elasticsearch
 
 VERSION
-    version 1.12
+    version 1.14
 
 SYNOPSIS
         use Search::Elasticsearch;
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::Bulk;
-$Search::Elasticsearch::Bulk::VERSION = '1.12';
+$Search::Elasticsearch::Bulk::VERSION = '1.14';
 use Moo;
 with 'Search::Elasticsearch::Role::Bulk',
     'Search::Elasticsearch::Role::Is_Sync';
@@ -107,7 +107,7 @@ Search::Elasticsearch::Bulk - A helper module for the Bulk API and for reindexin
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 SYNOPSIS
 
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::Client::0_90::Direct::Cluster;
-$Search::Elasticsearch::Client::0_90::Direct::Cluster::VERSION = '1.12';
+$Search::Elasticsearch::Client::0_90::Direct::Cluster::VERSION = '1.14';
 use Moo;
 with 'Search::Elasticsearch::Role::API::0_90';
 with 'Search::Elasticsearch::Role::Client::Direct';
@@ -17,7 +17,7 @@ Search::Elasticsearch::Client::0_90::Direct::Cluster - A client for running clus
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 DESCRIPTION
 
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::Client::0_90::Direct::Indices;
-$Search::Elasticsearch::Client::0_90::Direct::Indices::VERSION = '1.12';
+$Search::Elasticsearch::Client::0_90::Direct::Indices::VERSION = '1.14';
 use Moo;
 with 'Search::Elasticsearch::Role::API::0_90';
 with 'Search::Elasticsearch::Role::Client::Direct';
@@ -17,7 +17,7 @@ Search::Elasticsearch::Client::0_90::Direct::Indices - A client for running inde
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 DESCRIPTION
 
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::Client::0_90::Direct;
-$Search::Elasticsearch::Client::0_90::Direct::VERSION = '1.12';
+$Search::Elasticsearch::Client::0_90::Direct::VERSION = '1.14';
 use Moo;
 with 'Search::Elasticsearch::Role::API::0_90';
 with 'Search::Elasticsearch::Role::Client::Direct';
@@ -43,6 +43,15 @@ sub _index {
 }
 
 #===================================
+around 'clear_scroll' => sub {
+#===================================
+    my $orig = shift;
+    my ( $self, $params ) = parse_params(@_);
+    $params->{scroll_id}||=delete $params->{body};
+    $orig->( $self, $params );
+};
+
+#===================================
 sub _build__bulk_class {
 #===================================
     my $self = shift;
@@ -110,7 +119,7 @@ Search::Elasticsearch::Client::0_90::Direct - Thin client with full support for
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 SYNOPSIS
 
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::Client::Direct::Cat;
-$Search::Elasticsearch::Client::Direct::Cat::VERSION = '1.12';
+$Search::Elasticsearch::Client::Direct::Cat::VERSION = '1.14';
 use Moo;
 with 'Search::Elasticsearch::Role::API';
 with 'Search::Elasticsearch::Role::Client::Direct';
@@ -28,7 +28,7 @@ Search::Elasticsearch::Client::Direct::Cat - A client for running cat debugging
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 DESCRIPTION
 
@@ -133,6 +133,26 @@ Query string parameters:
 See the L<cat count docs|http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/cat-count.html>
 for more information.
 
+=head2 C<fielddata()>
+
+    say $e->cat->fielddata(
+        fields => 'field' | \@fields    # optional
+    );
+
+Shows the amount of memory used by each of the specified `fields` (or all
+fields) loaded into fielddata.
+
+Query string parameters:
+    C<bytes>,
+    C<h>,
+    C<help>,
+    C<local>,
+    C<master_timeout>,
+    C<v>
+
+See the L<cat fielddata docs|http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/cat-fielddata.html>
+for more information.
+
 =head2 C<health()>
 
     say $e->cat->health();
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::Client::Direct::Cluster;
-$Search::Elasticsearch::Client::Direct::Cluster::VERSION = '1.12';
+$Search::Elasticsearch::Client::Direct::Cluster::VERSION = '1.14';
 use Moo;
 with 'Search::Elasticsearch::Role::API';
 with 'Search::Elasticsearch::Role::Client::Direct';
@@ -29,7 +29,7 @@ Search::Elasticsearch::Client::Direct::Cluster - A client for running cluster-le
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 DESCRIPTION
 
@@ -138,7 +138,6 @@ parameter.
 
 Query string parameters:
     C<flat_settings>,
-    <index_templates>,
     C<local>,
     C<master_timeout>
 
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::Client::Direct::Indices;
-$Search::Elasticsearch::Client::Direct::Indices::VERSION = '1.12';
+$Search::Elasticsearch::Client::Direct::Indices::VERSION = '1.14';
 use Moo;
 with 'Search::Elasticsearch::Role::API';
 with 'Search::Elasticsearch::Role::Client::Direct';
@@ -17,7 +17,7 @@ Search::Elasticsearch::Client::Direct::Indices - A client for running index-leve
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 DESCRIPTION
 
@@ -515,6 +515,7 @@ for more information.
 The C<put_template()> method is used to create or update index templates.
 
 Query string parameters:
+    C<create>,
     C<flat_settings>,
     C<master_timeout>,
     C<order>,
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::Client::Direct::Nodes;
-$Search::Elasticsearch::Client::Direct::Nodes::VERSION = '1.12';
+$Search::Elasticsearch::Client::Direct::Nodes::VERSION = '1.14';
 use Moo;
 with 'Search::Elasticsearch::Role::API';
 with 'Search::Elasticsearch::Role::Client::Direct';
@@ -17,7 +17,7 @@ Search::Elasticsearch::Client::Direct::Nodes - A client for running node-level r
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 DESCRIPTION
 
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::Client::Direct::Snapshot;
-$Search::Elasticsearch::Client::Direct::Snapshot::VERSION = '1.12';
+$Search::Elasticsearch::Client::Direct::Snapshot::VERSION = '1.14';
 use Moo;
 with 'Search::Elasticsearch::Role::API';
 with 'Search::Elasticsearch::Role::Client::Direct';
@@ -17,7 +17,7 @@ Search::Elasticsearch::Client::Direct::Snapshot - A client for managing snapshot
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 DESCRIPTION
 
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::Client::Direct;
-$Search::Elasticsearch::Client::Direct::VERSION = '1.12';
+$Search::Elasticsearch::Client::Direct::VERSION = '1.14';
 use Moo;
 with 'Search::Elasticsearch::Role::API';
 with 'Search::Elasticsearch::Role::Client::Direct';
@@ -116,7 +116,7 @@ Search::Elasticsearch::Client::Direct - Thin client with full support for Elasti
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 SYNOPSIS
 
@@ -889,7 +889,6 @@ Query string parameters:
     C<fields>,
     C<from>,
     C<ignore_unavailable>,
-    C<indices_boost>,
     C<lenient>,
     C<lowercase_expanded_terms>,
     C<preference>,
@@ -906,6 +905,7 @@ Query string parameters:
     C<suggest_size>,
     C<suggest_text>,
     C<timeout>,
+    C<track_scores>,
     C<version>
 
 See the L<search reference|http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-body.html>
@@ -1167,6 +1167,7 @@ Query string parameters:
     C<allow_no_indices>,
     C<expand_wildcards>,
     C<ignore_unavailable>,
+    C<percolate_format>,
     C<percolate_index>,
     C<percolate_type>,
     C<preference>,
@@ -1326,6 +1327,116 @@ Query string parameters:
 See the L<mlt docs|http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-more-like-this.html>
 for more information.
 
+=HEAD1 INDEXED SCRIPT METHODS
+
+If dynamic scripting is enabled, Elasticsearch allows you to store scripts in an internal index known as
+C<.scripts> and reference them by id. The methods to manage indexed scripts are as follows:
+
+=head2 C<put_script()>
+
+    $result  = $e->put_script(
+        lang => 'lang',     # required
+        id   => 'id',       # required
+        body => { script }  # required
+    );
+
+The C<put_script()> method is used to store a script in the C<.scripts> index. For instance:
+
+    $result  = $e->put_scripts(
+        lang => 'groovy',
+        id   => 'hello_world',
+        body => {
+          script => q(return "hello world");
+        }
+    );
+
+Query string parameters: None
+
+See the L<indexed scripts docs|http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-scripting.html#_indexed_scripts> for more.
+
+=head2 C<get_script()>
+
+    $script = $e->get_script(
+        lang => 'lang',     # required
+        id   => 'id',       # required
+    );
+
+Retrieve the indexed script from the C<.scripts> index.
+
+Query string parameters: None
+
+See the L<indexed scripts docs|http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-scripting.html#_indexed_scripts> for more.
+
+=head2 C<delete_script()>
+
+    $script = $e->delete_script(
+        lang => 'lang',     # required
+        id   => 'id',       # required
+    );
+
+Delete the indexed script from the C<.scripts> index.
+
+Query string parameters: None
+
+See the L<indexed scripts docs|http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-scripting.html#_indexed_scripts> for more.
+
+=HEAD1 INDEXED SEARCH TEMPLATE METHODS
+
+Mustache templates can be used to create search requests.  These templates can
+be stored in the C<.scripts> index and retrieved by ID. The methods to
+manage indexed scripts are as follows:
+
+=head2 C<put_template()>
+
+    $result  = $e->put_template(
+        id   => 'id',                       # required
+        body => { template } || "template"  # required
+    );
+
+The C<put_template()> method is used to store a template in the C<.scripts> index.
+For instance:
+
+    $result  = $e->put_template(
+        id   => 'hello_world',
+        body => {
+          template => {
+            query => {
+              match => {
+                title => "hello world"
+              }
+            }
+          }
+      }
+    );
+
+Query string parameters: None
+
+See the L<indexed search template docs|http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-template.html#_pre_registered_template> for more.
+
+=head2 C<get_template()>
+
+    $script = $e->get_template(
+        id   => 'id',       # required
+    );
+
+Retrieve the indexed template from the C<.scripts> index.
+
+Query string parameters: None
+
+See the L<indexed search template docs|http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-template.html#_pre_registered_template> for more.
+
+=head2 C<delete_template()>
+
+    $script = $e->delete_template(
+        id   => 'id',       # required
+    );
+
+Delete the indexed template from the C<.scripts> index.
+
+Query string parameters: None
+
+See the L<indexed search template docs|http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-template.html#_pre_registered_template> for more.
+
 =head1 BENCHMARK METHODS
 
 =head2 C<benchmark()>
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::Cxn::Factory;
-$Search::Elasticsearch::Cxn::Factory::VERSION = '1.12';
+$Search::Elasticsearch::Cxn::Factory::VERSION = '1.14';
 use Moo;
 use Search::Elasticsearch::Util qw(parse_params load_plugin);
 use namespace::clean;
@@ -48,13 +48,13 @@ Search::Elasticsearch::Cxn::Factory - Used by CxnPools to create new Cxn instanc
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 DESCRIPTION
 
 This class is used by the L<Search::Elasticsearch::Role::CxnPool> implementations
 to create new L<Search::Elasticsearch::Role::Cxn>-based instances. It holds on
-to all the configuration options passed to L<Elasticsearhch/new()> so
+to all the configuration options passed to L<Elasticsearch/new()> so
 that new Cxns can use them.
 
 It contains no user serviceable parts.
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::Cxn::HTTPTiny;
-$Search::Elasticsearch::Cxn::HTTPTiny::VERSION = '1.12';
+$Search::Elasticsearch::Cxn::HTTPTiny::VERSION = '1.14';
 use Moo;
 with 'Search::Elasticsearch::Role::Cxn::HTTP',
     'Search::Elasticsearch::Role::Cxn',
@@ -83,7 +83,7 @@ Search::Elasticsearch::Cxn::HTTPTiny - A Cxn implementation which uses HTTP::Tin
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 DESCRIPTION
 
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::Cxn::Hijk;
-$Search::Elasticsearch::Cxn::Hijk::VERSION = '1.12';
+$Search::Elasticsearch::Cxn::Hijk::VERSION = '1.14';
 use Moo;
 with 'Search::Elasticsearch::Role::Cxn::HTTP',
     'Search::Elasticsearch::Role::Cxn',
@@ -10,7 +10,7 @@ use Try::Tiny;
 use namespace::clean;
 
 has 'connect_timeout' => ( is => 'ro', default => 2 );
-has '_socket_cache' => ( is => 'ro', default => sub { {} } );
+has '_socket_cache' => ( is => 'rw', default => sub { {} } );
 
 my $Cxn_Error = qr/ Connection.(?:timed.out|re(?:set|fused))
                        | connect:.timeout
@@ -74,6 +74,12 @@ sub perform_request {
 }
 
 #===================================
+sub clear_handle {
+#===================================
+    my $self = shift;
+    $self->_socket_cache( {} );
+}
+#===================================
 sub error_from_text {
 #===================================
     local $_ = $_[2];
@@ -108,7 +114,7 @@ Search::Elasticsearch::Cxn::Hijk - A Cxn implementation which uses Hijk
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 DESCRIPTION
 
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::Cxn::LWP;
-$Search::Elasticsearch::Cxn::LWP::VERSION = '1.12';
+$Search::Elasticsearch::Cxn::LWP::VERSION = '1.14';
 use Moo;
 with 'Search::Elasticsearch::Role::Cxn::HTTP',
     'Search::Elasticsearch::Role::Cxn',
@@ -91,7 +91,7 @@ Search::Elasticsearch::Cxn::LWP - A Cxn implementation which uses LWP
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 DESCRIPTION
 
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::CxnPool::Sniff;
-$Search::Elasticsearch::CxnPool::Sniff::VERSION = '1.12';
+$Search::Elasticsearch::CxnPool::Sniff::VERSION = '1.14';
 use Moo;
 with 'Search::Elasticsearch::Role::CxnPool::Sniff',
     'Search::Elasticsearch::Role::Is_Sync';
@@ -81,7 +81,7 @@ Search::Elasticsearch::CxnPool::Sniff - A CxnPool for connecting to a local clus
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 SYNOPSIS
 
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::CxnPool::Static::NoPing;
-$Search::Elasticsearch::CxnPool::Static::NoPing::VERSION = '1.12';
+$Search::Elasticsearch::CxnPool::Static::NoPing::VERSION = '1.14';
 use Moo;
 with 'Search::Elasticsearch::Role::CxnPool::Static::NoPing',
     'Search::Elasticsearch::Role::Is_Sync';
@@ -18,7 +18,7 @@ Search::Elasticsearch::CxnPool::Static::NoPing - A CxnPool for connecting to a r
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 SYNOPSIS
 
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::CxnPool::Static;
-$Search::Elasticsearch::CxnPool::Static::VERSION = '1.12';
+$Search::Elasticsearch::CxnPool::Static::VERSION = '1.14';
 use Moo;
 with 'Search::Elasticsearch::Role::CxnPool::Static',
     'Search::Elasticsearch::Role::Is_Sync';
@@ -50,7 +50,7 @@ Search::Elasticsearch::CxnPool::Static - A CxnPool for connecting to a remote cl
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 SYNOPSIS
 
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::Error;
-$Search::Elasticsearch::Error::VERSION = '1.12';
+$Search::Elasticsearch::Error::VERSION = '1.14';
 use Moo;
 
 our $DEBUG = 0;
@@ -158,7 +158,7 @@ Search::Elasticsearch::Error - Errors thrown by Search::Elasticsearch
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 DESCRIPTION
 
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::Logger::LogAny;
-$Search::Elasticsearch::Logger::LogAny::VERSION = '1.12';
+$Search::Elasticsearch::Logger::LogAny::VERSION = '1.14';
 use Moo;
 with 'Search::Elasticsearch::Role::Logger';
 use Search::Elasticsearch::Util qw(parse_params to_list);
@@ -44,7 +44,7 @@ Search::Elasticsearch::Logger::LogAny - A Log::Any-based Logger implementation
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 DESCRIPTION
 
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::Role::API::0_90;
-$Search::Elasticsearch::Role::API::0_90::VERSION = '1.12';
+$Search::Elasticsearch::Role::API::0_90::VERSION = '1.14';
 use Moo::Role;
 
 use Search::Elasticsearch::Util qw(throw);
@@ -310,21 +310,20 @@ sub api {
             [ {}, "_search" ],
         ],
         qs => [
-            "_source",         "_source_exclude",
-            "_source_include", "analyze_wildcard",
-            "analyzer",        "default_operator",
-            "df",              "explain",
-            "fields",          "from",
-            "ignore_indices",  "indices_boost",
-            "lenient",         "lowercase_expanded_terms",
-            "preference",      "q",
-            "routing",         "scroll",
-            "search_type",     "size",
-            "sort",            "source",
-            "stats",           "suggest_field",
-            "suggest_mode",    "suggest_size",
-            "suggest_text",    "timeout",
-            "version",
+            "_source",                  "_source_exclude",
+            "_source_include",          "analyze_wildcard",
+            "analyzer",                 "default_operator",
+            "df",                       "explain",
+            "fields",                   "from",
+            "ignore_indices",           "lenient",
+            "lowercase_expanded_terms", "preference",
+            "q",                        "routing",
+            "scroll",                   "search_type",
+            "size",                     "sort",
+            "source",                   "stats",
+            "suggest_field",            "suggest_mode",
+            "suggest_size",             "suggest_text",
+            "timeout",                  "version",
         ],
     },
 
@@ -953,7 +952,7 @@ Search::Elasticsearch::Role::API::0_90 - This class contains the spec for the El
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 DESCRIPTION
 
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::Role::API;
-$Search::Elasticsearch::Role::API::VERSION = '1.12';
+$Search::Elasticsearch::Role::API::VERSION = '1.14';
 use Moo::Role;
 
 use Search::Elasticsearch::Util qw(throw);
@@ -159,6 +159,22 @@ sub api {
         ],
     },
 
+    'delete_script' => {
+        doc    => "modules-scripting",
+        method => "DELETE",
+        parts  => { id => { required => 1 }, lang => { required => 1 } },
+        paths => [ [ { id => 2, lang => 1 }, "_scripts", "{lang}", "{id}" ] ],
+        qs    => [],
+    },
+
+    'delete_template' => {
+        doc    => "search-template",
+        method => "DELETE",
+        parts  => { id => {} },
+        paths  => [ [ { id => 2 }, "_search", "template", "{id}" ] ],
+        qs     => [],
+    },
+
     'exists' => {
         doc    => "docs-get",
         method => "HEAD",
@@ -223,6 +239,13 @@ sub api {
         ],
     },
 
+    'get_script' => {
+        doc   => "modules-scripting",
+        parts => { id => { required => 1 }, lang => { required => 1 } },
+        paths => [ [ { id => 2, lang => 1 }, "_scripts", "{lang}", "{id}" ] ],
+        qs    => [],
+    },
+
     'get_source' => {
         doc   => "docs-get",
         parts => {
@@ -244,6 +267,14 @@ sub api {
         ],
     },
 
+    'get_template' => {
+        body  => {},
+        doc   => "search-template",
+        parts => { id => { required => 1 } },
+        paths => [ [ { id => 2 }, "_search", "template", "{id}" ] ],
+        qs    => [],
+    },
+
     'index' => {
         body   => { required => 1 },
         doc    => "docs-index_",
@@ -392,10 +423,10 @@ sub api {
         ],
         qs => [
             "allow_no_indices",   "expand_wildcards",
-            "ignore_unavailable", "percolate_index",
-            "percolate_type",     "preference",
-            "routing",            "version",
-            "version_type",
+            "ignore_unavailable", "percolate_format",
+            "percolate_index",    "percolate_type",
+            "preference",         "routing",
+            "version",            "version_type",
         ],
     },
 
@@ -407,6 +438,24 @@ sub api {
         qs     => []
     },
 
+    'put_script' => {
+        body   => { required => 1 },
+        doc    => "modules-scripting",
+        method => "PUT",
+        parts => { id => { required => 1 }, lang => { required => 1 } },
+        paths => [ [ { id => 2, lang => 1 }, "_scripts", "{lang}", "{id}" ] ],
+        qs => [],
+    },
+
+    'put_template' => {
+        body   => { required => 1 },
+        doc    => "search-template",
+        method => "PUT",
+        parts => { id => { required => 1 } },
+        paths => [ [ { id => 2 }, "_search", "template", "{id}" ] ],
+        qs => [],
+    },
+
     'scroll' => {
         body  => {},
         doc   => "search-request-scroll",
@@ -429,21 +478,21 @@ sub api {
             [ {}, "_search" ],
         ],
         qs => [
-            "_source",            "_source_exclude",
-            "_source_include",    "allow_no_indices",
-            "analyze_wildcard",   "analyzer",
-            "default_operator",   "df",
-            "expand_wildcards",   "explain",
-            "fields",             "from",
-            "ignore_unavailable", "indices_boost",
-            "lenient",            "lowercase_expanded_terms",
-            "preference",         "q",
-            "routing",            "scroll",
-            "search_type",        "size",
-            "sort",               "source",
-            "stats",              "suggest_field",
-            "suggest_mode",       "suggest_size",
-            "suggest_text",       "timeout",
+            "_source",                  "_source_exclude",
+            "_source_include",          "allow_no_indices",
+            "analyze_wildcard",         "analyzer",
+            "default_operator",         "df",
+            "expand_wildcards",         "explain",
+            "fields",                   "from",
+            "ignore_unavailable",       "lenient",
+            "lowercase_expanded_terms", "preference",
+            "q",                        "routing",
+            "scroll",                   "search_type",
+            "size",                     "sort",
+            "source",                   "stats",
+            "suggest_field",            "suggest_mode",
+            "suggest_size",             "suggest_text",
+            "timeout",                  "track_scores",
             "version",
         ],
     },
@@ -579,6 +628,16 @@ sub api {
         qs => [ "h", "help", "local", "master_timeout", "v" ],
     },
 
+    'cat.fielddata' => {
+        doc   => "cat-fielddata",
+        parts => { fields => { multi => 1 } },
+        paths => [
+            [ { fields => 2 }, "_cat", "fielddata", "{fields}" ],
+            [ {}, "_cat", "fielddata" ],
+        ],
+        qs => [ "bytes", "h", "help", "local", "master_timeout", "v" ],
+    },
+
     'cat.health' => {
         doc   => "cat-health",
         parts => {},
@@ -1098,7 +1157,11 @@ sub api {
         method => "PUT",
         parts => { name => { required => 1 } },
         paths => [ [ { name => 1 }, "_template", "{name}" ] ],
-        qs => [ "flat_settings", "master_timeout", "order", "timeout" ],
+        qs => [
+            "create",         "flat_settings",
+            "master_timeout", "order",
+            "timeout"
+        ],
     },
 
     'indices.put_warmer' => {
@@ -1435,7 +1498,7 @@ Search::Elasticsearch::Role::API - This class contains the spec for the Elastics
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 DESCRIPTION
 
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::Role::Bulk;
-$Search::Elasticsearch::Role::Bulk::VERSION = '1.12';
+$Search::Elasticsearch::Role::Bulk::VERSION = '1.14';
 use Moo::Role;
 requires 'add_action', 'flush';
 
@@ -255,7 +255,7 @@ Search::Elasticsearch::Role::Bulk - Provides common functionality to L<Elasticse
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 AUTHOR
 
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::Role::Client::Direct;
-$Search::Elasticsearch::Role::Client::Direct::VERSION = '1.12';
+$Search::Elasticsearch::Role::Client::Direct::VERSION = '1.14';
 use Moo::Role;
 with 'Search::Elasticsearch::Role::Client';
 use Search::Elasticsearch::Util::API::Path qw(path_handler);
@@ -119,7 +119,7 @@ Search::Elasticsearch::Role::Client::Direct - Request parsing for Direct clients
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 DESCRIPTION
 
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::Role::Client;
-$Search::Elasticsearch::Role::Client::VERSION = '1.12';
+$Search::Elasticsearch::Role::Client::VERSION = '1.14';
 use Moo::Role;
 use namespace::clean;
 
@@ -28,7 +28,7 @@ Search::Elasticsearch::Role::Client - Provides common functionality for Client i
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 DESCRIPTION
 
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::Role::Cxn::HTTP;
-$Search::Elasticsearch::Role::Cxn::HTTP::VERSION = '1.12';
+$Search::Elasticsearch::Role::Cxn::HTTP::VERSION = '1.14';
 use Moo::Role;
 
 use URI();
@@ -11,7 +11,8 @@ has 'is_https'           => ( is => 'ro' );
 has 'userinfo'           => ( is => 'ro' );
 has 'max_content_length' => ( is => 'ro' );
 has 'default_headers'    => ( is => 'ro' );
-has 'handle'             => ( is => 'lazy' );
+has 'handle'             => ( is => 'lazy', clearer => 1 );
+has '_pid'               => ( is => 'rw', default => $$ );
 
 #===================================
 sub protocol     {'http'}
@@ -109,6 +110,16 @@ before 'perform_request' => sub {
 };
 
 #===================================
+before 'handle' => sub {
+#===================================
+    my $self = shift;
+    if ( $$ != $self->_pid ) {
+        $self->clear_handle;
+        $self->_pid($$);
+    }
+};
+
+#===================================
 around 'process_response' => sub {
 #===================================
     my ( $orig, $self, $params, $code, $msg, $body, $headers ) = @_;
@@ -155,7 +166,7 @@ Search::Elasticsearch::Role::Cxn::HTTP - Provides common functionality to HTTP C
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 DESCRIPTION
 
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::Role::Cxn;
-$Search::Elasticsearch::Role::Cxn::VERSION = '1.12';
+$Search::Elasticsearch::Role::Cxn::VERSION = '1.14';
 use Moo::Role;
 use Search::Elasticsearch::Util qw(throw);
 use List::Util qw(min);
@@ -183,7 +183,7 @@ Search::Elasticsearch::Role::Cxn - Provides common functionality to Cxn implemen
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 DESCRIPTION
 
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::Role::CxnPool::Sniff;
-$Search::Elasticsearch::Role::CxnPool::Sniff::VERSION = '1.12';
+$Search::Elasticsearch::Role::CxnPool::Sniff::VERSION = '1.14';
 use Moo::Role;
 with 'Search::Elasticsearch::Role::CxnPool';
 requires 'next_cxn', 'sniff';
@@ -88,7 +88,7 @@ Search::Elasticsearch::Role::CxnPool::Sniff - A CxnPool role for connecting to a
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 CONFIGURATION
 
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::Role::CxnPool::Static::NoPing;
-$Search::Elasticsearch::Role::CxnPool::Static::NoPing::VERSION = '1.12';
+$Search::Elasticsearch::Role::CxnPool::Static::NoPing::VERSION = '1.14';
 use Moo::Role;
 with 'Search::Elasticsearch::Role::CxnPool';
 
@@ -79,7 +79,7 @@ Search::Elasticsearch::Role::CxnPool::Static::NoPing - A CxnPool for connecting
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 AUTHOR
 
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::Role::CxnPool::Static;
-$Search::Elasticsearch::Role::CxnPool::Static::VERSION = '1.12';
+$Search::Elasticsearch::Role::CxnPool::Static::VERSION = '1.14';
 use Moo::Role;
 with 'Search::Elasticsearch::Role::CxnPool';
 requires 'next_cxn';
@@ -39,7 +39,7 @@ Search::Elasticsearch::Role::CxnPool::Static - A CxnPool role for connecting to
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 METHODS
 
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::Role::CxnPool;
-$Search::Elasticsearch::Role::CxnPool::VERSION = '1.12';
+$Search::Elasticsearch::Role::CxnPool::VERSION = '1.14';
 use Moo::Role;
 use Search::Elasticsearch::Util qw(parse_params);
 use List::Util qw(shuffle);
@@ -134,7 +134,7 @@ Search::Elasticsearch::Role::CxnPool - Provides common functionality to the CxnP
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 DESCRIPTION
 
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::Role::Is_Sync;
-$Search::Elasticsearch::Role::Is_Sync::VERSION = '1.12';
+$Search::Elasticsearch::Role::Is_Sync::VERSION = '1.14';
 use Moo::Role;
 use namespace::clean;
 
@@ -19,7 +19,7 @@ Search::Elasticsearch::Role::Is_Sync - A role to mark classes which should be us
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 AUTHOR
 
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::Role::Logger;
-$Search::Elasticsearch::Role::Logger::VERSION = '1.12';
+$Search::Elasticsearch::Role::Logger::VERSION = '1.14';
 use Moo::Role;
 
 use URI();
@@ -139,7 +139,7 @@ Search::Elasticsearch::Role::Logger - Provides common functionality to Logger im
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 DESCRIPTION
 
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::Role::Scroll;
-$Search::Elasticsearch::Role::Scroll::VERSION = '1.12';
+$Search::Elasticsearch::Role::Scroll::VERSION = '1.14';
 use Moo::Role;
 requires '_clear_scroll';
 use Search::Elasticsearch::Util qw(parse_params throw);
@@ -7,18 +7,18 @@ use Scalar::Util qw(weaken blessed);
 use namespace::clean;
 
 has 'es' => ( is => 'ro', required => 1 );
-has 'scroll'         => ( is => 'ro' );
-has 'scroll_in_body' => ( is => 'ro' );
-has 'total'          => ( is => 'rwp' );
-has 'max_score'      => ( is => 'rwp' );
-has 'facets'         => ( is => 'rwp' );
-has 'aggregations'   => ( is => 'rwp' );
-has 'suggest'        => ( is => 'rwp' );
-has 'took'           => ( is => 'rwp' );
-has 'total_took'     => ( is => 'rwp' );
-has 'search_params'  => ( is => 'ro' );
-has 'is_finished'    => ( is => 'rwp', default => '' );
-has '_scroll_id'     => ( is => 'rwp', clearer => 1, predicate => 1 );
+has 'scroll'        => ( is => 'ro' );
+has 'scroll_in_qs'  => ( is => 'ro' );
+has 'total'         => ( is => 'rwp' );
+has 'max_score'     => ( is => 'rwp' );
+has 'facets'        => ( is => 'rwp' );
+has 'aggregations'  => ( is => 'rwp' );
+has 'suggest'       => ( is => 'rwp' );
+has 'took'          => ( is => 'rwp' );
+has 'total_took'    => ( is => 'rwp' );
+has 'search_params' => ( is => 'ro' );
+has 'is_finished'   => ( is => 'rwp', default => '' );
+has '_scroll_id'    => ( is => 'rwp', clearer => 1, predicate => 1 );
 
 #===================================
 sub finish {
@@ -29,18 +29,16 @@ sub finish {
     $self->_clear_scroll;
 }
 
-
-
 #===================================
 sub scroll_request {
 #===================================
     my $self = shift;
     my %args = ( scroll => $self->scroll );
-    if ( $self->scroll_in_body ) {
-        $args{body} = $self->_scroll_id;
+    if ( $self->scroll_in_qs ) {
+        $args{scroll_id} = $self->_scroll_id;
     }
     else {
-        $args{scroll_id} = $self->_scroll_id;
+        $args{body} = $self->_scroll_id;
     }
     $self->es->scroll(%args);
 }
@@ -68,7 +66,7 @@ Search::Elasticsearch::Role::Scroll - Provides common functionality to L<Elastic
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 AUTHOR
 
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::Role::Serializer::JSON;
-$Search::Elasticsearch::Role::Serializer::JSON::VERSION = '1.12';
+$Search::Elasticsearch::Role::Serializer::JSON::VERSION = '1.14';
 use Moo::Role;
 requires 'JSON';
 
@@ -103,7 +103,7 @@ Search::Elasticsearch::Role::Serializer::JSON - A Serializer role for JSON modul
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 DESCRIPTION
 
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::Role::Serializer;
-$Search::Elasticsearch::Role::Serializer::VERSION = '1.12';
+$Search::Elasticsearch::Role::Serializer::VERSION = '1.14';
 use Moo::Role;
 
 requires qw(encode decode encode_pretty encode_bulk mime_type);
@@ -20,7 +20,7 @@ Search::Elasticsearch::Role::Serializer - An interface for Serializer modules
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 DESCRIPTION
 
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::Role::Transport;
-$Search::Elasticsearch::Role::Transport::VERSION = '1.12';
+$Search::Elasticsearch::Role::Transport::VERSION = '1.14';
 use Moo::Role;
 
 requires qw(perform_request);
@@ -72,7 +72,7 @@ Search::Elasticsearch::Role::Transport - Transport role providing interface betw
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 AUTHOR
 
@@ -1,7 +1,7 @@
 package Search::Elasticsearch::Scroll;
-$Search::Elasticsearch::Scroll::VERSION = '1.12';
+$Search::Elasticsearch::Scroll::VERSION = '1.14';
 use Moo;
-use Search::Elasticsearch::Util qw(parse_params);
+use Search::Elasticsearch::Util qw(parse_params throw);
 use namespace::clean;
 
 has '_buffer' => ( is => 'ro' );
@@ -13,25 +13,30 @@ with 'Search::Elasticsearch::Role::Is_Sync',
 sub BUILDARGS {
 #===================================
     my ( $class, $params ) = parse_params(@_);
-    my $es             = delete $params->{es};
-    my $scroll         = $params->{scroll} ||= '1m';
-    my $scroll_in_body = delete $params->{scroll_in_body};
-    my $results        = $es->search($params);
+    my $es = delete $params->{es};
+    my $scroll = $params->{scroll} ||= '1m';
+
+    throw( 'Param',
+        'The (scroll_in_body) parameter has been replaced by (scroll_in_qs)' )
+        if exists $params->{scroll_in_body};
+
+    my $scroll_in_qs = delete $params->{scroll_in_qs};
+    my $results      = $es->search($params);
 
     my $total = $results->{hits}{total};
 
     return {
-        es             => $es,
-        scroll         => $scroll,
-        scroll_in_body => $scroll_in_body,
-        aggregations   => $results->{aggregations},
-        facets         => $results->{facets},
-        suggest        => $results->{suggest},
-        took           => $results->{took},
-        total_took     => $results->{took},
-        total          => $total,
-        max_score      => $results->{hits}{max_score},
-        _buffer        => $results->{hits}{hits},
+        es           => $es,
+        scroll       => $scroll,
+        scroll_in_qs => $scroll_in_qs,
+        aggregations => $results->{aggregations},
+        facets       => $results->{facets},
+        suggest      => $results->{suggest},
+        took         => $results->{took},
+        total_took   => $results->{took},
+        total        => $total,
+        max_score    => $results->{hits}{max_score},
+        _buffer      => $results->{hits}{hits},
         $total
         ? ( _scroll_id => $results->{_scroll_id} )
         : ( is_finished => 1 )
@@ -105,9 +110,10 @@ sub _clear_scroll {
     my $scroll_id = $self->_scroll_id or return;
     $self->_clear_scroll_id;
 
-    my %args = $self->scroll_in_body
-        ? ( body => $scroll_id )
-        : ( scroll_id => $scroll_id );
+    my %args
+        = $self->scroll_in_qs
+        ? ( scroll_id => $scroll_id )
+        : ( body => $scroll_id );
     eval { $self->es->clear_scroll(%args) };
 }
 
@@ -123,7 +129,7 @@ Search::Elasticsearch::Scroll - A helper module for scrolled searches
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 SYNOPSIS
 
@@ -274,7 +280,7 @@ are memory constrained, you will need to take this into account.
     my $es = Search::Elasticsearch->new(...);
     my $scroll = $es->scroll_helper(
         scroll         => '1m',            # optional
-        scroll_in_body => 0|1,             # optional
+        scroll_in_qs   => 0|1,             # optional
         %search_params
     );
 
@@ -283,7 +289,7 @@ L<Search::Elasticsearch::Scroll> class and calls L</new()>,
 passing in any arguments.
 
 You can specify a C<scroll> duration (which defaults to C<"1m">) and
-C<scroll_in_body> (which defaults to C<false>). Any other parameters are
+C<scroll_in_qs> (which defaults to C<false>). Any other parameters are
 passed directly to L<Search::Elasticsearch::Client::Direct/search()>.
 
 The C<scroll> duration tells Elasticearch how long it should keep the scroll
@@ -292,13 +298,14 @@ all results, just long enough to process a single B<batch> of results.
 The expiry gets renewed for another C<scroll> period every time new
 a new batch of results is retrieved from the cluster.
 
-By default, the C<scroll_id> is passed in the
-L<scroll|Search::Elasticsearch::Client::Direct/scroll()> request as part
-of the query string. When querying very many indices, the scroll ID can become
-too long for intervening proxies.  To send it in the request body instead,
-set C<scroll_in_body> to a true value.  To send it in the request body
-as a C<POST> request, also set
-L<send_get_body_as|Search::Elasticsearch::Transport/send_get_body_as> to
+By default, the C<scroll_id> is passed as the C<body> to the
+L<scroll|Search::Elasticsearch::Client::Direct/scroll()> request.
+To send it in the query string instead, set C<scroll_in_qs> to a true value,
+but be aware: when querying very many indices, the scroll ID can become
+too long for intervening proxies.
+
+The C<scroll> request uses C<GET> by default.  To use C<POST> instead,
+set L<send_get_body_as|Search::Elasticsearch::Transport/send_get_body_as> to
 C<POST>.
 
 =head2 C<next()>
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::Serializer::JSON::Cpanel;
-$Search::Elasticsearch::Serializer::JSON::Cpanel::VERSION = '1.12';
+$Search::Elasticsearch::Serializer::JSON::Cpanel::VERSION = '1.14';
 use Cpanel::JSON::XS;
 use Moo;
 
@@ -20,7 +20,7 @@ Search::Elasticsearch::Serializer::JSON::Cpanel - A JSON Serializer using Cpanel
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 SYNOPSIS
 
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::Serializer::JSON::PP;
-$Search::Elasticsearch::Serializer::JSON::PP::VERSION = '1.12';
+$Search::Elasticsearch::Serializer::JSON::PP::VERSION = '1.14';
 use Moo;
 use JSON::PP;
 
@@ -23,7 +23,7 @@ Search::Elasticsearch::Serializer::JSON::PP - A JSON Serializer using JSON::PP
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 SYNOPSIS
 
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::Serializer::JSON::XS;
-$Search::Elasticsearch::Serializer::JSON::XS::VERSION = '1.12';
+$Search::Elasticsearch::Serializer::JSON::XS::VERSION = '1.14';
 use Moo;
 use JSON::XS;
 
@@ -19,7 +19,7 @@ Search::Elasticsearch::Serializer::JSON::XS - A JSON Serializer using JSON::XS
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 SYNOPSIS
 
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::Serializer::JSON;
-$Search::Elasticsearch::Serializer::JSON::VERSION = '1.12';
+$Search::Elasticsearch::Serializer::JSON::VERSION = '1.14';
 use Moo;
 use JSON::MaybeXS 1.002002 ();
 
@@ -24,7 +24,7 @@ Search::Elasticsearch::Serializer::JSON - The default JSON Serializer, using JSO
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 SYNOPSIS
 
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::TestServer;
-$Search::Elasticsearch::TestServer::VERSION = '1.12';
+$Search::Elasticsearch::TestServer::VERSION = '1.14';
 use Moo;
 use Search::Elasticsearch();
 use POSIX 'setsid';
@@ -174,7 +174,7 @@ Search::Elasticsearch::TestServer - A helper class to launch Elasticsearch nodes
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 SYNOPSIS
 
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::Transport;
-$Search::Elasticsearch::Transport::VERSION = '1.12';
+$Search::Elasticsearch::Transport::VERSION = '1.14';
 use Moo;
 
 use URI();
@@ -73,7 +73,7 @@ Search::Elasticsearch::Transport - Provides interface between the client class a
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 DESCRIPTION
 
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::Util::API::Path;
-$Search::Elasticsearch::Util::API::Path::VERSION = '1.12';
+$Search::Elasticsearch::Util::API::Path::VERSION = '1.14';
 use strict;
 use warnings;
 use Any::URI::Escape qw(uri_escape);
@@ -66,7 +66,7 @@ Search::Elasticsearch::Util::API::Path - A utility class for converting path tem
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 DESCRIPTION
 
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::Util::API::QS;
-$Search::Elasticsearch::Util::API::QS::VERSION = '1.12';
+$Search::Elasticsearch::Util::API::QS::VERSION = '1.14';
 use strict;
 use warnings;
 
@@ -27,14 +27,15 @@ our %Params = (
     analyzer         => { type => 'string' },
     boost_terms      => { type => 'number' },
     bytes            => { type => 'enum', options => [ 'b', 'k', 'm', 'g' ] },
-    char_filters      => { type => 'list' },
-    clear             => { type => 'bool' },
-    completion        => { type => 'bool' },
+    char_filters     => { type => 'list' },
+    clear            => { type => 'bool' },
+    completion       => { type => 'bool' },
     completion_fields => { type => 'list' },
     consistency       => {
         options => [ 'one', 'quorum', 'all' ],
         type    => 'enum'
     },
+    create           => { type => 'bool' },
     default_operator => {
         default => 'OR',
         options => [ 'AND', 'OR' ],
@@ -97,7 +98,6 @@ our %Params = (
     index_templates    => { type => 'list' },
     indexing           => { type => 'bool' },
     indices            => { type => 'bool' },
-    indices_boost      => { type => 'list' },
     interval           => { type => 'duration' },
     jvm                => { type => 'bool' },
     lang               => { type => 'string' },
@@ -136,6 +136,7 @@ our %Params = (
     payloads               => { type => 'bool' },
     percent_terms_to_match => { type => 'number' },
     percolate              => { type => 'string' },
+    percolate_format       => { type => 'string' },
     percolate_index        => { type => 'string' },
     percolate_type         => { type => 'string' },
     plugin                 => { type => 'bool' },
@@ -202,6 +203,7 @@ our %Params = (
     timeout         => { type => 'duration' },
     timestamp       => { type => 'datetime' },
     tokenizer       => { type => 'string' },
+    track_scores    => { type => 'bool' },
     transport       => { type => 'bool' },
     ts              => { type => 'bool' },
     ttl             => { type => 'duration' },
@@ -253,7 +255,7 @@ Search::Elasticsearch::Util::API::QS - A utility class for query string paramete
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 DESCRIPTION
 
@@ -1,5 +1,5 @@
 package Search::Elasticsearch::Util;
-$Search::Elasticsearch::Util::VERSION = '1.12';
+$Search::Elasticsearch::Util::VERSION = '1.14';
 use Moo;
 use Search::Elasticsearch::Error();
 use Scalar::Util qw(blessed);
@@ -119,7 +119,7 @@ Search::Elasticsearch::Util - A utility class for internal use by Search::Elasti
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 AUTHOR
 
@@ -5,7 +5,7 @@ use Moo 1.003;
 use Search::Elasticsearch::Util qw(parse_params load_plugin);
 use namespace::clean;
 
-our $VERSION = '1.12';
+our $VERSION = '1.14';
 
 my %Default_Plugins = (
     client      => [ 'Search::Elasticsearch::Client',       'Direct' ],
@@ -53,7 +53,7 @@ Search::Elasticsearch - The official client for Elasticsearch
 
 =head1 VERSION
 
-version 1.12
+version 1.14
 
 =head1 SYNOPSIS
 
@@ -0,0 +1,5 @@
+use lib 't/lib';
+
+$ENV{ES_CXN} = 'HTTPTiny';
+do "es_sync_fork.pl" or die $!;
+
@@ -0,0 +1,5 @@
+use lib 't/lib';
+
+$ENV{ES_CXN} = 'LWP';
+do "es_sync_fork.pl" or die $!;
+
@@ -0,0 +1,5 @@
+use lib 't/lib';
+
+$ENV{ES_CXN} = 'Hijk';
+do "es_sync_fork.pl" or die $!;
+
@@ -0,0 +1,5 @@
+use lib 't/lib';
+
+$ENV{ES_CXN} = 'NetCurl';
+do "es_sync_fork.pl" or die $!;
+
@@ -83,9 +83,9 @@ SKIP: {
     );
 
     test_scroll(
-        "Scroll in body",
-        {   scroll_in_body => 1,
-            body           => {
+        "Scroll in qs",
+        {   scroll_in_qs => 1,
+            body         => {
                 query   => { term => { color => 'red' } },
                 suggest => {
                     mysuggest =>
@@ -13,6 +13,7 @@ my $api = $version =~ /^0.90/ ? '0_90::Direct' : 'Direct';
 my $body     = $ENV{ES_BODY}     || 'GET';
 my $cxn      = $ENV{ES_CXN}      || do "default_cxn.pl" || die $!;
 my $cxn_pool = $ENV{ES_CXN_POOL} || 'Static';
+my $timeout  = $ENV{ES_TIMEOUT}  || 30;
 
 my $es;
 if ( $ENV{ES} ) {
@@ -22,7 +23,8 @@ if ( $ENV{ES} ) {
         cxn              => $cxn,
         cxn_pool         => $cxn_pool,
         client           => $api,
-        send_get_body_as => $body
+        send_get_body_as => $body,
+        request_timeout  => $timeout
     );
     eval { $es->ping; } or do {
         diag $@;
@@ -0,0 +1,42 @@
+use Test::More;
+use POSIX ":sys_wait_h";
+
+my $es        = do "es_sync.pl";
+my $cxn_class = ref $es->transport->cxn_pool->cxns->[0];
+ok $es->info, "$cxn_class - Info before fork";
+
+my $Kids = 4;
+my %pids;
+
+for my $child ( 1 .. $Kids ) {
+    my $pid = fork();
+    if ($pid) {
+        $pids{$pid} = $child;
+        next;
+    }
+    if ( !defined $pid ) {
+        skip "fork() not supported";
+        done_testing;
+        last;
+    }
+
+    for ( 1 .. 100 ) {
+        $es->info;
+    }
+    exit;
+}
+
+my $ok = 0;
+for ( 1 .. 10 ) {
+    my $pid = waitpid( -1, WNOHANG );
+    if ( $pid > 0 ) {
+        delete $pids{$pid};
+        $ok++ unless $?;
+        redo;
+    }
+    last unless keys %pids;
+    sleep 1;
+}
+
+is $ok, $Kids, "$cxn_class - Fork";
+done_testing;
@@ -119,6 +119,10 @@ my @files = (
     't/60_Cxn/10_basic.t',
     't/60_Cxn/20_process_response.t',
     't/60_Cxn/30_http.t',
+    't/60_Cxn/40_fork_httptiny.t',
+    't/60_Cxn/41_fork_lwp.t',
+    't/60_Cxn/42_fork_hijk.t',
+    't/60_Cxn/43_fork_netcurl.t',
     't/70_Helper/10_bulk_add_action.t',
     't/70_Helper/20_bulk_helpers.t',
     't/70_Helper/30_bulk_flush.t',
@@ -130,6 +134,7 @@ my @files = (
     't/lib/MockCxn.pm',
     't/lib/default_cxn.pl',
     't/lib/es_sync.pl',
+    't/lib/es_sync_fork.pl',
     't/lib/index_test_data.pl',
     't/release-eol.t',
     't/release-no-tabs.t',