Magento 1.12 和 Solr 3.6 没有正确的结果,也没有拼写建议

问题描述 投票:0回答:2

任何想法或建议。我有点困惑,我已经设置了 solr 和 magento 几次,但现在使用 magento 1.12,它的行为很奇怪,没有正确的结果,也没有拼写检查。

我们的 magento 1.11 与 solr 1.4 一起工作正常,它仍然工作正常,我尝试使用 1.4 和 solr 3.6 没有修复。

任何想法或建议。我有点困惑

php magento solr
2个回答
6
投票

我们在 Magento EE 1.12 中发现了 solr 的多个问题。

  1. 如果您通过 cronjob 从 shell 运行全文索引器,则以下事件(是的,拼写错误)“catelogsearch_searchable_attributes_load_after”将不会被调度,并且此方法将不会运行:storeSearchableAttributes。这阻止了 Solr 文档中发送所有全文属性。解决方案是从 GUI 运行它,但您必须在 .htaccess 中延长 php 超时,并且可能还需要延长 php 内存限制。我可能会将其硬编码在某个地方,因为您显然不希望网站访问者有这么长的超时。

  2. 我建议在 magento 管理 GUI 中启用“部分提交”。

  3. 运行此索引器时请注意 solr 日志。它提供了有价值的线索。我们有两个问题导致 solr 出现严重错误。其中“*”被错误地转义为“\*”。 我们通过从核心创建本地覆盖来覆盖它,我们在其中检查!==“*”: 应用程序/代码/本地/企业/搜索/模型/适配器/Solr/Abstract.php

                 foreach ($facetFieldConditions as $facetCondition) {
                     if (is_array($facetCondition) && isset($facetCondition['from'])
                             && isset($facetCondition['to'])) {
                        $from = (isset($facetCondition['from']) && strlen(trim($facetCondition['from'])) && trim($facetCondition['from']) !== "*")
                             ? $this->_prepareQueryText($facetCondition['from'])
                             : '*';
                        $to = (isset($facetCondition['to']) && strlen(trim($facetCondition['to'])) && trim($facetCondition['to']) !== "*")
    
  4. 我们还遇到过这样的情况:设置为多选的属性无法选择任何选项。长话短说,当数组为空时,会导致附加一个空字符串,从而引发错误。解决方案是首先检查数组是否为空。 所以我们必须用 app/code/local/Enterprise/Search/Model/Adapter/Abstract.php 覆盖

    if (!empty($val)) {
        $preparedValue = array_merge($preparedValue, explode(',', $val));
    }


1
投票

我们还刚刚修复了具有选择/多选属性的产品与空白标签一起发送到 solr 的问题。这导致索引器无法完成。

我们覆盖了 app/code/core/Enterprise/Search/Model/Adapter/Abstract.php 并将创建一个本地模块来正确覆盖它。

这是修复方法

--- a/app/code/core/Enterprise/Search/Model/Adapter/Abstract.php
+++ b/app/code/local/Enterprise/Search/Model/Adapter/Abstract.php
@@ -434,6 +434,10 @@ abstract class Enterprise_Search_Model_Adapter_Abstract
                     foreach ($preparedValue as $id => $val) {
                         $preparedValue[$id] = $attribute->getSource()->getOptionText($val);
                     }
+                    
+                    $preparedValue = array_filter($preparedValue);
+                    $preparedNavValue = array_filter($preparedNavValue);
+                    
                 } else {
                     $preparedValue = $value;
                     if ($backendType == 'datetime') {
© www.soinside.com 2019 - 2024. All rights reserved.