【问题标题】:Magento reindexing loses Solr docsMagento 重新索引丢失 Solr 文档
【发布时间】:2012-09-27 14:45:19
【问题描述】:

这让我有点发疯。我正在运行 SOLR 的 Magento EE 1.11.1。我们有一个每天晚上运行的 cron,它重新索引整个站点。每次执行此操作时,我都会检查 SOLR 配置,并且 numDocsmaxDocs 值只是当前应索引的值的一小部分(27000 与 ~90000)。 这意味着当我在网站上进行搜索时,结果只是应有的一小部分。

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

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

【问题讨论】:

  • 企业支持怎么说?
  • 在 1.12 中有很多与 solr 相关的修复:concisedeveloper.com/magento/release-notes-ee1-12,也许你会看到一些在 1.12 中修复的错误。
  • @benmarks 将您来自现场站点的所有 ssh/db 凭据提供给我们,我们会尽快回复您...
  • 标题为“已修复:启用 SOLR 时前端缺少产品”的修复有点吓人……听起来在 1.12 中修复了很多关于 SOLR 的问题。我继续调试并找到了这个问题的根源,但到目前为止还没有运气!
  • 对于所有感兴趣的人,我可能已经找到了解决方案,我很好奇你们是否还有问题。请检查我的答案以获取可能的解决方案,并对您仍然面临的任何和所有问题发表评论。

标签: magento solr


【解决方案1】:

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

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

不幸的是,该补丁仍在开发中,我无法告知我们的开发人员何时会完成它。

【讨论】:

  • 很高兴知道我不会发疯。这是在任何地方的面向公众的支持票中吗?祝你好运。
  • 不 - 没有公开票,这是 Magento EE 支持。昨天我们收到一条通知,支持开发人员说我们在搜索结果页面上遗漏了一些块。现在,我不知道前面的块如何影响 Magento - SOLR 索引 - 但我们还是尝试了它。不用说,它并没有解决问题。
  • @GregC 检查我的答案是否有可能的修复。
【解决方案2】:

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

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

<?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

【讨论】:

【解决方案3】:

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

# 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 运行的部分目的。它不会像浏览器那么慢,但它可能会比以前慢。

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

【讨论】:

  • 适用于 EE 1.12.0.2 !谢谢赫兹。
【解决方案4】:

您在运行索引器时是否花一些时间查看 solr 日志?我们目前正在运行 1.12,发现 solr 存在一些问题。当 solr 通知我们错误时,我们必须进行故障排除。

我的 cmets 在我的回答中: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.'-'.$productId.'-solr.txt'; file_put_contents($solr_log_file, var_export($doc, true)); 警告:我可能有一些语法错误,因为我刚刚敲定了这一点。

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

【讨论】:

    【解决方案5】:

    您好,我已经找到了解决此问题的另一种方法,我用以下代码制作了一个小脚本

    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 等浏览器中运行它,然后我从管理员重新索引目录搜索,这对我有用。

    【讨论】:

    • 谢谢 - 但这不适用于 ee 1.12.0.2 -- “PHP 致命错误:在 /app/code/core/Enterprise/Search 中的非对象上调用成员函数 getEvent() /Model/Observer.php on line 171" 我会四处挖掘,看看我能找到什么
    猜你喜欢
    • 2011-05-27
    • 2021-02-03
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 2017-03-05
    • 1970-01-01
    相关资源
    最近更新 更多