Magento重新索引会丢失Solr文档

6
这让我有点疯狂。我正在运行Magento EE 1.11.1并且使用SOLR。我们有一个每晚运行的cron来重新索引整个网站。每次这样做时,我都会检查SOLR配置,numDocsmaxDocs的值只是目前索引数量的一小部分(27000与大约90000)。这意味着当我在网站上进行搜索时,结果只有应该有的一小部分。 唯一可以使搜索正常工作的方法是停止SOLR,删除并重新创建/apache-solr/site_name/solr/data文件夹,然后重新启动并通过Shell仅重新索引Catalog Search索引。如果我尝试通过Shell运行此特定重新索引而不删除并重新创建数据文件夹,则只能获取应该获取的文档的一半(~51000)。
数据文件夹中的所有索引文件都归root所有,SOLR jar以root身份运行。我设置了所有日志为warning,但当前没有任何日志被记录。我管理其他使用Solr的网站,从未遇到过这个问题 - 然而,在此安装中有很多属性(330个)和许多产品(~100,000)。这可能是问题的一部分吗?谢谢!

1
企业支持部门有何回应? - benmarks
1.12版本中有很多与Solr相关的修复:http://concisedeveloper.com/magento/release-notes-ee1-12/,也许你会发现其中一些已被修复的bug。 - Dmytro Zavalkin
@benmarks,请提供您在现网站点的ssh/db凭据,我们会尽快给您回复。 - FlorinelChis
修复标题为“已修复:如果启用了SOLR,则前端缺少产品”的补丁有点可怕......听起来像是在1.12版本中修复了很多关于SOLR的问题。我一直在调试并查找这个问题的根源,但到目前为止还没有成功! - 1000Nettles
对所有感兴趣的人,我可能已经找到了一个解决方案,我很好奇你们中是否还有问题。请检查我的答案以获取可能的修复程序,并在您仍然面临任何问题时进行评论。 - Khez
5个回答

3

由于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根文件夹发出以下命令(假设您具有shell访问权限)来从命令行重建Solr索引:
php shell/indexer.php --reindex catalogsearch_fulltext

1
哎呀,我忘记给出正确的来源了:http://www.magentocommerce.com/boards/viewthread/290878/#t421155 - minzwurst
谢谢 minzwurst - 但是我们发现这个问题在1.12.0.2中。而且在这个版本中,事件已经被移动到全局作用域了。 - GregC

3

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

Nexcess和Magento支持团队已经在此工作了6周以上,目前Magento支持团队的状态是 -

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


很高兴知道我没有疯掉。这个问题在公共支持票证中吗?祝好运。 - 1000Nettles
没有公共票据,这是与Magento EE支持一起的。昨天我们收到一张便条,告诉我们支持开发人员说我们在搜索结果页面上缺少一些块。现在,我不知道前端块如何影响Magento-SOLR索引,但我们还是尝试了。不用说,它并没有解决问题。 - GregC
@GregC,请检查我的答案,看是否有可能修复。 - Khez

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运行的部分目的。它不会像浏览器那样慢,但可能比以前慢。
如果您有任何问题或认为我可以以其他方式帮助,请告诉我!

适用于EE 1.12.0.2!感谢Khez。 - GregC

1

你有花时间查看索引器运行时的solr日志吗?我们目前正在运行1.12版本,即使在那里也发现了几个solr问题。当solr通知我们有一个bug时,我们不得不进行故障排除。

我的评论在这里回答中:Magento 1.12和Solr 3.6没有正确的结果和拼写建议

我认为这个建议适用于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);


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,然后从管理面板重新索引catalogsearch,这对我有效。


谢谢 - 但这对ee 1.12.0.2不起作用 -- "PHP致命错误:在/app/code/core/Enterprise/Search/Model/Observer.php的第171行中调用非对象的getEvent()成员函数"。我会继续查找并看看能找到什么。 - GregC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接