如何以及在何处修改Magento搜索查询?

ene*_*nen 13 collections magento e-commerce entity-attribute-value magento-1.6

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

1.搜索AND而不是OR当有多个单词时.

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

3.修剪s单词中的最后一个以防止在使用复数形式搜索时出现空结果.

4.我将搜索类型更改LikeFulltext或者Combine但结果不是更好,甚至是最差的,所以我保持原样.它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)
Run Code Online (Sandbox Code Playgroud)

这是我的查询,但我不确定它是否可行,因为我无法测试它:

$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)');
Run Code Online (Sandbox Code Playgroud)

如果在产品标题中找到搜索查询,则主要思想是为结果添加奖励权重.问题是我不知道在哪里修改查询.我找不到它的位置.$this->_productCollection我不知道是不是正确的对象.我查看了所有Collection.php文件,资源模型,模型甚至查询日志,但没有运气.某些文件中只有少量的1或2行部分,但不是完整的查询.我是Magento的新手,但在找到这种类型的东西时仍然存在问题.那么,当我必须扩展查询时,我必须放置我的附加内容?

Community Edition Magento,版本1.6.1.0.

注意:我知道改进搜索结果的某些扩展程序将比我的解决方案更好,但是现在我必须以这种方式执行.对我来说这也是一次很好的经历.

编辑:

所以,我想出了如何为订购添加我的自定义字段,但
我认为这是不明智的.在class Mage_CatalogSearch_Model_Layer extends Mage_Catalog_Model_LayerprepareProductCollection方法,我添加了两个加入到查询并获取领域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.'")'))
);
Run Code Online (Sandbox Code Playgroud)

我现在有这些字段但是你可以看到我有硬编码的东西,比如attribute_id = 96等等一点也不好,而且每次都不起作用 - 我直接从数据库表中检查了这些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的回答,但最后我们购买了一个用于改进搜索结果的扩展程序.

jam*_*mes 5

Mage_CatalogSearch_Model_Resource_Fulltext检查出prepareResult(线310 1.7 CE),并查找以下内容:

$select->columns(array('relevance'  => new Zend_Db_Expr(0)));
Run Code Online (Sandbox Code Playgroud)

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