不同的搜索类型有什么区别?
喜欢
全文
组合式
每个人都一直抱怨Magento搜索,但我相信,如果您花时间计划和正确配置它,它确实可以很好地工作。
喜欢
基于关键字的搜索方法,将您的查询分解为单个单词。请参阅课堂上第326行的内容Mage_CatalogSearch_Model_Resource_Fulltext::prepareResult()
$words = Mage::helper('core/string')->splitWords($queryText, true, $query->getMaxQueryWords());
foreach ($words as $word) {
$like[] = $helper->getCILike('s.data_index', $word, array('position' => 'any'));
}
if ($like) {
$likeCond = '(' . join(' OR ', $like) . ')';
}
您可以看到它在搜索查询中拆分了每个单词,并在LIKE语句中将它们连接在一起-您最终得到了以下内容:
WHERE `attribute` LIKE 'my' OR `attribute` LIKE 'search' OR `attribute` LIKE 'query'
此方法可能适用于某些商店设置,其中产品名称很简单并且客户搜索非常特定的商品
“喜欢”搜索将使用喜欢的'%keyword%'查询进行常规的喜欢匹配。这种搜索的一个优点是它将匹配部分单词。但是它具有严重的缺点:
- 将很快成为性能问题
- 相关性不好。在类似的查询中实际上没有“相关性”的概念
全文
基于相关性的搜索-每个搜索查询都根据基于MySQL的MATCH ... AGAINST查询分配的分数进行评分。您可以在Mage_CatalogSearch_Model_Resource_Helper_Mysql4
第44行看到这一点:
public function chooseFulltext($table, $alias, $select)
{
$field = new Zend_Db_Expr('MATCH ('.$alias.'.data_index) AGAINST (:query IN BOOLEAN MODE)');
$select->columns(array('relevance' => $field));
return $field;
}
Magento执行全文搜索时使用的数据库表为catalogsearch_fulltext
。值示例:
EmCO0014e|Emma Certified|Emma Certified Organic Herbal Tonic Mist TRIAL/TRAVEL|Australian|Certified Organic|Palm Oil Free|Nut Free|Vegan Suitable|
这些值直接链接到您在目录>属性>管理属性下指定为“在快速搜索中使用”的属性
优点:
- 性能更好
- 它将排除停用词(例如“ and”,“ with”等)
- 默认情况下,它将根据相关性为每个结果分配一个分数
全文的缺点是无法进行部分匹配,即搜索“ pho”将找不到“ phone”
结合
很自我解释。看一下Mage_CatalogSearch_Model_Resource_Fulltext的第354 行:
if ($likeCond != '' && $searchType == Mage_CatalogSearch_Model_Fulltext::SEARCH_TYPE_COMBINE) {
$where .= ($where ? ' OR ' : '') . $likeCond;
} elseif ($likeCond != '' && $searchType == Mage_CatalogSearch_Model_Fulltext::SEARCH_TYPE_LIKE) {
$select->columns(array('relevance' => new Zend_Db_Expr(0)));
$where = $likeCond;
}
您可以看到它仅在FULLTEXT结果返回后才添加LIKE结果。
如果您认真对待搜索,则应该使用Solr。它的速度更快,并且更相关。不过,您必须拥有Magento EE并自己安装Solr
注意事项
- 我强烈建议使用FULLTEXT以获得更好的性能和相关结果
- 浏览每个属性,并考虑是否有必要将其添加到全文索引中(“用于快速搜索”)
- 默认情况下,产品描述包含在FULLTEXT索引中。我几乎总是删除描述,因为它们会用无关上下文中使用的单词污染相关分数。
- 确保全文索引中使用了元属性。用有意义的内容填充它们。
- MySQL FULLTEXT有一些怪癖-它有一个被忽略的单词列表,如果您的产品名称由这些单词组成,可能会出现问题!
- MySQL默认情况下会忽略4个字符以下的 FULLTEXT 查询。除非更改此值,否则将忽略具有短值的属性。
您可以使用Combine方法解决第5点和第6点的问题-LIKE结果应补偿FULLTEXT被忽略的任何单词。