| Filename | /home/ss5/perl5/perlbrew/perls/perl-5.22.0/lib/site_perl/5.22.0/Search/Elasticsearch.pm |
| Statements | Executed 31042 statements in 74.5ms |
| Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
|---|---|---|---|---|---|
| 1001 | 1 | 1 | 106ms | 1.85s | Search::Elasticsearch::new |
| 1 | 1 | 1 | 653µs | 2.64ms | Search::Elasticsearch::BEGIN@6 |
| 1 | 1 | 1 | 377µs | 2.16ms | Search::Elasticsearch::BEGIN@5 |
| 1 | 1 | 1 | 16µs | 28µs | Search::Elasticsearch::BEGIN@3 |
| Line | State ments |
Time on line |
Calls | Time in subs |
Code |
|---|---|---|---|---|---|
| 1 | package Search::Elasticsearch; | ||||
| 2 | |||||
| 3 | 3 | 44µs | 2 | 41µs | # spent 28µs (16+13) within Search::Elasticsearch::BEGIN@3 which was called:
# once (16µs+13µs) by BenchmarkAnything::Storage::Search::Elasticsearch::get_elasticsearch_client at line 3 # spent 28µs making 1 call to Search::Elasticsearch::BEGIN@3
# spent 12µs making 1 call to UNIVERSAL::VERSION |
| 4 | |||||
| 5 | 2 | 68µs | 2 | 2.27ms | # spent 2.16ms (377µs+1.78) within Search::Elasticsearch::BEGIN@5 which was called:
# once (377µs+1.78ms) by BenchmarkAnything::Storage::Search::Elasticsearch::get_elasticsearch_client at line 5 # spent 2.16ms making 1 call to Search::Elasticsearch::BEGIN@5
# spent 112µs making 1 call to Sub::Exporter::__ANON__[Sub/Exporter.pm:337] |
| 6 | 2 | 334µs | 2 | 2.75ms | # spent 2.64ms (653µs+1.98) within Search::Elasticsearch::BEGIN@6 which was called:
# once (653µs+1.98ms) by BenchmarkAnything::Storage::Search::Elasticsearch::get_elasticsearch_client at line 6 # spent 2.64ms making 1 call to Search::Elasticsearch::BEGIN@6
# spent 109µs making 1 call to namespace::clean::import |
| 7 | |||||
| 8 | 1 | 300ns | our $VERSION = '5.01'; | ||
| 9 | |||||
| 10 | 1 | 3µs | my %Default_Plugins = ( | ||
| 11 | client => [ 'Search::Elasticsearch::Client', '5_0::Direct' ], | ||||
| 12 | cxn_factory => [ 'Search::Elasticsearch::Cxn::Factory', '' ], | ||||
| 13 | cxn_pool => [ 'Search::Elasticsearch::CxnPool', 'Static' ], | ||||
| 14 | logger => [ 'Search::Elasticsearch::Logger', 'LogAny' ], | ||||
| 15 | serializer => [ 'Search::Elasticsearch::Serializer', 'JSON' ], | ||||
| 16 | transport => [ 'Search::Elasticsearch::Transport', '' ], | ||||
| 17 | ); | ||||
| 18 | |||||
| 19 | 1 | 600ns | my @Load_Order = qw( | ||
| 20 | serializer | ||||
| 21 | logger | ||||
| 22 | cxn_factory | ||||
| 23 | cxn_pool | ||||
| 24 | transport | ||||
| 25 | client | ||||
| 26 | ); | ||||
| 27 | |||||
| 28 | #=================================== | ||||
| 29 | # spent 1.85s (106ms+1.74) within Search::Elasticsearch::new which was called 1001 times, avg 1.84ms/call:
# 1001 times (106ms+1.74s) by BenchmarkAnything::Storage::Search::Elasticsearch::get_elasticsearch_client at line 28 of BenchmarkAnything/Storage/Search/Elasticsearch.pm, avg 1.84ms/call | ||||
| 30 | #=================================== | ||||
| 31 | 1001 | 3.75ms | 1001 | 7.63ms | my ( $class, $params ) = parse_params(@_); # spent 7.63ms making 1001 calls to Search::Elasticsearch::Util::parse_params, avg 8µs/call |
| 32 | |||||
| 33 | 1001 | 1.13ms | $params->{cxn} ||= 'HTTPTiny'; | ||
| 34 | 1001 | 1.14ms | my $plugins = delete $params->{plugins} || []; | ||
| 35 | 1001 | 904µs | $plugins = [$plugins] unless ref $plugins eq 'ARRAY'; | ||
| 36 | |||||
| 37 | 1001 | 1.31ms | for my $name (@Load_Order) { | ||
| 38 | 6006 | 6.93ms | my ( $base, $default ) = @{ $Default_Plugins{$name} }; | ||
| 39 | 6006 | 2.24ms | my $sub_class = $params->{$name} || $default; | ||
| 40 | 6006 | 6.18ms | 6006 | 481ms | my $plugin_class = load_plugin( $base, $sub_class ); # spent 481ms making 6006 calls to Search::Elasticsearch::Util::load_plugin, avg 80µs/call |
| 41 | 6006 | 39.0ms | 6006 | 1.18s | $params->{$name} = $plugin_class->new($params); # spent 856ms making 1001 calls to Search::Elasticsearch::CxnPool::Static::new, avg 856µs/call
# spent 118ms making 1001 calls to Search::Elasticsearch::Cxn::Factory::new, avg 118µs/call
# spent 115ms making 1001 calls to Search::Elasticsearch::Transport::new, avg 115µs/call
# spent 57.2ms making 1000 calls to BenchmarkAnything::Storage::Search::Elasticsearch::Serializer::JSON::DontTouchMyUTF8::new, avg 57µs/call
# spent 18.5ms making 1001 calls to Search::Elasticsearch::Logger::LogAny::new, avg 18µs/call
# spent 18.0ms making 1001 calls to Search::Elasticsearch::Client::5_0::Direct::new, avg 18µs/call
# spent 624µs making 1 call to Search::Elasticsearch::Serializer::JSON::new |
| 42 | } | ||||
| 43 | |||||
| 44 | 1001 | 1.06ms | for my $name (@$plugins) { | ||
| 45 | my $plugin_class | ||||
| 46 | = load_plugin( 'Search::Elasticsearch::Plugin', $name ); | ||||
| 47 | $plugin_class->_init_plugin($params); | ||||
| 48 | } | ||||
| 49 | |||||
| 50 | 1001 | 10.3ms | return $params->{client}; | ||
| 51 | } | ||||
| 52 | |||||
| 53 | 1 | 4µs | 1; | ||
| 54 | |||||
| 55 | =pod | ||||
| 56 | |||||
| 57 | =encoding UTF-8 | ||||
| 58 | |||||
| 59 | =head1 NAME | ||||
| 60 | |||||
| 61 | Search::Elasticsearch - The official client for Elasticsearch | ||||
| 62 | |||||
| 63 | =head1 VERSION | ||||
| 64 | |||||
| 65 | version 5.01 | ||||
| 66 | |||||
| 67 | =head1 SYNOPSIS | ||||
| 68 | |||||
| 69 | use Search::Elasticsearch; | ||||
| 70 | |||||
| 71 | # Connect to localhost:9200: | ||||
| 72 | |||||
| 73 | my $e = Search::Elasticsearch->new(); | ||||
| 74 | |||||
| 75 | # Round-robin between two nodes: | ||||
| 76 | |||||
| 77 | my $e = Search::Elasticsearch->new( | ||||
| 78 | nodes => [ | ||||
| 79 | 'search1:9200', | ||||
| 80 | 'search2:9200' | ||||
| 81 | ] | ||||
| 82 | ); | ||||
| 83 | |||||
| 84 | # Connect to cluster at search1:9200, sniff all nodes and round-robin between them: | ||||
| 85 | |||||
| 86 | my $e = Search::Elasticsearch->new( | ||||
| 87 | nodes => 'search1:9200', | ||||
| 88 | cxn_pool => 'Sniff' | ||||
| 89 | ); | ||||
| 90 | |||||
| 91 | # Index a document: | ||||
| 92 | |||||
| 93 | $e->index( | ||||
| 94 | index => 'my_app', | ||||
| 95 | type => 'blog_post', | ||||
| 96 | id => 1, | ||||
| 97 | body => { | ||||
| 98 | title => 'Elasticsearch clients', | ||||
| 99 | content => 'Interesting content...', | ||||
| 100 | date => '2013-09-24' | ||||
| 101 | } | ||||
| 102 | ); | ||||
| 103 | |||||
| 104 | # Get the document: | ||||
| 105 | |||||
| 106 | my $doc = $e->get( | ||||
| 107 | index => 'my_app', | ||||
| 108 | type => 'blog_post', | ||||
| 109 | id => 1 | ||||
| 110 | ); | ||||
| 111 | |||||
| 112 | # Search: | ||||
| 113 | |||||
| 114 | my $results = $e->search( | ||||
| 115 | index => 'my_app', | ||||
| 116 | body => { | ||||
| 117 | query => { | ||||
| 118 | match => { title => 'elasticsearch' } | ||||
| 119 | } | ||||
| 120 | } | ||||
| 121 | ); | ||||
| 122 | |||||
| 123 | # Cluster requests: | ||||
| 124 | |||||
| 125 | $info = $e->cluster->info; | ||||
| 126 | $health = $e->cluster->health; | ||||
| 127 | $node_stats = $e->cluster->node_stats; | ||||
| 128 | |||||
| 129 | # Index requests: | ||||
| 130 | |||||
| 131 | $e->indices->create(index=>'my_index'); | ||||
| 132 | $e->indices->delete(index=>'my_index'); | ||||
| 133 | |||||
| 134 | =head1 DESCRIPTION | ||||
| 135 | |||||
| 136 | L<Search::Elasticsearch> is the official Perl client for Elasticsearch, | ||||
| 137 | supported by L<elasticsearch.com|http://www.elasticsearch.com>. Elasticsearch | ||||
| 138 | itself is a flexible and powerful open source, distributed real-time | ||||
| 139 | search and analytics engine for the cloud. You can read more about it | ||||
| 140 | on L<elastic.co|http://www.elastic.co>. | ||||
| 141 | |||||
| 142 | =head1 PREVIOUS VERSIONS OF ELASTICSEARCH | ||||
| 143 | |||||
| 144 | This version of the client supports the Elasticsearch 5.0 branch, | ||||
| 145 | which is not backwards compatible with earlier branches. | ||||
| 146 | |||||
| 147 | If you need to talk to a version of Elasticsearch before 5.0.0, please | ||||
| 148 | install one of the following packages: | ||||
| 149 | |||||
| 150 | =over | ||||
| 151 | |||||
| 152 | =item * | ||||
| 153 | |||||
| 154 | L<Search::Elasticsearch::Client::2_0> | ||||
| 155 | |||||
| 156 | =item * | ||||
| 157 | |||||
| 158 | L<Search::Elasticsearch::Client::1_0> | ||||
| 159 | |||||
| 160 | =item * | ||||
| 161 | |||||
| 162 | L<Search::Elasticsearch::Client::0_90> | ||||
| 163 | |||||
| 164 | =back | ||||
| 165 | |||||
| 166 | =head2 Motivation | ||||
| 167 | |||||
| 168 | =over | ||||
| 169 | |||||
| 170 | I<The greatest deception men suffer is from their own opinions.> | ||||
| 171 | |||||
| 172 | Leonardo da Vinci | ||||
| 173 | |||||
| 174 | =back | ||||
| 175 | |||||
| 176 | All of us have opinions, especially when it comes to designing APIs. | ||||
| 177 | Unfortunately, the opinions of programmers seldom coincide. The intention of | ||||
| 178 | this client, and of the officially supported clients available for other | ||||
| 179 | languages, is to provide robust support for the full native Elasticsearch API | ||||
| 180 | with as few opinions as possible: you should be able to read the | ||||
| 181 | L<Elasticsearch reference documentation|http://www.elastic.co/guide> | ||||
| 182 | and understand how to use this client, or any of the other official clients. | ||||
| 183 | |||||
| 184 | Should you decide that you want to customize the API, then this client | ||||
| 185 | provides the basis for your code. It does the hard stuff for you, | ||||
| 186 | allowing you to build on top of it. | ||||
| 187 | |||||
| 188 | =head2 Features | ||||
| 189 | |||||
| 190 | This client provides: | ||||
| 191 | |||||
| 192 | =over | ||||
| 193 | |||||
| 194 | =item * | ||||
| 195 | |||||
| 196 | Full support for all Elasticsearch APIs | ||||
| 197 | |||||
| 198 | =item * | ||||
| 199 | |||||
| 200 | HTTP backend (for an async backend using L<Promises>, see | ||||
| 201 | L<Search::Elasticsearch::Async>) | ||||
| 202 | |||||
| 203 | =item * | ||||
| 204 | |||||
| 205 | Robust networking support which handles load balancing, failure detection | ||||
| 206 | and failover | ||||
| 207 | |||||
| 208 | =item * | ||||
| 209 | |||||
| 210 | Good defaults | ||||
| 211 | |||||
| 212 | =item * | ||||
| 213 | |||||
| 214 | Helper utilities for more complex operations, such as | ||||
| 215 | L<bulk indexing|Search::Elasticsearch::Client::5_0::Bulk>, and | ||||
| 216 | L<scrolled searches|Search::Elasticsearch::Client::5_0::Scroll> | ||||
| 217 | |||||
| 218 | =item * | ||||
| 219 | |||||
| 220 | Logging support via L<Log::Any> | ||||
| 221 | |||||
| 222 | =item * | ||||
| 223 | |||||
| 224 | Compatibility with the official clients for Python, Ruby, PHP, and Javascript | ||||
| 225 | |||||
| 226 | =item * | ||||
| 227 | |||||
| 228 | Easy extensibility | ||||
| 229 | |||||
| 230 | =back | ||||
| 231 | |||||
| 232 | =head1 INSTALLING ELASTICSEARCH | ||||
| 233 | |||||
| 234 | You can download the latest version of Elasticsearch from | ||||
| 235 | L<http://www.elastic.co/download>. See the | ||||
| 236 | L<installation instructions|https://www.elastic.co/guide/en/elasticsearch/reference/current/setup.html> | ||||
| 237 | for details. You will need to have a recent version of Java installed, | ||||
| 238 | preferably the Java v8 from Sun. | ||||
| 239 | |||||
| 240 | =head1 CREATING A NEW INSTANCE | ||||
| 241 | |||||
| 242 | The L</new()> method returns a new L<client|Search::Elasticsearch::Client::5_0::Direct> | ||||
| 243 | which can be used to run requests against the Elasticsearch cluster. | ||||
| 244 | |||||
| 245 | use Search::Elasticsearch; | ||||
| 246 | my $e = Search::Elasticsearch->new( %params ); | ||||
| 247 | |||||
| 248 | The most important arguments to L</new()> are the following: | ||||
| 249 | |||||
| 250 | =head2 C<nodes> | ||||
| 251 | |||||
| 252 | The C<nodes> parameter tells the client which Elasticsearch nodes it should | ||||
| 253 | talk to. It can be a single node, multiples nodes or, if not | ||||
| 254 | specified, will default to C<localhost:9200>: | ||||
| 255 | |||||
| 256 | # default: localhost:9200 | ||||
| 257 | $e = Search::Elasticsearch->new(); | ||||
| 258 | |||||
| 259 | # single | ||||
| 260 | $e = Search::Elasticsearch->new( nodes => 'search_1:9200'); | ||||
| 261 | |||||
| 262 | # multiple | ||||
| 263 | $e = Search::Elasticsearch->new( | ||||
| 264 | nodes => [ | ||||
| 265 | 'search_1:9200', | ||||
| 266 | 'search_2:9200' | ||||
| 267 | ] | ||||
| 268 | ); | ||||
| 269 | |||||
| 270 | Each C<node> can be a URL including a scheme, host, port, path and userinfo | ||||
| 271 | (for authentication). For instance, this would be a valid node: | ||||
| 272 | |||||
| 273 | https://username:password@search.domain.com:443/prefix/path | ||||
| 274 | |||||
| 275 | See L<Search::Elasticsearch::Role::Cxn/node> for more on node specification. | ||||
| 276 | |||||
| 277 | =head2 C<cxn_pool> | ||||
| 278 | |||||
| 279 | The L<CxnPool|Search::Elasticsearch::Role::CxnPool> modules manage connections to | ||||
| 280 | nodes in the Elasticsearch cluster. They handle the load balancing between | ||||
| 281 | nodes and failover when nodes fail. Which C<CxnPool> you should use depends on | ||||
| 282 | where your cluster is. There are three choices: | ||||
| 283 | |||||
| 284 | =over | ||||
| 285 | |||||
| 286 | =item * C<Static> | ||||
| 287 | |||||
| 288 | $e = Search::Elasticsearch->new( | ||||
| 289 | cxn_pool => 'Static' # default | ||||
| 290 | nodes => [ | ||||
| 291 | 'search1.domain.com:9200', | ||||
| 292 | 'search2.domain.com:9200' | ||||
| 293 | ], | ||||
| 294 | ); | ||||
| 295 | |||||
| 296 | The L<Static|Search::Elasticsearch::CxnPool::Static> connection pool, which is the | ||||
| 297 | default, should be used when you don't have direct access to the Elasticsearch | ||||
| 298 | cluster, eg when you are accessing the cluster through a proxy. See | ||||
| 299 | L<Search::Elasticsearch::CxnPool::Static> for more. | ||||
| 300 | |||||
| 301 | =item * C<Sniff> | ||||
| 302 | |||||
| 303 | $e = Search::Elasticsearch->new( | ||||
| 304 | cxn_pool => 'Sniff', | ||||
| 305 | nodes => [ | ||||
| 306 | 'search1:9200', | ||||
| 307 | 'search2:9200' | ||||
| 308 | ], | ||||
| 309 | ); | ||||
| 310 | |||||
| 311 | The L<Sniff|Search::Elasticsearch::CxnPool::Sniff> connection pool should be used | ||||
| 312 | when you B<do> have direct access to the Elasticsearch cluster, eg when | ||||
| 313 | your web servers and Elasticsearch servers are on the same network. | ||||
| 314 | The nodes that you specify are used to I<discover> the cluster, which is | ||||
| 315 | then I<sniffed> to find the current list of live nodes that the cluster | ||||
| 316 | knows about. See L<Search::Elasticsearch::CxnPool::Sniff>. | ||||
| 317 | |||||
| 318 | =item * C<Static::NoPing> | ||||
| 319 | |||||
| 320 | $e = Search::Elasticsearch->new( | ||||
| 321 | cxn_pool => 'Static::NoPing' | ||||
| 322 | nodes => [ | ||||
| 323 | 'proxy1.domain.com:80', | ||||
| 324 | 'proxy2.domain.com:80' | ||||
| 325 | ], | ||||
| 326 | ); | ||||
| 327 | |||||
| 328 | The L<Static::NoPing|Search::Elasticsearch::CxnPool::Static::NoPing> connection | ||||
| 329 | pool should be used when your access to a remote cluster is so limited | ||||
| 330 | that you cannot ping individual nodes with a C<HEAD /> request. | ||||
| 331 | |||||
| 332 | See L<Search::Elasticsearch::CxnPool::Static::NoPing> for more. | ||||
| 333 | |||||
| 334 | =back | ||||
| 335 | |||||
| 336 | =head2 C<trace_to> | ||||
| 337 | |||||
| 338 | For debugging purposes, it is useful to be able to dump the actual HTTP | ||||
| 339 | requests which are sent to the cluster, and the response that is received. | ||||
| 340 | This can be enabled with the C<trace_to> parameter, as follows: | ||||
| 341 | |||||
| 342 | # To STDERR | ||||
| 343 | $e = Search::Elasticsearch->new( | ||||
| 344 | trace_to => 'Stderr' | ||||
| 345 | ); | ||||
| 346 | |||||
| 347 | # To a file | ||||
| 348 | $e = Search::Elasticsearch->new( | ||||
| 349 | trace_to => ['File','/path/to/filename'] | ||||
| 350 | ); | ||||
| 351 | |||||
| 352 | Logging is handled by L<Log::Any>. See L<Search::Elasticsearch::Logger::LogAny> | ||||
| 353 | for more information. | ||||
| 354 | |||||
| 355 | =head2 Other | ||||
| 356 | |||||
| 357 | Other arguments are explained in the respective L<module docs|/MODULES>. | ||||
| 358 | |||||
| 359 | =head1 RUNNING REQUESTS | ||||
| 360 | |||||
| 361 | When you create a new instance of Search::Elasticsearch, it returns a | ||||
| 362 | L<client|Search::Elasticsearch::Client::5_0::Direct> object, which can be used for | ||||
| 363 | running requests. | ||||
| 364 | |||||
| 365 | use Search::Elasticsearch; | ||||
| 366 | my $e = Search::Elasticsearch->new( %params ); | ||||
| 367 | |||||
| 368 | # create an index | ||||
| 369 | $e->indices->create( index => 'my_index' ); | ||||
| 370 | |||||
| 371 | # index a document | ||||
| 372 | $e->index( | ||||
| 373 | index => 'my_index', | ||||
| 374 | type => 'blog_post', | ||||
| 375 | id => 1, | ||||
| 376 | body => { | ||||
| 377 | title => 'Elasticsearch clients', | ||||
| 378 | content => 'Interesting content...', | ||||
| 379 | date => '2013-09-24' | ||||
| 380 | } | ||||
| 381 | ); | ||||
| 382 | |||||
| 383 | See L<Search::Elasticsearch::Client::5_0::Direct> for more details about the requests that | ||||
| 384 | can be run. | ||||
| 385 | |||||
| 386 | =head1 MODULES | ||||
| 387 | |||||
| 388 | Each chunk of functionality is handled by a different module, | ||||
| 389 | which can be specified in the call to L<new()> as shown in L<cxn_pool> above. | ||||
| 390 | For instance, the following will use the L<Search::Elasticsearch::CxnPool::Sniff> | ||||
| 391 | module for the connection pool. | ||||
| 392 | |||||
| 393 | $e = Search::Elasticsearch->new( | ||||
| 394 | cxn_pool => 'Sniff' | ||||
| 395 | ); | ||||
| 396 | |||||
| 397 | Custom modules can be named with the appropriate prefix, | ||||
| 398 | eg C<Search::Elasticsearch::CxnPool::>, or by prefixing the full class name | ||||
| 399 | with C<+>: | ||||
| 400 | |||||
| 401 | $e = Search::Elasticsearch->new( | ||||
| 402 | cxn_pool => '+My::Custom::CxnClass' | ||||
| 403 | ); | ||||
| 404 | |||||
| 405 | The modules that you can override are specified with the following | ||||
| 406 | arguments to L</new()>: | ||||
| 407 | |||||
| 408 | =head2 C<client> | ||||
| 409 | |||||
| 410 | The class to use for the client functionality, which provides | ||||
| 411 | methods that can be called to execute requests, such as | ||||
| 412 | C<search()>, C<index()> or C<delete()>. The client parses the user's | ||||
| 413 | requests and passes them to the L</transport> class to be executed. | ||||
| 414 | |||||
| 415 | The default version of the client is C<5_0::Direct>, which can | ||||
| 416 | be explicitly specified as follows: | ||||
| 417 | |||||
| 418 | $e = Search::Elasticsearch->new( | ||||
| 419 | client => '5_0::Direct' | ||||
| 420 | ); | ||||
| 421 | |||||
| 422 | =head2 C<transport> | ||||
| 423 | |||||
| 424 | The Transport class accepts a parsed request from the L</client> class, | ||||
| 425 | fetches a L</cxn> from its L</cxn_pool> and tries to execute the request, | ||||
| 426 | retrying after failure where appropriate. See: | ||||
| 427 | |||||
| 428 | =over | ||||
| 429 | |||||
| 430 | =item * L<Search::Elasticsearch::Transport> | ||||
| 431 | |||||
| 432 | =back | ||||
| 433 | |||||
| 434 | =head2 C<cxn> | ||||
| 435 | |||||
| 436 | The class which handles raw requests to Elasticsearch nodes. | ||||
| 437 | See: | ||||
| 438 | |||||
| 439 | =over | ||||
| 440 | |||||
| 441 | =item * L<Search::Elasticsearch::Cxn::HTTPTiny> (default) | ||||
| 442 | |||||
| 443 | =item * L<Search::Elasticsearch::Cxn::Hijk> | ||||
| 444 | |||||
| 445 | =item * L<Search::Elasticsearch::Cxn::LWP> | ||||
| 446 | |||||
| 447 | =item * L<Search::Elasticsearch::Cxn::NetCurl> | ||||
| 448 | |||||
| 449 | =back | ||||
| 450 | |||||
| 451 | =head2 C<cxn_factory> | ||||
| 452 | |||||
| 453 | The class which the L</cxn_pool> uses to create new L</cxn> objects. | ||||
| 454 | See: | ||||
| 455 | |||||
| 456 | =over | ||||
| 457 | |||||
| 458 | =item * L<Search::Elasticsearch::Cxn::Factory> | ||||
| 459 | |||||
| 460 | =back | ||||
| 461 | |||||
| 462 | =head2 C<cxn_pool> (2) | ||||
| 463 | |||||
| 464 | The class to use for the L<connection pool|/cxn_pool> functionality. | ||||
| 465 | It calls the L</cxn_factory> class to create new L</cxn> objects when | ||||
| 466 | appropriate. See: | ||||
| 467 | |||||
| 468 | =over | ||||
| 469 | |||||
| 470 | =item * L<Search::Elasticsearch::CxnPool::Static> (default) | ||||
| 471 | |||||
| 472 | =item * L<Search::Elasticsearch::CxnPool::Sniff> | ||||
| 473 | |||||
| 474 | =item * L<Search::Elasticsearch::CxnPool::Static::NoPing> | ||||
| 475 | |||||
| 476 | =back | ||||
| 477 | |||||
| 478 | =head2 C<logger> | ||||
| 479 | |||||
| 480 | The class to use for logging events and tracing HTTP requests/responses. See: | ||||
| 481 | |||||
| 482 | =over | ||||
| 483 | |||||
| 484 | =item * L<Search::Elasticsearch::Logger::LogAny> | ||||
| 485 | |||||
| 486 | =back | ||||
| 487 | |||||
| 488 | =head2 C<serializer> | ||||
| 489 | |||||
| 490 | The class to use for serializing request bodies and deserializing response | ||||
| 491 | bodies. See: | ||||
| 492 | |||||
| 493 | =over | ||||
| 494 | |||||
| 495 | =item * L<Search::Elasticsearch::Serializer::JSON> (default) | ||||
| 496 | |||||
| 497 | =item * L<Search::Elasticsearch::Serializer::JSON::Cpanel> | ||||
| 498 | |||||
| 499 | =item * L<Search::Elasticsearch::Serializer::JSON::XS> | ||||
| 500 | |||||
| 501 | =item * L<Search::Elasticsearch::Serializer::JSON::PP> | ||||
| 502 | |||||
| 503 | =back | ||||
| 504 | |||||
| 505 | =head1 BUGS | ||||
| 506 | |||||
| 507 | This is a stable API but this implementation is new. Watch this space | ||||
| 508 | for new releases. | ||||
| 509 | |||||
| 510 | If you have any suggestions for improvements, or find any bugs, please report | ||||
| 511 | them to L<http://github.com/elasticsearch/elasticsearch-perl/issues>. | ||||
| 512 | I will be notified, and then you'll automatically be notified of progress on | ||||
| 513 | your bug as I make changes. | ||||
| 514 | |||||
| 515 | =head1 SUPPORT | ||||
| 516 | |||||
| 517 | You can find documentation for this module with the perldoc command. | ||||
| 518 | |||||
| 519 | perldoc Search::Elasticsearch | ||||
| 520 | |||||
| 521 | You can also look for information at: | ||||
| 522 | |||||
| 523 | =over 4 | ||||
| 524 | |||||
| 525 | =item * GitHub | ||||
| 526 | |||||
| 527 | L<http://github.com/elasticsearch/elasticsearch-perl> | ||||
| 528 | |||||
| 529 | =item * CPAN Ratings | ||||
| 530 | |||||
| 531 | L<http://cpanratings.perl.org/d/Search::Elasticsearch> | ||||
| 532 | |||||
| 533 | =item * Search MetaCPAN | ||||
| 534 | |||||
| 535 | L<https://metacpan.org/module/Search::Elasticsearch> | ||||
| 536 | |||||
| 537 | =item * IRC | ||||
| 538 | |||||
| 539 | The L<#elasticsearch|irc://irc.freenode.net/elasticsearch> channel on | ||||
| 540 | C<irc.freenode.net>. | ||||
| 541 | |||||
| 542 | =item * Mailing list | ||||
| 543 | |||||
| 544 | The main L<Elasticsearch mailing list|http://discuss.elastic.co>. | ||||
| 545 | |||||
| 546 | =back | ||||
| 547 | |||||
| 548 | =head1 TEST SUITE | ||||
| 549 | |||||
| 550 | The full test suite requires a live Elasticsearch node to run, and should | ||||
| 551 | be run as : | ||||
| 552 | |||||
| 553 | perl Makefile.PL | ||||
| 554 | ES=localhost:9200 make test | ||||
| 555 | |||||
| 556 | B<TESTS RUN IN THIS WAY ARE DESTRUCTIVE! DO NOT RUN AGAINST A CLUSTER WITH | ||||
| 557 | DATA YOU WANT TO KEEP!> | ||||
| 558 | |||||
| 559 | You can change the Cxn class which is used by setting the C<ES_CXN> | ||||
| 560 | environment variable: | ||||
| 561 | |||||
| 562 | ES_CXN=Hijk ES=localhost:9200 make test | ||||
| 563 | |||||
| 564 | =head1 AUTHOR | ||||
| 565 | |||||
| 566 | Clinton Gormley <drtech@cpan.org> | ||||
| 567 | |||||
| 568 | =head1 COPYRIGHT AND LICENSE | ||||
| 569 | |||||
| 570 | This software is Copyright (c) 2016 by Elasticsearch BV. | ||||
| 571 | |||||
| 572 | This is free software, licensed under: | ||||
| 573 | |||||
| 574 | The Apache License, Version 2.0, January 2004 | ||||
| 575 | |||||
| 576 | =cut | ||||
| 577 | |||||
| 578 | 1 | 8µs | 1 | 73µs | __END__ # spent 73µs making 1 call to B::Hooks::EndOfScope::XS::__ANON__[B/Hooks/EndOfScope/XS.pm:17] |