これはMagento CE 1.6以降で正常に動作します。
$event = Mage::getSingleton('index/indexer')->logEvent(
    $product,
    $product->getResource()->getType(),
    Mage_Index_Model_Event::TYPE_SAVE,
    false
);
Mage::getSingleton('index/indexer')
    ->getProcessByCode('catalog_url') // Adjust the indexer process code as needed
    ->setMode(Mage_Index_Model_Process::MODE_REAL_TIME)
    ->processEvent($event);
使用可能なインデクサーコードは、クエリを使用して表示できます。
SELECT indexer_code FROM index_process;
ネイティブのMagento 1.7には次のものがあります。
+---------------------------+
| indexer_code              |
+---------------------------+
| cataloginventory_stock    |
| catalogsearch_fulltext    |
| catalog_category_flat     |
| catalog_category_product  |
| catalog_product_attribute |
| catalog_product_flat      |
| catalog_product_price     |
| catalog_url               |
| groupscatalog2_category   |
| groupscatalog2_product    |
| tag_summary               |
+---------------------------+
Magento EE 1.13では異なります。そこでは、インデクサーはcronの実行ごと(毎分)に変更されたエンティティを自動的に取得します。
更新   
上記の答えは100%正解ですが、私は以下の情報でさらに何かを追加できると思います。
- 製品のいくつかの属性値のみを変更し、相対インデックステーブルを自動的に更新する必要がある場合は、次の関数を使用できます。
- Mage::getSingleton('catalog/product_action')->updateAttributes();
 
- 独自に再インデックスを管理したい場合は、代わりにリソースモデルを使用します。 - Mage::getResourceSingleton('catalog/product_action')->updateAttributes();
 
たとえば、次の関数を使用して、製品の特定の属性のみを高速に更新します。
 public function updateProductAttribute($product_id, $arrayChanges, $reindex = true)
{
    if (!is_array($product_id)) {
        $product_id = array($product_id);
    }
    // ths should trigger all required reindex
    $update = Mage::getSingleton('catalog/product_action');
    // Update value
    if (!$reindex) {
        $update = Mage::getResourceSingleton('catalog/product_action');
    }
    $update->updateAttributes($product_id, $arrayChanges, 0);
}
注意:  
製品のグループで同じ属性/値の組み合わせを変更する必要がある場合、配列全体を渡すことができますproduct_ids