Magento 1.12和Solr 3.6没有合适的结果,没有法术建议

时间:2012-07-26 10:53:40

标签: magento solr

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

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

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

2 个答案:

答案 0 :(得分:6)

我们发现使用Magento EE 1.12的solr存在多个问题。

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

  2. 我建议在magento admin 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. 我们还有一种情况,即设置为multiselect的属性可能没有选择任何选项。当数组为空时,很长一段时间会导致输入一个空字符串,这会引发错误。解决方案是首先检查阵列是否为空。 所以我们必须覆盖app / code / local / Enterprise / Search / Model / Adapter / Abstract.php

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

答案 1 :(得分: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') {