如何以及在何处修改Magento搜索查询?
首先,我在SO中发现了类似的问题,但没有任何答案。因此,问题的第一部分有点重复。我想改进Magento中的搜索结果。以下是我已经做过的: 1。当有多个单词时,用如何以及在何处修改Magento搜索查询?,magento,collections,e-commerce,entity-attribute-value,magento-1.6,Magento,Collections,E Commerce,Entity Attribute Value,Magento 1.6,首先,我在SO中发现了类似的问题,但没有任何答案。因此,问题的第一部分有点重复。我想改进Magento中的搜索结果。以下是我已经做过的: 1。当有多个单词时,用和而不是或搜索 2.Ajax搜索从任何地方开始搜索,而不仅仅是从字段的开头开始搜索 3.在使用复数搜索时,从单词中修剪最后一个s,以防止出现空结果 4.我将搜索类型从Like更改为Fulltext或Combine,但结果不是更好,甚至是最差的,所以我保持原样。它就像现在的,所以没有相关性排序 我最不想尝试的是: 这是我的查询,但我不确定它
和而不是或搜索
2.Ajax搜索从任何地方开始搜索,而不仅仅是从字段的开头开始搜索
3.在使用复数搜索时,从单词中修剪最后一个s
,以防止出现空结果
4.我将搜索类型从Like
更改为Fulltext
或Combine
,但结果不是更好,甚至是最差的,所以我保持原样。它就像现在的
,所以没有相关性
排序
我最不想尝试的是:
这是我的查询,但我不确定它是否有效,因为我无法测试它:
$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->\u productCollection
不是正确的对象,我知道。我查看了所有的Collection.php
文件、资源模型、模型,甚至查询日志,但运气不好。有些文件中只有少量的1或2行部分,但不是完整的查询。我是新来Magento的,在寻找这类东西时仍然有问题。那么,当我必须扩展一个查询时,我必须把额外的东西放在哪里
社区版Magento,版本1.6.1.0
注意:我知道一些改进搜索结果的扩展会比我的解决方案好得多,但现在我必须这样做。这对我来说也是一次很好的经历
编辑:
因此,我找到了如何为订购添加自定义字段的方法,但它是
我认为这是不真实的。在class Mage\u CatalogSearch\u Model\u Layer扩展了Mage\u Catalog\u Model\u Layer
的prepareProductCollection
方法中,我向查询添加了两个连接,并获取字段rel1
和rel2
:
$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=96
等。这一点都不好,而且不会每次都起作用-我直接从数据库表中检查了这些id。我这样写是因为我没有访问name
和short\u description
字段,但它们都在结果中。不知道为什么。因此,cpev.value
是name
字段,cpet.value
是short\u description
字段。此外,我不能按这些字段排序结果。我尝试了$collection->addOrder('SUM(rel1+rel2)')代码>,$collection->getSelect()->订单(新Zend_Db_Expr('SUM(rel1+rel2)'))。'DESC')
,一些addAttributeToFilter
之类的东西,但它不起作用
编辑2:
我接受了@james的回答,但最后我们购买了一个扩展来改进搜索结果。第一个问题(1)的答案:
要进行AND搜索而不是OR,您需要重写该类
Mage_CatalogSearch_Model_Resource_Fulltext
在方法中
public function prepareResult($object, $queryText, $query)
你想换个角色吗
$likeCond = '(' . join(' OR ', $like) . ')';
到
确保随后重新索引搜索索引以产生效果。在Mage\u CatalogSearch\u Model\u Resource\u Fulltext
中,查看prepareResult
(1.7 CE中的第310行),并查找以下内容:
$select->columns(array('relevance' => new Zend_Db_Expr(0)));
Magento将所有搜索结果相关性设置为0(!);在这里添加你想要的相关性(越高越好)。您可以在Zend\u Db\u Expr()
中创建自定义查询,以生成更高的属性匹配相关性。使用Solr或ElasticSearch,我相信这是解决问题的更好方法。它更适合涵盖复数/单数搜索、同义词、拼写、相关性。谢谢,@FlorinelChis。我也检查了不同的Magento扩展。但现在我想这样做,因为我在添加第三方内容方面不是很有经验,第二件事是我在网上商店没有太多的权利。您能帮我修改原始查询吗?以下是我已经做过的事情:was在list@mpaepper,我已经做了这些。我的问题是修改搜索查询。
$likeCond = '(' . join(' AND ', $like) . ')';
$select->columns(array('relevance' => new Zend_Db_Expr(0)));