Drupal Elastic Custom Indexing Functions
<?php
/**
* Prepares a node to be added to elastic
*
* @param $node
* @return array
*/
function _elastic_prepare_node($node) {
if ( ! is_object($node)) {
return;
}
$params = array(
'index' => 'node',
'type' => $node->type,
'body' => array(),
);
// Add the simple properties
$wanted = array('vid', 'uid', 'title', 'log', 'status', 'comment', 'promote', 'sticky', 'nid', 'type', 'language', 'created', 'changed', 'revision_timestamp', 'revision_uid');
$exist = array_filter($wanted, function($property) use($node) {
return property_exists($node, $property);
});
foreach ($exist as $field) {
$params['body'][$field] = $node->{$field};
}
// Add the body field if exists
$body_field = isset($node->body) ? field_get_items('node', $node, 'body') : false;
if ($body_field) {
$params['body']['body'] = $body_field;
}
// Add the image field if exists
$image_field = isset($node->field_image) ? field_get_items('node', $node, 'field_image') : false;
if ($image_field) {
$params['body']['field_image'] = array_map(function($img) {
$img = file_load($img['fid']);
$img->url = file_create_url($img->uri);
return $img;
}, $image_field);
}
return $params;
}
/**
* Helper function that returns a node from Elastic by its nid.
*
* @param $client
* @param $node
* @return mixed
*/
function _elastic_perform_node_search_by_id($client, $node) {
$search = array(
'index' => 'node',
'type' => $node->type,
'version' => true,
'body' => array(
'query' => array(
'match' => array(
'nid' => $node->nid,
),
),
),
);
return $client->search($search);
}
/**
* Implements hook_node_insert().
*/
function elastic_node_insert($node) {
$client = elasticsearch_connector_get_client_by_id('my_cluster_id');
$params = _elastic_prepare_node($node);
if ( ! $params) {
drupal_set_message(t('There was a problem saving this node to Elastic.'));
return;
}
$result = $client->index($params);
if ($result && $result['created'] === false) {
drupal_set_message(t('There was a problem saving this node to Elastic.'));
return;
}
drupal_set_message(t('The node has been saved to Elastic.'));
}
/**
* Implements hook_node_update().
*/
function elastic_node_update($node) {
if ($node->is_new !== false) {
return;
}
$client = elasticsearch_connector_get_client_by_id('my_cluster_id');
$params = _elastic_prepare_node($node);
if ( ! $params) {
drupal_set_message(t('There was a problem updating this node in Elastic.'));
return;
}
$result = _elastic_perform_node_search_by_id($client, $node);
if ($result && $result['hits']['total'] !== 1) {
drupal_set_message(t('There was a problem updating this node in Elastic.'));
return;
}
$params['id'] = $result['hits']['hits'][0]['_id'];
$version = $result['hits']['hits'][0]['_version'];
$index = $client->index($params);
if ($index['_version'] !== $version + 1) {
drupal_set_message(t('There was a problem updating this node in Elastic.'));
return;
}
drupal_set_message(t('The node has been updated in Elastic.'));
}
/**
* Implements hook_node_delete().
*/
function elastic_node_delete($node) {
$client = elasticsearch_connector_get_client_by_id('my_cluster_id');
// If the node is in Elastic, remove it
$result = _elastic_perform_node_search_by_id($client, $node);
if ($result && $result['hits']['total'] !== 1) {
drupal_set_message(t('There was a problem deleting this node in Elastic.'));
return;
}
$params = array(
'index' => 'node',
'type' => $node->type,
'id' => $result['hits']['hits'][0]['_id'],
);
$result = $client->delete($params);
if ($result && $result['found'] !== true) {
drupal_set_message(t('There was a problem deleting this node in Elastic.'));
return;
}
drupal_set_message(t('The node has been deleted in Elastic.'));
}