Magento / PHP - 修改前端产品搜索框底层的MySQL查询

时间:2011-07-08 05:53:53

标签: php mysql zend-framework magento

目前,提供前端产品搜索字段结果的MySQL数据库查询似乎在查询的WHERE子句中使用“OR”链接条件。

我认为它使用“OR”的原因是因为如果您搜索“绿色和红色格子衬衫”之类的东西,您将获得“红色”的所有产品(包括“无聊”,“存储”等) ,每件产品都带有“绿色”,每件产品都带有“格子”,每件产品都带有“衬衫”。

现在,如果我能找到构建查询的代码中的哪个位置,我应该能够将其更改为“AND”并最终得到如下查询:

SELECT `product_id` FROM `products` WHERE `search_index` LIKE '%red%' AND `search_index` LIKE '%green%' AND `search_index` LIKE '%plaid%' AND `search_index` LIKE '%shirt%';

我无法通过搜索Google或Magento的论坛找到任何信息。我一直在寻找app / code / core / Mage / CatalogSearch /,但还没有找到母亲lode。我知道可能有一些Zend接口我应该搞砸但尚未找到它。

提前致谢

3 个答案:

答案 0 :(得分:3)

<强>更新

以下答案似乎对Magento 1.7+不起作用,因为他们已经改变了一些搜索代码。我正在为此制定解决方案,稍后会更新。


我要回答我自己的问题。谢谢,Anton S提供了线索,但我自己找到了一些关键文件,并且能够实现我想要的更改。

这是密钥文件: 应用程序/代码/核心/法师/ CatalogSearch /型号/ Mysql4 / Fulltext.php

您可以将导致该文件的core结构复制到local结构中,并将核心文件复制到那里,如下所示: 应用程序/代码/本地/法师/ CatalogSearch /型号/ Mysql4 / Fulltext.php

然后对local文件进行所有更改,只保留core文件。

在第315行,在函数prepareResult($ object,$ queryText,$ query)中查找这段代码:

foreach($words as $word) {
    $like[ ] = '`s`.`data_index` LIKE :likew' . $likeI;
    $bind[':likew' . $likeI] = '%' . $word . '%';
    $likeI ++;
}
if ($like) {
    $likeCond = '(' . join(' OR ', $like). ')';
}

那个'或'有什么给了我数以千计无用的结果。例如,搜索“绿色和红色格子衬衫”最终将向我展示绿色,红色和/或格子图案(包括衬衫,裙子,飞艇,兔子),以及商店中的每件衬衫。用户真正想要找到的是包含所有搜索词的产品。如上所述,您还会发现“无聊”和“存储”等结果,因为它们包含“红色”。

要解决大部分问题,您只需将“OR”更改为“AND”即可。另请注意,更改仅适用于“LIKE”类型搜索,而不适用于“FULLTEXT”类型。 FULLTEXT在Magento中效果不佳,因为它排除了太多结果。下面列出的方法要好得多。

进行更改:

  1. 使用上述更改保存文件。
  2. 进入管理员,进入系统 - &gt;目录 - &gt;目录搜索,并确保搜索类型为“赞”。
  3. 保存配置
  4. 在管理员中,转到system-&gt; Index Management,然后选中Catalog Search Index旁边的框并重新索引它(或者只重新索引所有索引)。 (或者从magento root类型的命令行开始:

    php shell / indexer.php --reindex catalogsearch_fulltext

  5. 如果您还想在搜索“红色”时排除“无聊”等字词,那么您可能希望在同一个文件中实现第二次更改。

    里面还有另一段代码:

    $bind[':likew' . $likeI] = '%' . $word . '%';
    

    前面的%意味着“无聊”就像%red%。但是,由于构造索引的方式,你不能只删除第一个%以获得正确的效果。因此,您可以进行以下两项更改:

    1. 将上面一行代码更改为:

      $ bind [':likew'。 $ likeI] ='%'。 $字。 '%';

      请注意结束报价前第一个%之后的SPACE。现在只能查找以$ word开头的单词(例如红色,红色,红色,红色,所有匹配'%red%'),但您还必须确保所有单词前面都有空格。

    2. 在文件顶部附近,在Mage_CatalogSearch_Model_Mysql4_Fulltext类下,在第48行附近你应该找到:

      protected $ _separator ='|';

    3. 我刚把它改成了这个:

      protected $_separator = ' | ';
      

      在管道的两侧放置空格。重新索引时,每个单词前后都会有空格。搜索“套件”仍然会给你“厨房”的结果,但至少你不会得到“skit”的结果。

      最后,我做的最后一个改变是确保复数搜索返回与单数搜索相同的结果,至少对于以's'结尾的复数。 我添加了一行代码:

      foreach($words as $word) {
          $word = rtrim($word, 's'); //this line added
          $like[ ] = '`s`.`data_index` LIKE :likew' . $likeI;
          $bind[':likew' . $likeI] = '%' . $word . '%';
          $likeI ++;
      }
      

      它只是在每个单词的结尾处切掉's',所以现在“红色和绿色格子衬衫”会返回与“reds ands greens plaids shirt”相同的结果。

      我的下一个项目可能是对字符串解析进行一些更改,以便为多字搜索获得更好的结果。我正在看这个文件,fyi:app / code / core / Mage / Core / Helper / String.php

      function splitWords
      

      ,在Fulltext.php文件中用于字符串解析。

      注意:要使此更改升级安全,您可以在app/code/core内复制app/code/local之后的文件夹结构,如下所示:     应用程序/代码/本地/法师/ CatalogSearch /型号/ Mysql4 / Fulltext.php

      只需将核心文件复制到那里,然后在那里进行更改。

答案 1 :(得分:1)

您可以从系统&gt;配置搜索查询配置&gt;目录&gt;目录搜索并选择查询的类型

搜索代码本身位于Mage_CatalogSearch_Model_Query和Mage_CatalogSearch_Model_Mysql4_Search_Collection类中的app / code / core / Mage / CataloSearch文件夹下

答案 2 :(得分:1)

我正在使用Magento CE 1.6.0.0,我在Resource文件夹中找到了该文件,而不是MySql4文件夹。希望这会有所帮助。