<?php // form for inspect $form_vars = ['method' => 'GET', 'action' => 'admin/elasticsearch/inspect', 'disable_security' => true]; echo elgg_view_form('elasticsearch/inspect', $form_vars); // result listing $result = ''; $guid = (int) get_input('guid'); if (!empty($guid)) { $registered_types = elasticsearch_get_registered_entity_types(); $entity = get_entity($guid); if (empty($entity)) { // Entity doesn't exist in Elgg $result = elgg_echo('notfound'); } elseif (!array_key_exists($entity->getType(), $registered_types) || array_key_exists($entity->getType(), $registered_types) && !empty($entity->getSubtype()) && !in_array($entity->getSubtype(), $registered_types[$entity->getType()])) { // entity won't be exported to ES $result = elgg_echo('elasticsearch:inspect:result:error:type_subtype'); } else { // show inspect result elgg_push_context('search:index'); $current_content = (array) $entity->toObject(); elgg_pop_context(); $last_indexed = $entity->getPrivateSetting(ELASTICSEARCH_INDEXED_NAME); if (is_null($last_indexed)) { $result = elgg_echo('elasticsearch:inspect:result:last_indexed:none'); } elseif (empty($last_indexed)) { $result = elgg_echo('elasticsearch:inspect:result:last_indexed:scheduled'); } else { $result = elgg_echo('elasticsearch:inspect:result:last_indexed:time', [date('c', $last_indexed)]); $result .= '<br />' . elgg_view('output/url', ['text' => elgg_echo('elasticsearch:inspect:result:reindex'), 'href' => "action/elasticsearch/admin/reindex_entity?guid={$entity->getGUID()}", 'is_action' => true, 'class' => 'elgg-button elgg-button-action']); }
/** * Get the $options for elgg_get_entities* in order to update the ElasticSearch index * * @param string $type which options to get * * @return false|array */ function elasticsearch_get_bulk_options($type = 'no_index_ts') { $type_subtypes = elasticsearch_get_registered_entity_types(); if (empty($type_subtypes)) { return false; } $dbprefix = elgg_get_config('dbprefix'); switch ($type) { case 'no_index_ts': // new or updated entities return array('type_subtype_pairs' => $type_subtypes, 'limit' => false, 'wheres' => array("NOT EXISTS (\n\t\t\t\t\t\tSELECT 1 FROM {$dbprefix}private_settings ps\n\t\t\t\t\t\tWHERE ps.entity_guid = e.guid\n\t\t\t\t\t\tAND ps.name = '" . ELASTICSEARCH_INDEXED_NAME . "'\n\t\t\t\t\t)", "NOT EXISTS (\n\t\t\t\t\t\tSELECT 1 FROM {$dbprefix}users_entity ue\n\t\t\t\t\t\tWHERE ue.guid = e.guid\n\t\t\t\t\t\tAND ue.banned = 'yes'\n\t\t\t\t\t)")); break; case 'reindex': // a reindex has been initiated, so update all out of date entities $setting = (int) elasticsearch_get_setting('reindex_ts'); if (empty($setting)) { return false; } return array('type_subtype_pairs' => $type_subtypes, 'limit' => false, 'private_setting_name_value_pairs' => array(array('name' => ELASTICSEARCH_INDEXED_NAME, 'value' => $setting, 'operand' => '<'), array('name' => ELASTICSEARCH_INDEXED_NAME, 'value' => 0, 'operand' => '>'))); break; case 'update': // content that was updated in Elgg and needs to be reindexed return array('type_subtype_pairs' => $type_subtypes, 'limit' => false, 'private_setting_name_value_pairs' => array(array('name' => ELASTICSEARCH_INDEXED_NAME, 'value' => 0))); break; case 'count': // content that needs to be indexed return array('type_subtype_pairs' => $type_subtypes, 'count' => true); break; } return false; }
/** * Check if the given entity is searchable (and needs to be in Elasticsearch) * * @param \ElggEntity $entity the entity * * @return bool */ protected static function isSearchableEntity(\ElggEntity $entity) { if (empty($entity) || !$entity instanceof \ElggEntity) { return false; } $type = $entity->getType(); $type_subtypes = elasticsearch_get_registered_entity_types(); if (!isset($type_subtypes[$type])) { return false; } $subtype = $entity->getSubtype(); if (empty($subtype)) { // eg. user, group, site return true; } return in_array($subtype, $type_subtypes[$type]); }