搜索类型:喜欢,全文还是组合?


48

不同的搜索类型有什么区别?

  • 喜欢
  • 全文
  • 组合式

我对这些设置的搜索行为和性能如何变化特别感兴趣。

Answers:


63

每个人都总是抱怨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结果。


注意事项

  1. 我强烈建议使用FULLTEXT以获得更好的性能和相关结果
  2. 浏览每个属性,并考虑是否有必要将其添加到全文索引中(“用于快速搜索”)
  3. 默认情况下,产品描述包含在FULLTEXT索引中。我几乎总是删除描述,因为它们会用无关上下文中使用的单词污染相关分数。
  4. 确保全文索引中使用了元属性。用有意义的内容填充它们。
  5. MySQL FULLTEXT有一些怪癖-它有一个被忽略的单词列表,如果您的产品名称是由这些单词组成的,可能会出现问题!
  6. MySQL默认情况下会忽略4个字符以下的 FULLTEXT 查询。除非您更改此值,否则具有短值的属性将被忽略。

您可以使用Combine方法解决第5点和第6点的问题-LIKE结果应补偿FULLTEXT被忽略的任何单词。


7

“喜欢”搜索将使用喜欢的'%keyword%'查询进行常规的喜欢匹配。这种搜索的一个优点是它将匹配部分单词。但是它有严重的缺点:

  • 将很快成为性能问题
  • 相关性不好。在类似的查询中实际上没有“相关性”的概念

全文搜索将使用MyISAM全文搜索(http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html)起作用。您应该阅读一下,但总而言之:

  • 性能更好
  • 它将排除停用词(例如“ and”,“ with”等)
  • 默认情况下,它将根据相关性为每个结果分配一个分数

全文的缺点是无法进行部分匹配,即搜索“ pho”将找不到“ phone”

“组合”搜索将使用“喜欢”条件来匹配结果,但也将考虑全文搜索分数以对其进行排序。这意味着您将获得更多结果(就像搜索也将进行部分匹配一样),并且由于全文得分,它们的顺序也会更好。

正如其他人所说,如果您对搜索很认真,则应该使用Solr。它的速度更快,并且更相关。不过,您必须拥有Magento EE并自己安装Solr。


1
感谢您的回答。为什么需要Magento EE?
PiTheNumber

1
Solr搜索是Magento Enterprise的一部分(不是社区的功能)。有一些扩展可以在社区中实现搜索,例如magentocommerce.com/magento-connect/solr-bridge-search.html。我没有用过它们。
Paul Grigoruta

6

它们是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


全文功能更强大,但是如果要为少于5个或4个字符的单词提供结果,则需要在my.cnf中进行设置,具体取决于它的默认设置。就像搜索经常被破坏一样,需要将其逻辑从“或”更改为“与”,因此不会产生太多无关的结果。
Fiasco Labs

您对全文的看法是正确的。在VPS上托管或与提供Magento托管的公司托管始终是明智的。这样,应该可以使用“全文本”配置之类的选项,或者至少可以自己进行设置。您对@Fiasco Labs有第三者搜索建议吗?
桑德·曼格尔

@FiascoLabs,您如何将更OR改为AND
Michael Yaeger

3

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 | 

(请注意每个“ |”和“ /”之前和之后的空格,以及第一个单词之前的空格)


1
您已经提到要覆盖app/code/local/Mage/Core/Model/Resource/Helper/Abstract.php。除了搜索功能之外,没有在其他任何地方使用此文件吗?
amitshree 2015年

1
@amitshree好问题。我不知道我的头顶。我想,任何模型资源都可以将其用于搜索结果。但这确实是专门为转义LIKESQL搜索查询而设计的,Magento在除产品搜索索引之外的其他地方进行搜索?我在2年前的一个生产站点中进行了此更改,我们根本没有发现与此相关的任何错误。它真正要做的就是使“单词的开头”前面必须有一个空格,而“单词的结尾”后面必须有一个空格。另外,在索引中,我确保每个单词周围都有空格。
Buttle Butkus 2015年

2

以上都不是,通过安装Blast Lucene Search或Extendeware Lucene Search之类的东西,可以使用内置的Zend Lucene搜索引擎。相关性胜过任何MySQL产品。

是的,我在接受的答案上进行了所有迭代,但是坦率地说,仍然极度缺乏“优化库存Magento”搜索。

另一方面,Lucene交付并已经包含在Magento安装中,它只需要一个模块即可启用它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.