不同的搜索类型有什么区别?
- 喜欢
- 全文
- 组合式
我对这些设置的搜索行为和性能如何变化特别感兴趣。
不同的搜索类型有什么区别?
我对这些设置的搜索行为和性能如何变化特别感兴趣。
Answers:
每个人都总是抱怨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'
此方法可能适用于某些商店设置,其中产品名称很简单并且客户搜索非常特定的商品,但是以我的经验,这不是一个好的选择。
基于相关性的搜索-每个搜索查询都根据基于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|
这些值直接链接到您在目录>属性>管理属性下指定为“在快速搜索中使用”的属性
很自我解释。看一下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结果。
您可以使用Combine方法解决第5点和第6点的问题-LIKE结果应补偿FULLTEXT被忽略的任何单词。
“喜欢”搜索将使用喜欢的'%keyword%'查询进行常规的喜欢匹配。这种搜索的一个优点是它将匹配部分单词。但是它有严重的缺点:
全文搜索将使用MyISAM全文搜索(http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html)起作用。您应该阅读一下,但总而言之:
全文的缺点是无法进行部分匹配,即搜索“ pho”将找不到“ phone”
“组合”搜索将使用“喜欢”条件来匹配结果,但也将考虑全文搜索分数以对其进行排序。这意味着您将获得更多结果(就像搜索也将进行部分匹配一样),并且由于全文得分,它们的顺序也会更好。
正如其他人所说,如果您对搜索很认真,则应该使用Solr。它的速度更快,并且更相关。不过,您必须拥有Magento EE并自己安装Solr。
它们是Magento将使用的查询类型的直接引用。我个人认为,全文搜索功能更强大,性能也更好,尤其是当LIKE与通配符(%)一起使用时。两者的结合可能会最准确,但可能会过大。我会坚持全文。
但是,如果您正在寻找功能强大的搜索解决方案,请查看以下项目:https : //code.google.com/p/magento-solr/。SOLR是为搜索大型馆藏而构建的,虽然可能需要花费一些时间来实现,但值得这样做。我个人以前从未在Magento中使用过它,但是在其他PHP项目中,它的表现非常出色。
全文文档可以在这里找到:http : //dev.mysql.com/doc/refman/5.0/en/fulltext-search.html LIKE文档在这里:http : //dev.mysql.com/doc/refman/5.0 /en/string-comparison-functions.html
OR
改为AND
?
LIKE的问题是默认情况下使用“%term%”。我将其更改为匹配“ term%”(注意该术语之前的空格),以使其与单词的开头匹配。我还删去了搜索词中的最后一个's',以便“ cars”获得与“ car”相同的结果。显然,这对于诸如“ children”之类的不规则名词无济于事,但无论如何这都是一个巨大的进步。
Magento最大的莫名其妙的举动是使用“或”搜索而不是“与”。如果您搜索“红色汽车”,则将获得所有红色(包括汽车,狗,叉子,山坡等),以及所有类型的汽车(包括红色,蓝色,绿色,黄色等)。与“AND”,你得到的只是包含“红”,“汽车”项目,这是搜索如何应该努力!
引用jharrison.au的答案,更改以下内容:
if ($like) {
$likeCond = '(' . join(' OR ', $like) . ')';
}
对此:
if ($like) {
$likeCond = '(' . join(' AND ', $like) . ')';
}
为了立即大量提升您搜索结果的相关性。
对于复数形式,您可以将像这样的单词的最后一个“ s”砍掉:
$words = Mage::helper('core/string')->splitWords($queryText, true, $query->getMaxQueryWords());
$words = array_walk($words,function(&$value, &$key) {
// use substr(...) instead of rtrim($value,'s')
// because rtrim will remove multiple esses
$value = (substr($value,-1,1) === 's') ? substr($value,0,strlen($value - 1)) : $value;
});
foreach ($words as $word) {
$like[] = $helper->getCILike('s.data_index', $word, array('position' => 'start')); // note I changed this to 'start'
}
在app/code/local/Mage/Core/Model/Resource/Helper/Abstract.php
可以覆盖核心文件,并更改public function escapeLikeValue($value, $options = array())
为一个快捷键,虽然建议的方法是做同样的事情,一个模块中。但是在这里。
下if (isset($options['position'])) {
有一个开关。我更改了“开始”和“结束”的大小写,以在值前后添加空格:
case 'start':
$value = '% ' . $value . '%'; // added '% ' . before
// $value = $value . '%'; // core way (bad way)
break;
case 'end':
$value = '%' . $value . ' %'; // added . ' %' after
// $value = '%' . $value; // core way (bad way)
break;
对于工作之前/之后的空格,您可能还必须像我一样更改搜索索引的构建方式,以确保每个单词前后都有一个空格。建立索引的默认方法是用“ |”分隔每个字段 (管道字符),例如用于标引颜色,产品类型,产品说明的“蓝色|很好的汽车”。但是我的索引是“蓝色|汽车|一辆非常好的汽车”。您甚至可以修改搜索索引的结构,以便也许替换连字词(“超快速行驶”变为“超快速行驶”)等。
从jharrison.au的答案中借出一个examplen,其中默认的搜索索引字段如下所示:
EmCO0014e|Emma Certified|Emma Certified Organic Herbal Tonic Mist TRIAL/TRAVEL|Australian|Certified Organic|Palm Oil Free|Nut Free|Vegan Suitable|
我的看起来像这样:
EmCO0014e | Emma Certified | Emma Certified Organic Herbal Tonic Mist TRIAL / TRAVEL | Australian | Certified Organic | Palm Oil Free | Nut Free | Vegan Suitable |
(请注意每个“ |”和“ /”之前和之后的空格,以及第一个单词之前的空格)
app/code/local/Mage/Core/Model/Resource/Helper/Abstract.php
。除了搜索功能之外,没有在其他任何地方使用此文件吗?
LIKE
SQL搜索查询而设计的,Magento在除产品搜索索引之外的其他地方进行搜索?我在2年前的一个生产站点中进行了此更改,我们根本没有发现与此相关的任何错误。它真正要做的就是使“单词的开头”前面必须有一个空格,而“单词的结尾”后面必须有一个空格。另外,在索引中,我确保每个单词周围都有空格。