6

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

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

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

4

5 回答 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 根文件夹发出以下命令,从命令行重建 Solr 索引(当然,假设您具有 shell 访问权限):

php shell/indexer.php --reindex catalogsearch_fulltext
于 2013-03-15T09:21:58.910 回答
3

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

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

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

于 2012-10-04T14:30:23.373 回答
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 运行的部分目的。它不会像浏览器那么慢,但它可能会比以前慢。

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

于 2013-01-21T08:17:40.230 回答
1

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

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

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

于 2012-10-20T01:05:35.870 回答
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 之类的浏览器中运行它,然后我从管理员重新索引目录搜索,这对我有用。

于 2013-03-20T09:55:15.917 回答