13

首先,我在 SO 中发现了类似的问题,但没有任何答案。所以,问题的第一部分有点重复。我想改进 Magento 的搜索结果。这是我已经做过的事情:

1.有多个词时用AND代替搜索。OR

2. Ajax 搜索从任何地方开始搜索,而不仅仅是从字段的开头。

3.去掉单词的最后一个s,防止复数搜索时出现空结果。

4.我将搜索类型从“或”更改Like为“FulltextCombine”,但结果并不好,甚至最差,所以我保持原样。现在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方法中,我向查询添加了两个连接并获取字段rel1rel2

$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 = 96etc. 这一点都不好,而且每次都不会工作 - 我直接从数据库表中检查了这些 id。我这样写是因为我无法访问nameshort_description字段,但它们在结果中。不知道为什么。所以,cpev.valuename场,cpet.valueshort_description场。此外,我无法按这些字段对结果进行排序。我试过$collection->addOrder('SUM(rel1+rel2)');,,$collection->getSelect()->order(new Zend_Db_Expr('SUM(rel1+rel2)').' DESC');一些addAttributeToFilter东西等,但它不起作用。

编辑 2: 我接受了@james的回答,但最后我们购买了一个扩展来改进搜索结果。

4

2 回答 2

5

Mage_CatalogSearch_Model_Resource_Fulltext签出(1.7 CE中prepareResult的第 310 行)并查找以下内容:

$select->columns(array('relevance'  => new Zend_Db_Expr(0)));

Magento 将所有搜索结果相关性设置为 0 (!);在此处添加您想要的相关性(越高越好)。您可以在其中创建自定义查询Zend_Db_Expr()以在属性匹配上生成更高的相关性。

于 2013-01-10T18:36:09.740 回答
3

第一个问题 (1) 的答案:要进行 AND 搜索而不是 OR,您需要重写该类

Mage_CatalogSearch_Model_Resource_Fulltext

在方法中

public function prepareResult($object, $queryText, $query)

你想切换部分

$likeCond = '(' . join(' OR ', $like) . ')';

$likeCond = '(' . join(' AND ', $like) . ')';

请务必在之后重新索引搜索索引以产生效果。

于 2012-12-19T13:59:11.817 回答