首先,我在SO找到了类似的问题,但它们没有得到任何答案。因此,问题的第一部分有点重复。我想改进Magento的搜索结果。以下是我已经完成的内容:
1. 在有多个单词时使用AND
而不是OR
进行搜索。
2. Ajax搜索从任何地方开始搜索,而不仅仅是从字段开头。
3. 去掉单词末尾的最后一个s
,以防止使用复数搜索时出现空结果。
4. 我将搜索类型从Like
更改为Fulltext
或Combine
,但结果并不理想,甚至更糟,所以我将其保留。它现在是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_Layer
的prepareProductCollection
方法中,我添加了两个连接到查询和获取字段rel1
和rel2
:$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。我像这样编写它是因为我没有访问name
和short_description
字段,但它们在结果中。不知道为什么。因此,cpev.value
是name
字段,cpet.value
是short_description
字段。此外,我无法按这些字段对结果进行排序。我尝试过一些addAttributeToFilter
等语句来添加排序,但它们都不起作用。
编辑2: 我接受了@james的答案,但最终我们购买了一个扩展程序来改进搜索结果。