Reindex एकल उत्पाद


10

मैं एक अद्यतन के बाद एक ही उत्पाद को फिर से जोड़ना चाहूंगा।

अब मैं उपयोग करता हूं:

$product = Mage::getModel('catalog/product')->loadByAttribute('sku', 'foobar');
// edit something
$product->save();

$stockItem = Mage::getModel('cataloginventory/stock_item')->loadByProduct($product->getId());
$stockItem->setForceReindexRequired(true);

Mage::getSingleton('index/indexer')->processEntityAction(
    $stockItem,
    Mage_CatalogInventory_Model_Stock_Item::ENTITY,
    Mage_Index_Model_Event::TYPE_SAVE
);

$product
    ->setForceReindexRequired(true)
    ->setIsChangedCategories(true);

Mage::getSingleton('index/indexer')->processEntityAction(
    $product,
    Mage_Catalog_Model_Product::ENTITY,
    Mage_Index_Model_Event::TYPE_SAVE
);

लेकिन यह काम नहीं करता है, कोई विचार?

पुनश्च: $product->getId()मौजूदा और सही है।

जवाबों:


11

यह 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 में यह अलग है, वहाँ अनुक्रमणिका स्वचालित रूप से प्रत्येक क्रोन रन (हर मिनट) पर परिवर्तित इकाइयाँ उठाती है।

अपडेट करें

उपरोक्त उत्तर 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


मैं यहां user5973 की टिप्पणी की प्रतिलिपि बनाऊंगा, क्योंकि इसे हटा दिया जाएगा। @Vinai क्या आप कह रहे हैं कि EE 1.13+ में उत्पाद संबंधी डेटा को रीइन्डेक्स करते समय यह प्रदर्शन समस्याएँ नहीं हैं? हम कहां पुष्टि कर सकते हैं कि ईई इंडेक्स स्वचालित रूप से केवल उन लोगों की बदली हुई संस्थाओं और प्रक्रियाओं को उठाता है?
फेबियन ब्लेसश्मिद्ट

EE 1.13 में अनुक्रमणिका किसी DB स्तर पर किसी भी परिवर्तन को लेने के लिए MySQL ट्रिगर्स का उपयोग करता है और एक चैंज टेबल में अपडेट की गई इकाई ID को रिकॉर्ड करता है। इन चैंज को फिर क्रोनोजर के जरिए प्रोसेस किया जाता है।
विनय

2

मुझे लगता है कि आप का मतलब है कि आप एक उत्पाद reindex करना चाहते हैं जब आप इसे व्यवस्थापक ui में संपादित करेंगे। सबसे आसान तरीका सिर्फ इंडेक्सर मोड को "सेव पर अपडेट" करना है। आपको यह उन सभी उत्पादों से संबंधित इंडेक्सर्स के लिए करना होगा जो आप उपयोग कर रहे हैं, शायद इसमें शामिल हैं: उत्पाद विशेषताएँ, उत्पाद मूल्य, उत्पाद फ्लैट डेटा, श्रेणी उत्पाद, स्टॉक स्थिति।

यह शायद उत्पाद की बचत को धीमा कर देगा।

वैकल्पिक रूप से शायद यह लिंक मदद करेगा। कृपया टिप्पणियों को देखें और साथ ही उनका वर्णन करें कि स्टॉक को कैसे अपडेट किया जाए। http://www.magentocommerce.com/answers/discussion/239/reindex-one-product-at-a-time/p1


2

सुनिश्चित करें कि आप ऐसा न तो फ़्रंटेंड पर कर रहे हैं और न ही स्क्रिप्ट को अपग्रेड करने के लिए कर रहे हैं, और वर्तमान में लोड की गई दुकान "एडमिन" है। अन्यथा, $ उत्पाद-> सहेजें () बिल्कुल काम नहीं करेगा। पहले जांचें, कि किसी उत्पाद को सहेजने का प्रभाव है।


2

@ Feversocial के जवाब के अलावा यह भी सुनिश्चित करें कि आपके पास वह सब कुछ है जो $ उत्पाद बुलाने से पहले उत्पाद पर लोड करने की आवश्यकता है-> सहेजें ()। अन्यथा बचत वास्तव में उस उत्पाद से चीजों को हटा सकती है जिसे मैंने कठिन तरीके से अनुभव किया है।

जैसे बिना SKU के उत्पाद को बचाना जो तब सभी url को फिर से लिखता है और पूरी साइट को इस उत्पाद पृष्ठ पर पुनर्निर्देशित करता है: P: P


अच्छी बात है, इसीलिए मुझे लगता है कि catolog/product_actionदृष्टिकोण का उपयोग करना बेहतर है ताकि आप उपरोक्त मुद्दे को जोखिम में न
Fra

1

मैं ये जानकारी पूरे परिदृश्य को थोड़ा बेहतर समझने के लिए उपयोगी हो सकता हूं।

  • यदि आपको केवल एक विशेषता मान बदलने की आवश्यकता है और आप इस फ़ंक्शन का उपयोग कर सकने वाले सापेक्ष सूचकांक तालिका को स्वचालित रूप से अपडेट कर सकते हैं: 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);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.