Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何以及在何处修改Magento搜索查询?_Magento_Collections_E Commerce_Entity Attribute Value_Magento 1.6 - Fatal编程技术网

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

如何以及在何处修改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,但结果不是更好,甚至是最差的,所以我保持原样。它就像现在的,所以没有相关性排序 我最不想尝试的是: 这是我的查询,但我不确定它

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

1。当有多个单词时,用
而不是
搜索

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)));