Skip to content

Commit

Permalink
Merge pull request #4 from gdubost/feature/27353
Browse files Browse the repository at this point in the history
[FEATURE#27353] Ajouter la possibilité de gérer différents indexes
  • Loading branch information
SparSio committed Apr 11, 2016
2 parents c40f6df + f489f0e commit ffe5b7e
Show file tree
Hide file tree
Showing 3 changed files with 80 additions and 46 deletions.
43 changes: 38 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,17 +31,50 @@ Modifier `composer.json` :
Dans le fichier d'env :

```
putenv("APP_NAME_ELASTICSEARCH_HOST=http://elasticsearch.etna-alternance.eu:9200/app_name");
putenv("APP_NAME_ELASTICSEARCH_TYPE=my_type");
putenv("INDEX_NAME_ELASTICSEARCH_HOST=http://elasticsearch.etna-alternance.eu:9200/index_name");
putenv("INDEX_NAME_ELASTICSEARCH_TYPE=my_type");
putenv("OTHER_INDEX_NAME_ELASTICSEARCH_HOST=http://elasticsearch.etna-alternance.eu:9200/other_index_name");
putenv("OTHER_INDEX_NAME_ELASTICSEARCH_TYPE=my_other_type");
```

###Register

Créer une classe `IndexElasticsearch` qui hérite de `AbstractEtnaIndexer`
Pour chaque index différent créer une classe `IndexElasticsearch` qui hérite de `AbstractEtnaIndexer`

```
use ETNA\Silex\Provider\Elasticsearch\AbstractETNAIndexer;
use Silex\Application;
class IndexNameElasticsearchIndexer extends AbstractETNAIndexer
{
public function __construct(Application $app)
{
parent::__construct($app, "index_name");
}
public function reindex()
{
//Code here
}
public function putDocument(Entity $entity = null)
{
//Code here
}
public function removeDocument(Entity $entity = null)
{
//Code here
}
}
```

Puis dans le fichier de configuration :

```
$app["elasticsearch.indexer"] = new IndexElasticsearch($app);
$app->register(new ETNA\Silex\Provider\Elasticsearch\ElasticSearch(['app_name']));
$app["elasticsearch.index_name.indexer"] = new IndexNameElasticsearchIndexer($app);
$app["elasticsearch.other_index_name.indexer"] = new OtherIndexNameElasticsearchIndexer($app);
$app->register(new ETNA\Silex\Provider\Elasticsearch\ElasticSearch(['index_name', 'other_index_name']));
```
11 changes: 6 additions & 5 deletions src/AbstractEtnaIndexer.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,13 @@ abstract class AbstractEtnaIndexer
/**
* @param Application $app
*/
public function __construct(Application $app)
public function __construct(Application $app, $name)
{
$this->app = $app;
$this->app['elasticsearch.reindex'] = [$this, 'reindex'];
$this->app['elasticsearch.put_document'] = [$this, 'putDocument'];
$this->app['elasticsearch.remove_document'] = [$this, 'removeDocument'];
$this->app = $app;

$this->app["elasticsearch.{$name}.reindex"] = [$this, 'reindex'];
$this->app["elasticsearch.{$name}.put_document"] = [$this, 'putDocument'];
$this->app["elasticsearch.{$name}.remove_document"] = [$this, 'removeDocument'];
}

/**
Expand Down
72 changes: 36 additions & 36 deletions src/Elasticsearch.php
Original file line number Diff line number Diff line change
Expand Up @@ -56,32 +56,32 @@ public function register(Container $app)
throw new \Exception('$app["application_path"] is not set');
}

// On vérifie qu'on a bien un indexer
if (false === isset($app["elasticsearch.indexer"]) ||
false === is_subclass_of($app["elasticsearch.indexer"], "ETNA\Silex\Provider\Elasticsearch\AbstractETNAIndexer")) {
throw new \Exception('You must provide $app["elasticsearch.indexer see AbstractETNAIndexer"]');
}
$app["elasticsearch.names"] = array_keys($this->es_options);
foreach ($this->es_options as $name => $es_option) {
// On vérifie qu'on a bien un indexer
if (false === isset($app["elasticsearch.{$name}.indexer"]) ||
false === is_subclass_of($app["elasticsearch.{$name}.indexer"], "ETNA\Silex\Provider\Elasticsearch\AbstractETNAIndexer")) {
throw new \Exception('You must provide $app["elasticsearch.{$name}.indexer"] see AbstractETNAIndexer');
}

foreach ($this->es_options as $es_option) {
$parsed_url = parse_url($es_option['host']);
$index = ltrim($parsed_url['path'], '/');

$app["elasticsearch.server"] = str_replace($parsed_url['path'], '', $es_option['host']) . "/";
$app["elasticsearch.index"] = $index;
$app["elasticsearch.type"] = $es_option['type'];
break;
}
$app["elasticsearch.{$name}.server"] = str_replace($parsed_url['path'], '', $es_option['host']) . "/";
$app["elasticsearch.{$name}.index"] = $index;
$app["elasticsearch.{$name}.type"] = $es_option['type'];

$app["elasticsearch"] = ClientBuilder::create()
->setHosts([$app["elasticsearch.server"]])
$app["elasticsearch.{$name}"] = ClientBuilder::create()
->setHosts([$app["elasticsearch.{$name}.server"]])
->build();
}

$app['elasticsearch.create_index'] = [$this, 'createIndex'];
$app['elasticsearch.lock'] = [$this, 'lock'];
$app['elasticsearch.unlock'] = [$this, 'unlock'];
}

public function createIndex($reset = false)
public function createIndex($name, $reset = false)
{
$app = $this->app;

Expand All @@ -90,77 +90,77 @@ public function createIndex($reset = false)
}

if (true === $reset) {
echo "\nCreating elasticsearch index... {$app["elasticsearch.index"]}\n";
$this->unlock();
echo "\nCreating elasticsearch index... {$app["elasticsearch.$name.index"]}\n";
$this->unlock($name);

// On supprime l'index
try {
$app["elasticsearch"]->indices()->delete(
["index" => "{$app["elasticsearch.index"]}-{$app["version"]}"]
$app["elasticsearch.{$name}"]->indices()->delete(
["index" => "{$app["elasticsearch.$name.index"]}-{$app["version"]}"]
);
} catch (\Exception $exception) {
echo "Index {$app["elasticsearch.index"]}-{$app["version"]} doesn't exist... \n";
echo "Index {$app["elasticsearch.$name.index"]}-{$app["version"]} doesn't exist... \n";
}

// On récupère les settings et les mappings pour créer l'index
$settings = json_decode(file_get_contents($app["elasticsearch_settings_path"]), true);
$mappings = json_decode(file_get_contents($app["elasticsearch_mappings_path"]), true);
$settings = json_decode(file_get_contents($app["elasticsearch_{$name}_settings_path"]), true);
$mappings = json_decode(file_get_contents($app["elasticsearch_{$name}_mappings_path"]), true);

$index_params = [
"index" => "{$app["elasticsearch.index"]}-{$app["version"]}",
"index" => "{$app["elasticsearch.$name.index"]}-{$app["version"]}",
"body" => [
"settings" => $settings,
"mappings" => $mappings
]
];

// Création de l'index
$app["elasticsearch"]->indices()->create($index_params);
$app["elasticsearch.$name"]->indices()->create($index_params);

// Rajout de l'alias
$alias = [
"index" => "{$app["elasticsearch.index"]}-{$app["version"]}",
"name" => $app["elasticsearch.index"]
"index" => "{$app["elasticsearch.$name.index"]}-{$app["version"]}",
"name" => $app["elasticsearch.{$name}.index"]
];

try {
$app["elasticsearch"]->indices()->deleteAlias($alias);
$app["elasticsearch.{$name}"]->indices()->deleteAlias($alias);
} catch (\Exception $e) {
echo "Alias doesn't exist... \n";
}
$app["elasticsearch"]->indices()->putAlias($alias);
$app["elasticsearch.{$name}"]->indices()->putAlias($alias);

echo "Index {$app["elasticsearch.index"]} created successfully!\n\n";
echo "Index {$app["elasticsearch.$name.index"]} created successfully!\n\n";
}
}

public function lock()
public function lock($name)
{
$this->lockOrUnlockElasticSearch("lock");
$this->lockOrUnlockElasticSearch($name, "lock");
}

public function unlock()
public function unlock($name)
{
$this->lockOrUnlockElasticSearch("unlock");
$this->lockOrUnlockElasticSearch($name, "unlock");
}

/**
* Bloque ou débloque les écritures sur l'elasticsearch
*
* @param string $action "lock" ou "unlock" pour faire l'action qui porte le même nom
*/
private function lockOrUnlockElasticSearch($action)
private function lockOrUnlockElasticSearch($name, $action)
{
switch (true) {
case false === isset($this->app):
case false === isset($this->app["elasticsearch.server"]):
case false === isset($this->app["elasticsearch.index"]):
case false === isset($this->app["elasticsearch.{$name}.server"]):
case false === isset($this->app["elasticsearch.{$name}.index"]):
throw new \Exception(__METHOD__ . "::{$action}: Missing parameter");
}

$action = ("lock" === $action) ? "true" : "false";

$server = $this->app["elasticsearch.server"] . $this->app["elasticsearch.index"];
$server = $this->app["elasticsearch.{$name}.server"] . $this->app["elasticsearch.{$name}.index"];
exec(
"curl -XPUT '" . $server . "/_settings' -d '
{
Expand Down

0 comments on commit ffe5b7e

Please sign in to comment.