我注意到我似乎无法对默认搜索中的相关性进行排序。无论我是尝试ASC还是DESC,结果总是相同的,而且相关性很差。
经过进一步调查,我在 Mage_CatalogSearch_Model_Resource_Fulltext_Collection 中找到了addSearchFilter()方法:
/**
* Add search query filter
*
* @param string $query
* @return Mage_CatalogSearch_Model_Resource_Fulltext_Collection
*/
public function addSearchFilter($query)
{
Mage::getSingleton('catalogsearch/fulltext')->prepareResult();
$this->getSelect()->joinInner(
array('search_result' => $this->getTable('catalogsearch/result')),
$this->getConnection()->quoteInto(
'search_result.product_id=e.entity_id AND search_result.query_id=?',
$this->_getQuery()->getId()
),
array('relevance' => 'relevance')
);
Zend_Debug::dump($this->getData());exit;
return $this;
}
我的数据转储结果显示结果很好,但“相关性”列始终为0.00000。我没有对目录搜索进行任何更改,这是Magento 1.6.0。
我也抛弃了实际的SQL:
SELECT `e`.*, `search_result`.`relevance` FROM `catalog_product_entity` AS `e` INNER JOIN `catalogsearch_result` AS `search_result` ON search_result.product_id=e.entity_id AND search_result.query_id='33'
如果其他人有更多计算相关性的经验,我会非常感谢方向。
答案 0 :(得分:22)
简答:相关性仅用于全文搜索模式。
在管理界面中,您可以为Magento配置“搜索类型” 此设置可在 System>下找到。配置>目录>目录搜索>搜索类型
如果切换到Fulltext(并重新编制索引)并清除catalogsearch_query
表,Magento将使用MySQL全文搜索功能,在查询中指定WHERE条件,如下所示:
...MATCH (s.data_index) AGAINST (:query IN BOOLEAN MODE) AS `relevance`...
这将返回将用作相关性值的浮点数。普通命中将为您提供1的相关性。如果索引包含的搜索词多于一次,则它将具有更高的相关性。
布尔全文搜索也允许使用搜索修饰符,例如“+ this -notThis” 有关MySQL布尔全文搜索的相关性权重的更多信息,请参见http://dev.mysql.com/doc/refman/5.1/de/fulltext-boolean.html
如果使用搜索模式“赞”,则相关性始终为0
(如您所见)。
Magento构建搜索索引的方式不是很直观,我建议查看表catalogsearch_fulltext
。然后通过调整在快速搜索中使用属性来调整要在搜索中使用的属性。此设置可在目录>下找到。属性>管理属性。然后重新索引目录搜索索引
我还建议您在调整属性后清除catalogsearch_result
表。