Here is an example of how to create a RESTful API with Elasticsearch using the PHP Laravel framework:
- First, you’ll need to install Elasticsearch on your server, and make sure it’s running.
- Next, you’ll need to install the Elasticsearch PHP client library by running the following command in your terminal:
composer require elasticsearch/elasticsearch
- In your Laravel project, create a new controller for your API endpoint. For example, you might create a
SearchControllerthat handles all of your Elasticsearch queries. - In the
SearchController, use the Elasticsearch PHP client to interact with your Elasticsearch cluster. For example, you might create asearch()method that takes a query string as a parameter, and then uses the client to search your Elasticsearch index for matching documents.
use Elasticsearch\ClientBuilder;
class SearchController extends Controller
{
public function search($query)
{
$client = ClientBuilder::create()->build();
$params = [
'index' => 'my_index',
'type' => 'my_type',
'body' => [
'query' => [
'match' => [
'title' => $query
]
]
]
];
$response = $client->search($params);
return $response;
}
}- In your
routes/web.phporroutes/api.phpfile, create a new route that maps to thesearch()method in yourSearchController.
Route::get('search/{query}', 'SearchController@search');This is a simple example, but you can customize it to suit your needs. You can also use other Elasticsearch features like pagination, sorting, and filtering.
Please note that this is just a sample code, and you may need to make some adjustments to match your specific Elasticsearch setup and your requirements. Also, you should consider security and performance issues when building a production-ready RESTful API with Elasticsearch.
Set domain name
Here is an example of how to configure the Elasticsearch PHP client to connect to an Elasticsearch cluster using a domain name:
use Elasticsearch\ClientBuilder;
class SearchController extends Controller
{
public function search($query)
{
$client = ClientBuilder::create()
->setHosts(["https://my-elasticsearch-domain.com"])
->build();
$params = [
'index' => 'my_index',
'type' => 'my_type',
'body' => [
'query' => [
'match' => [
'title' => $query
]
]
]
];
$response = $client->search($params);
return $response;
}
}
This code sets the host for the client to the domain name of your Elasticsearch cluster.
Here the client is set to use HTTPS, if you’re using Elasticsearch on a non-default port or if your Elasticsearch cluster is running on HTTP instead of HTTPS, you can specify the port number in the host string like this:
->setHosts(["http://my-elasticsearch-domain.com:9200"])
You can also set multiple hosts if you have a cluster of Elasticsearch nodes to connect to. This is useful if you want to connect to multiple nodes in case of node failure.
->setHosts(["https://my-elasticsearch-domain1.com","https://my-elasticsearch-domain2.com"])
Using secret token
Here is an example of how to create a new Elasticsearch index using the PHP Laravel framework and a secret token passed in by the client:
- In your
SearchControllercreate a method for creating the index, for examplecreateIndex().
use Elasticsearch\ClientBuilder;
class SearchController extends Controller
{
public function createIndex(Request $request)
{
// Verify the secret token passed in by the client
$secret = $request->input('secret');
if ($secret != 'mysecret') {
return response()->json(['error' => 'Invalid secret token'], 401);
}
$client = ClientBuilder::create()
->setHosts(["https://my-elasticsearch-domain.com"])
->build();
$params = [
'index' => 'my_new_index',
'body' => [
'settings' => [
'number_of_shards' => 3,
'number_of_replicas' => 2
]
]
];
$response = $client->indices()->create($params);
return response()->json($response);
}
}- In your
routes/web.phporroutes/api.phpfile, create a new route that maps to thecreateIndex()method in yourSearchController.
Route::post('create-index', 'SearchController@createIndex');
- On the client side, when making the request to create the index, include the secret token in the request body.
fetch('/create-index', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({secret: 'mysecret'}),
})
.then(response => response.json())
.then(data => {
console.log('Success:', data);
})
.catch((error) => {
console.error('Error:', error);
});
This is a simple example, but you can customize it to suit your needs. You can also add validation for the request body before creating the index.
Please note that this is just a sample code, and you may need to make some adjustments to match your specific Elasticsearch setup and your requirements. Also, you should consider security and performance issues when building a production-ready RESTful API with Elasticsearch.

English



