首先,我在SO中发现了类似的问题,但没有任何答案。所以,问题的第一部分有点重复。我想改进Magento的搜索结果。以下是我已经完成的工作:
1。当有多个字时,使用AND
代替OR
进行搜索。
2。 Ajax搜索从任何地方开始搜索,而不仅仅是从字段的开头搜索。
3。修剪单词中的最后一个s
以防止在复数形式搜索时出现空结果。
4。我将搜索类型从Like
更改为Fulltext
或Combine
,但结果并不是更好,甚至是最差的,所以我保留了它原样。它现在是Like
,因此没有relevance
排序。
我想要尝试的最后一件事是adding this to the search query:
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的新手,但在找到这类东西方面仍有问题。那么,当我必须扩展查询时,我必须放置我的附加内容?
Community Edition 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
字段。此外,我无法通过这些字段对结果进行排序。我尝试了$collection->addOrder('SUM(rel1+rel2)');
,$collection->getSelect()->order(new Zend_Db_Expr('SUM(rel1+rel2)').' DESC');
,一些addAttributeToFilter
等东西,但它没有用。
编辑2: 我接受了 @james '回答但最后我们买了一个扩展来改善搜索结果。
答案 0 :(得分:4)
在Mage_CatalogSearch_Model_Resource_Fulltext
中查看prepareResult
(公元1.7年第310行)并查找以下内容:
$select->columns(array('relevance' => new Zend_Db_Expr(0)));
Magento将所有搜索结果相关性设置为0(!);在这里添加你想要的相关性(越高越好)。您可以在Zend_Db_Expr()
中创建自定义查询,以便在属性匹配时生成更高的相关性。
答案 1 :(得分:3)
第一个问题的答案(1): 要进行AND搜索而不是OR,您需要重写类
Mage_CatalogSearch_Model_Resource_Fulltext
方法
public function prepareResult($object, $queryText, $query)
你想切换部分
$likeCond = '(' . join(' OR ', $like) . ')';
到
$likeCond = '(' . join(' AND ', $like) . ')';
请务必在之后重新索引搜索索引以产生效果。