如何在哪里修改Magento搜索查询?

13

首先,我在SO找到了类似的问题,但它们没有得到任何答案。因此,问题的第一部分有点重复。我想改进Magento的搜索结果。以下是我已经完成的内容:

1. 在有多个单词时使用AND而不是OR进行搜索。

2. Ajax搜索从任何地方开始搜索,而不仅仅是从字段开头。

3. 去掉单词末尾的最后一个s,以防止使用复数搜索时出现空结果。

4. 我将搜索类型从Like更改为FulltextCombine,但结果并不理想,甚至更糟,所以我将其保留。它现在是Like,因此没有relevance排序。

我想尝试的最后一件事是将这个添加到搜索查询中

SELECT ... other non-full-text-cols
MATCH (product_title) AGAINST ('lean body for her') AS rel1,
MATCH (content) AGAINST ('lean body for her') AS rel2
FROM table
WHERE MATCH (product_title,content) AGAINST ('lean body for her')
ORDER BY (rel1*1.5)+(rel2)

这是我的查询语句,但我不确定它是否可行,因为我无法测试:

$this->_productCollection->addAttributeToSelect(
    array(
    'rel1' => new Zend_Db_Expr('MATCH (name) AGAINST ("'.$queryText.'")'),
    'rel2' => new Zend_Db_Expr('MATCH (short_description) AGAINST ("'.$queryText.'")')
    )
);

$this->_productCollection->getSelect()
    ->where('MATCH (name,short_description) AGAINST ("'.$queryText.'")')
    ->order('(rel1*1.5)+(rel2)');
主要思路是如果搜索查询在产品标题中找到,就给结果添加奖励权重。问题是我不知道在哪里修改查询。我根本找不到它的位置。$this->_productCollection不是正确的对象,我知道这一点。我查看了所有的Collection.php文件、资源模型、模型,甚至查询日志,但都没有找到。只有一些文件中的小的1或2行部分,而不是完整的查询。我是Magento的新手,仍然在寻找这种类型的东西时遇到问题。那么,当我需要扩展查询时,我必须将附加内容放在哪里?社区版Magento,版本1.6.1.0。
注意:我知道一些用于改善搜索结果的扩展程序会比我的解决方案更好,但现在我必须以这种方式来实现它。这对我来说也是一次很好的经历。
编辑:因此,我已经弄清楚如何添加自定义字段进行排序,但我认为这是不正确的。在class Mage_CatalogSearch_Model_Layer extends Mage_Catalog_Model_LayerprepareProductCollection方法中,我添加了两个连接到查询和获取字段rel1rel2
$collection->getSelect()->joinLeft(
    array('cpev' => 'catalog_product_entity_varchar'),
    'cpev.entity_id = e.entity_id AND cpev.attribute_id = 96',
    array('rel1' => new Zend_Db_Expr('2.01*(LENGTH(cpev.value) - LENGTH(REPLACE(LCASE(cpev.value), LCASE("'.$queryText.'"), ""))) / LENGTH("'.$queryText.'")'))
);

$collection->getSelect()->joinLeft(
    array('cpet' => 'catalog_product_entity_text'),
    'cpet.entity_id = e.entity_id AND cpet.attribute_id = 506',
    array('rel2' => new Zend_Db_Expr('(LENGTH(cpet.value) - LENGTH(REPLACE(LCASE(cpet.value), LCASE("'.$queryText.'"), ""))) / LENGTH("'.$queryText.'")'))
);

现在我有这些字段,但正如您所看到的,像attribute_id = 96之类的硬编码内容并不好,而且它不会一直起作用-我直接从数据库表中检查了这些ID。我像这样编写它是因为我没有访问nameshort_description 字段,但它们在结果中。不知道为什么。因此,cpev.valuename字段,cpet.valueshort_description字段。此外,我无法按这些字段对结果进行排序。我尝试过一些addAttributeToFilter等语句来添加排序,但它们都不起作用。

编辑2: 我接受了@james的答案,但最终我们购买了一个扩展程序来改进搜索结果。


使用Solr或ElasticSearch我认为是更好的解决方案。它更适合处理复数/单数搜索、同义词、拼写、相关性。 - FlorinelChis
谢谢,@FlorinelChis。我也查看了不同的Magento扩展。但目前我想以这种方式来实现,因为我在添加第三方内容方面并不是很有经验,另外一件事是我在Web商店上没有太多权限。您能帮忙修改原始查询吗? - enenen
2个回答

5

Mage_CatalogSearch_Model_Resource_Fulltext中查看prepareResult(在1.7 CE中的第310行),并查找以下内容:

$select->columns(array('relevance'  => new Zend_Db_Expr(0)));

Magento将所有的搜索结果相关度设置为0(!);在这里添加您想要的相关度值(数值越高越好)。您可以在Zend_Db_Expr()中创建一个自定义查询来生成属性匹配的更高相关度。


3
您的第一个问题的答案(1): 要进行AND搜索而不是OR搜索,您需要重写类。
Mage_CatalogSearch_Model_Resource_Fulltext

在这个方法中
public function prepareResult($object, $queryText, $query)

您想要切换这一部分。
$likeCond = '(' . join(' OR ', $like) . ')';

to

$likeCond = '(' . join(' AND ', $like) . ')';

确保在完成操作后重新索引搜索索引以产生效果。


这是我已经完成的内容:位于列表的首位。 - Fiasco Labs
@mpaepper,我已经完成了这些。我的问题是修改搜索查询。 - enenen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接