首先,我在 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
'sprepareProductCollection
方法中,我向查询添加了两个连接并获取字段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
etc. 这一点都不好,而且每次都不会工作 - 我直接从数据库表中检查了这些 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的回答,但最后我们购买了一个扩展来改进搜索结果。