gpt4 book ai didi

php - Magento/PHP-修改前端产品搜索框下面的MySQL查询

转载 作者:行者123 更新时间:2023-11-29 01:32:45 24 4
gpt4 key购买 nike

目前,提供前端产品搜索字段结果的MySQL数据库查询似乎在查询的WHERE子句中使用“或”链接条件。
我认为它使用“或”的原因是,如果你搜索“绿色和红色格子衬衫”之类的东西,你会得到每一个带有“红色”的产品(包括“无聊”、“储存”等),每一个带有“绿色”的产品,每一个带有“格子”的产品,每一个带有“衬衫”的产品。
现在,如果我能找到代码中正在构造查询的位置,我应该能够将其更改为“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%';

我无法通过搜索谷歌或马格托的论坛找到任何信息。我一直在找app/code/core/Mage/CatalogSearch/但还没有找到母矿脉。我知道可能有一些Zend接口我应该处理,但还没有找到它。
提前谢谢

最佳答案

更新
下面的答案似乎不适用于Magento1.7+,因为他们已经更改了一些搜索代码。我正在研究一个解决方案,稍后会更新。
我要回答我自己的问题。谢谢,安东的线索,但我自己找到了一些关键文件,并能够实现我想要的变化。
以下是密钥文件:
app/code/core/Mage/CatalogSearch/Model/Mysql4/Fulltext.php
您可以将指向该文件的core结构复制到local结构中,并在那里复制核心文件,如下所示:
app/code/local/Mage/CatalogSearch/Model/Mysql4/Fulltext.php
然后对local文件进行所有更改,只留下core文件。
在函数prepareResult($object,$queryText,$query)的第315行周围查找这段代码:

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

这就是给我带来成千上万无用结果的原因。例如,搜索“绿色和红色格子衬衫”将显示所有绿色、红色和/或格子(包括衬衫、裙子、飞艇、兔子)以及商店中的每件衬衫。用户真正想找到的是一个包含所有搜索词的产品。如上所述,您还将发现“无聊”和“存储”等结果,因为它们包含“红色”
要解决大部分问题,只需将“或”改为“和”。还要注意,更改仅适用于“LIKE”类型的搜索,而不是“FULLTEXT”类型。全文本在Magento中不能很好地工作,因为它排除了太多的结果。下面概述的方法要好得多。
要进行更改:
用上面的更改保存文件。
进入“管理”,进入“系统”->“目录”->“目录搜索”,并确保搜索类型为“Like”。
保存配置
在“管理”中,转到“系统”->“索引管理”,选中“目录搜索索引”旁边的复选框并对其重新编制索引(或只是对全部重新编制索引)。(或从magento根类型中的命令行:
php shell/indexer.php—重新索引catalogsearch
)
如果您还希望在搜索“red”时排除“无聊”等词,那么您可能希望在同一文件中实现第二个更改。
里面还有另一段代码:
$bind[':likew' . $likeI] = '%' . $word . '%';

前面的%表示“无聊”就像%红色。但由于索引的构造方式,您不能仅删除1%以获得正确的效果。因此,您需要做以下两个更改:
将上述代码行更改为:
$bind[':likew'。$likeI]=“%”。$字%';
注意右引号前第一个%后面的空格。现在,这只会找到以$word开头的单词(例如red、redding、reddy、rediculd all匹配'%red%'),但还必须确保所有单词前面都有空格。
在文件顶部的Mage_CatalogSearch_Model_Mysql4_全文类下,在第48行附近,您应该可以找到:
受保护的$_分隔符='|';
我刚改成这个:
protected $_separator = ' | ';

在管道的两侧留出空间。当你重新索引时,每个单词前后都会有空格。搜索“kit”仍然会得到“kitchen”的结果,但至少不会得到“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”,所以现在“红绿格子衬衫”返回的结果与“红绿格子衬衫”相同。
我的下一个项目可能是对字符串解析进行更多的更改,以获得更好的多词搜索结果。我正在查看这个文件,仅供参考:app/code/core/Mage/core/Helper/String.php
function splitWords

,它在Fulltext.php文件中用于字符串解析。
注意:要使此更改升级安全,您需要将文件夹结构复制到 app/code/core内部,如下所示:
app/code/local/Mage/CatalogSearch/Model/Mysql4/Fulltext.php
把核心文件复制到那里,然后在那里进行修改。

关于php - Magento/PHP-修改前端产品搜索框下面的MySQL查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6620432/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com