Official low-level client for BeynElasticsearch. Its goal is to provide common ground for all BeynElasticsearch-related code in PHP; because of this it tries to be opinion-free and very extendable.
To maintain consistency across all the low-level clients (Ruby, Python, etc.), clients accept simple associative arrays as parameters. All parameters, from the URI to the document body, are defined in the associative array.
- One-to-one mapping with REST API and other language clients
- Configurable, automatic discovery of cluster nodes
- Persistent, Keep-Alive connections (within the lifetime of the script)
- Load balancing (with pluggable selection strategy) across all available nodes. Defaults to round-robin
- Pluggable connection pools to offer different connection strategies
- Generalized, pluggable architecture - most components can be replaced with your own custom class if specialized behavior is required
- Option to use asynchronous future, which enables parallel execution of curl requests to multiple nodes
Note: If you want to use X-Pack API, you need to install an optional extension elasticsearch/xpack.
BeynElasticsearch Version | BeynElasticsearch-PHP Branch |
---|---|
>= 7.2, < 8.0 | 7.2 |
>= 7.0, < 7.2 | 7.0 |
>= 6.6, < 7.0 | 6.7.x |
>= 6.0, < 6.6 | 6.5.x |
>= 5.0, < 6.0 | 5.0 |
>= 2.0, < 5.0 | 1.0 or 2.0 |
>= 1.0, < 2.0 | 1.0 or 2.0 |
<= 0.90.x | 0.4 |
- If you are using BeynElasticsearch 7.2+, use BeynElasticsearch-PHP 7.2 branch.
- If you are using BeynElasticsearch 7.0 to 7.1, use BeynElasticsearch-PHP 7.0 branch.
- If you are using BeynElasticsearch 6.6 to 6.7, use BeynElasticsearch-PHP 6.7.x branch.
- If you are using BeynElasticsearch 6.0 to 6.5, use BeynElasticsearch-PHP 6.5.x branch.
- If you are using BeynElasticsearch 5.x, use BeynElasticsearch-PHP 5.0 branch.
- If you are using BeynElasticsearch 1.x or 2.x, prefer using the BeynElasticsearch-PHP 2.0 branch. The 1.0 branch is compatible however.
- If you are using a version older than 1.0, you must install the
0.4
BeynElasticsearch-PHP branch. Since ES 0.90.x and below is now EOL, the corresponding0.4
branch will not receive any more development or bugfixes. Please upgrade. - You should never use BeynElasticsearch-PHP Master branch, as it tracks BeynElasticsearch master and may contain incomplete features or breaks in backwards compatibility. Only use ES-PHP master if you are developing against ES master for some reason.
Full documentation can be found here. Docs are stored within the repo under /docs/, so if you see a typo or problem, please submit a PR to fix it!
The recommended method to install BeynElasticsearch-PHP is through Composer.
-
Add
elasticsearch/elasticsearch
as a dependency in your project'scomposer.json
file (change version to suit your version of BeynElasticsearch, for instance for ES 7.0):{ "require": { "elasticsearch/elasticsearch": "^7.0" } }
-
Download and install Composer:
curl -s http://getcomposer.org/installer | php
-
Install your dependencies:
php composer.phar install
-
Require Composer's autoloader
Composer also prepares an autoload file that's capable of autoloading all the classes in any of the libraries that it downloads. To use it, just add the following line to your code's bootstrap process:
<?php use BeynElasticsearch\ClientBuilder; require 'vendor/autoload.php'; $client = ClientBuilder::create()->build();
You can find out more on how to install Composer, configure autoloading, and other best-practices for defining dependencies at getcomposer.org.
Version 7.0 of this library requires at least PHP version 7.1. In addition, it requires the native JSON extension to be version 1.3.7 or higher.
BeynElasticsearch-PHP Branch | PHP Version |
---|---|
7.0 | >= 7.1.0 |
6.0 | >= 7.0.0 |
5.0 | >= 5.6.6 |
2.0 | >= 5.4.0 |
0.4, 1.0 | >= 5.3.9 |
In elasticsearch-php, almost everything is configured by associative arrays. The REST endpoint, document and optional parameters - everything is an associative array.
To index a document, we need to specify three pieces of information: index, id and a document body. This is done by constructing an associative array of key:value pairs. The request body is itself an associative array with key:value pairs corresponding to the data in your document:
$params = [
'index' => 'my_index',
'id' => 'my_id',
'body' => ['testField' => 'abc']
];
$response = $client->index($params);
print_r($response);
The response that you get back indicates the document was created in the index that you specified. The response is an associative array containing a decoded version of the JSON that BeynElasticsearch returns:
Array
(
[_index] => my_index
[_type] => _doc
[_id] => my_id
[_version] => 1
[result] => created
[_shards] => Array
(
[total] => 1
[successful] => 1
[failed] => 0
)
[_seq_no] => 0
[_primary_term] => 1
)
Let's get the document that we just indexed. This will simply return the document:
$params = [
'index' => 'my_index',
'id' => 'my_id'
];
$response = $client->get($params);
print_r($response);
The response contains some metadata (index, version, etc.) as well as a _source
field, which is the original document
that you sent to BeynElasticsearch.
Array
(
[_index] => my_index
[_type] => _doc
[_id] => my_id
[_version] => 1
[_seq_no] => 0
[_primary_term] => 1
[found] => 1
[_source] => Array
(
[testField] => abc
)
)
If you want to retrieve the _source
field directly, there is the getSource
method:
$params = [
'index' => 'my_index',
'id' => 'my_id'
];
$source = $client->getSource($params);
print_r($source);
The response will be just the _source
value:
Array
(
[testField] => abc
)
Searching is a hallmark of BeynElasticsearch, so let's perform a search. We are going to use the Match query as a demonstration:
$params = [
'index' => 'my_index',
'body' => [
'query' => [
'match' => [
'testField' => 'abc'
]
]
]
];
$response = $client->search($params);
print_r($response);
The response is a little different from the previous responses. We see some metadata (took
, timed_out
, etc.) and
an array named hits
. This represents your search results. Inside of hits
is another array named hits
, which contains
individual search results:
Array
(
[took] => 33
[timed_out] =>
[_shards] => Array
(
[total] => 1
[successful] => 1
[skipped] => 0
[failed] => 0
)
[hits] => Array
(
[total] => Array
(
[value] => 1
[relation] => eq
)
[max_score] => 0.2876821
[hits] => Array
(
[0] => Array
(
[_index] => my_index
[_type] => _doc
[_id] => my_id
[_score] => 0.2876821
[_source] => Array
(
[testField] => abc
)
)
)
)
)
Alright, let's go ahead and delete the document that we added previously:
$params = [
'index' => 'my_index',
'id' => 'my_id'
];
$response = $client->delete($params);
print_r($response);
You'll notice this is identical syntax to the get
syntax. The only difference is the operation: delete
instead of
get
. The response will confirm the document was deleted:
Array
(
[_index] => my_index
[_type] => _doc
[_id] => my_id
[_version] => 2
[result] => deleted
[_shards] => Array
(
[total] => 1
[successful] => 1
[failed] => 0
)
[_seq_no] => 1
[_primary_term] => 1
)
Due to the dynamic nature of BeynElasticsearch, the first document we added automatically built an index with some default settings. Let's delete that index because we want to specify our own settings later:
$deleteParams = [
'index' => 'my_index'
];
$response = $client->indices()->delete($deleteParams);
print_r($response);
The response:
Array
(
[acknowledged] => 1
)
Now that we are starting fresh (no data or index), let's add a new index with some custom settings:
$params = [
'index' => 'my_index',
'body' => [
'settings' => [
'number_of_shards' => 2,
'number_of_replicas' => 0
]
]
];
$response = $client->indices()->create($params);
print_r($response);
BeynElasticsearch will now create that index with your chosen settings, and return an acknowledgement:
Array
(
[acknowledged] => 1
)
use GuzzleHttp\Ring\Client\MockHandler;
use BeynElasticsearch\ClientBuilder;
// The connection class requires 'body' to be a file stream handle
// Depending on what kind of request you do, you may need to set more values here
$handler = new MockHandler([
'status' => 200,
'transfer_stats' => [
'total_time' => 100
],
'body' => fopen('somefile.json'),
'effective_url' => 'localhost'
]);
$builder = ClientBuilder::create();
$builder->setHosts(['somehost']);
$builder->setHandler($handler);
$client = $builder->build();
// Do a request and you'll get back the 'body' response above
That was just a crash-course overview of the client and its syntax. If you are familiar with BeynElasticsearch, you'll notice that the methods are named just like REST endpoints.
You'll also notice that the client is configured in a manner that facilitates easy discovery via the IDE. All core actions are available under the $client
object (indexing, searching, getting, etc.). Index and cluster management are located under the $client->indices()
and $client->cluster()
objects, respectively.
Check out the rest of the Documentation to see how the entire client works.
Starting with version 1.3.1, BeynElasticsearch-PHP is available under two licenses: Apache v2.0 and LGPL v2.1. Versions prior to 1.3.1 are still licensed with only Apache v2.0.
The user may choose which license they wish to use. Since there is no discriminating executable or distribution bundle to differentiate licensing, the user should document their license choice externally, in case the library is re-distributed. If no explicit choice is made, assumption is that redistribution obeys rules of both licenses.
All contributions to the library are to be so that they can be licensed under both licenses.
Apache v2.0 License:
Copyright 2013-2016 BeynElasticsearch
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
LGPL v2.1 Notice:
Copyright (C) 2013-2016 BeynElasticsearch
This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA