Magento重新索引失去了Solr文档

时间:2012-09-27 14:45:19

标签: magento solr

这让我有点疯狂。我在运行SOLR的情况下运行Magento EE 1.11.1。我们有一个每晚运行的cron,它重新索引整个站点。每次执行此操作时,我都会检查SOLR配置, numDocs maxDocs 值只是当前应编入索引的一小部分(27000对比~90000)。 这意味着当我在网站上进行搜索时,搜索结果只是它们的一小部分。

使搜索正常工作的唯一方法是停止SOLR,删除并重新创建/ apache-solr / site_name / solr / data文件夹,重新启动,并通过shell重新索引目录搜索索引。如果我试图通过shell 运行这个特定的reindex而不用删除并重新创建数据文件夹,那么我只能获得大约一半的文档(~51000)。

数据文件夹中的所有索引文件都归root所有,SOLR jar以root身份运行。我将所有日志设置为警告,但当前没有记录任何内容。我使用Solr管理其他站点并且从未遇到过这个问题 - 但是这个安装有许多属性(330)和许多产品(~100,000)。这可能是问题的一部分吗?谢谢!

5 个答案:

答案 0 :(得分:3)

EE1.12可能也不是解决方案。我们在EE1.12上有一个客户端,它在SOLR集成方面遇到了问题。在他们的情况下,索引器访问自定义产品属性时,所有索引尝试都会失败。

Nexcess和Magento的支持已经为此工作超过6周,Magento支持的当前状态是 -

  

不幸的是,补丁仍在开发中,我无法就开发人员何时完成补丁提供建议。

答案 1 :(得分:3)

由于Enterprise_Search模块添加了一个默认情况下每天凌晨3点运行的cronjob,我找到了比向文件shell/abstract.php添加一行代码更好的解决方案。

您需要做的就是创建一个小模块,将某个事件添加到全局命名空间而不是admin:

<?xml version="1.0"?>
<config>
    <modules>
        <YourNamespace_YourModuleName>
             <version>0.0.1</version>
        </YourNamespace_YourModuleName>
    </modules>
    <global>
        <events>
            <!-- The misspelling (cat-e-logsearch) is correct, you can look it up in the config.xml of the Enterprise_Search module -->
            <catelogsearch_searchable_attributes_load_after>
                <observers>
                    <enterprise_search>
                        <class>enterprise_search/observer</class>
                        <method>storeSearchableAttributes</method>
                    </enterprise_search>
                </observers>
            </catelogsearch_searchable_attributes_load_after>
        </events>
    </global>
</config>

不要忘记通过在app/etc/modules/YourNamespace_YourModuleName.xml

放置另一个配置文件来激活您的模块
<?xml version="1.0"?>
<config>
    <modules>
        <YourNamespace_YourModuleName>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Enterprise_Search/>
            </depends>
        </YourNamespace_YourModuleName>
    </modules>
</config>

现在,您可以通过从Magento根文件夹发出以下命令从命令行重建Solr索引(假设您有shell访问权限):

php shell/indexer.php --reindex catalogsearch_fulltext

答案 2 :(得分:2)

在检查了几天的解决方案后(偶然碰到这个问题),我想我有一个解决方案。我测试了它,我没有看到任何错误出现。

# shell/abstract.php @ line 75
public function __construct()
{
    if ($this->_includeMage) {
        require_once $this->_getRootPath() . 'app' . DIRECTORY_SEPARATOR . 'Mage.php';
        Mage::app($this->_appCode, $this->_appType);
        Mage::app()->addEventArea('adminhtml');# the magic line
    }

    $this->_applyPhpVariables();
    $this->_parseArgs();
    $this->_construct();
    $this->_validate();
    $this->_showHelp();
}

问题是enterprise_search/observer未加载,因此可以触发storeSearchableAttributes方法。这导致各种额外数据无法注册。

我能想到的唯一副作用是,现在shell 执行将加载所有管理员观察者。这可能会导致速度降低,从而破坏了从shell运行的部分目的。它不会像浏览器那么慢,但它可能比以前慢。

如果您有任何问题或认为我可能会以其他方式提供帮助,请告诉我们!

答案 3 :(得分:1)

在运行索引器时,您是否花了一些时间查看solr日志?我们目前正在运行1.12,甚至在那里发现了solr的几个问题。当solr通知我们一个错误时,我们不得不进行故障排除。

我的回答在我的回答中:Magento 1.12 and Solr 3.6 No proper results and no spell suggestions

我认为这个建议适用于1.11,但你可能需要稍微修改一下。 打开./app/code/core/Enterprise/Search/Model/Adapter/Abstract.php 并找到prepareDocsPerStore。

您可以监视并记录发送给solr的文档作为完整性检查。所以你可以在$ docs [] = $ doc下面做一些快速而又脏的事情。 像:

$ solr_log_file ='/ mnt / tmp /'。date('Y-m-d',time())。'/'。$ storeId。' - '。$ productctId.'-solr.txt'; file_put_contents($ solr_log_file,var_export($ doc,true)); 警告:我可能会遇到一些语法错误,因为我刚刚解决了这个问题。

在此行之前和之后执行$ productIndexData的var_export也证明是有启发性的: $ productIndexData = $ this-&gt; _prepareIndexProductData($ productIndexData,$ productId,$ storeId);

答案 4 :(得分:0)

嗨我在这个问题上找到了另一个解决这个问题的方法,我用一个带有以下代码的小脚本

ini_set("memory_limit","1000M");
require_once "app/Mage.php";
umask(0);
Mage::app();
$observer = Mage::getModel('enterprise_search/observer');
$observer->storeSearchableAttributes();

使用名称solrindex.php并在浏览器中运行此命令,如mydomain / solrindex.php,然后从admin重新索引catalogsearch,这对我有用。