目前,提供前端产品搜索字段结果的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接口我应该搞砸但尚未找到它。
提前致谢
答案 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中效果不佳,因为它排除了太多结果。下面列出的方法要好得多。
进行更改:
在管理员中,转到system-&gt; Index Management,然后选中Catalog Search Index旁边的框并重新索引它(或者只重新索引所有索引)。 (或者从magento root类型的命令行开始:
php shell / indexer.php --reindex catalogsearch_fulltext
)
如果您还想在搜索“红色”时排除“无聊”等字词,那么您可能希望在同一个文件中实现第二次更改。
里面还有另一段代码:
$bind[':likew' . $likeI] = '%' . $word . '%';
前面的%意味着“无聊”就像%red%。但是,由于构造索引的方式,你不能只删除第一个%以获得正确的效果。因此,您可以进行以下两项更改:
将上面一行代码更改为:
$ bind [':likew'。 $ likeI] ='%'。 $字。 '%';
请注意结束报价前第一个%之后的SPACE。现在只能查找以$ word开头的单词(例如红色,红色,红色,红色,所有匹配'%red%'),但您还必须确保所有单词前面都有空格。
在文件顶部附近,在Mage_CatalogSearch_Model_Mysql4_Fulltext类下,在第48行附近你应该找到:
protected $ _separator ='|';
我刚把它改成了这个:
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文件夹。希望这会有所帮助。