13

首先,我在SO中發現了類似的問題,但他們沒有任何答案。所以,這個問題的第一部分有點重複。我想改善Magento中的搜索結果。下面是我做了什麼已經:如何以及在哪裏修改Magento搜索查詢?

搜索與AND而不是當有多個單詞OR

2.阿賈克斯搜索開始從任何地方,不僅從田裏的開始搜索。

3.從單詞中修剪最後的s以避免在用複數形式搜索時產生空的結果。

4.我改變了搜索類型從LikeFulltextCombine,但效果並不好,甚至是最糟糕的,所以我把它原樣。現在是Like,所以沒有relevance排序。

,我想嘗試的最後一件事是adding this to the search query

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的新手,在找到這種類型的東西時仍然遇到問題。那麼,當我不得不擴展查詢時,我必須在哪裏放置我的附加內容?

Community Edition Magento,版本1.6.1.0。

注意:我知道一些用於改進搜索結果的擴展將比我的解決方案效果好得多,但現在我必須以這種方式來完成。對我來說這也是一個很好的經歷。

編輯:

所以,我想通了,如何添加我的自定義字段進行排序,但它
untruly我想。在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.'")')) 
); 

我的這些領域,但現在你可以看到我已經硬編碼的東西一樣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: 我接受@詹姆斯「的答案,但最後我們買了改善搜索結果的擴展。

+0

使用Solr或ElasticSearch我相信這是解決您的問題的更好方法。它更適合覆蓋複數/單數搜索,同義詞,拼寫,相關性。 – FlorinelChis

+0

謝謝,@FlorinelChis。我也檢查了不同的Magento擴展。但現在我想這樣做,因爲我不是很有經驗的添加第三方的東西,第二件事是我沒有太多的網上商店的權利。你能幫忙修改原始查詢嗎? – enenen

回答

4

Mage_CatalogSearch_Model_Resource_Fulltext退房prepareResult(線310 1.7 CE),並查找以下:

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

的Magento將所有搜索結果關聯度爲0;(!)在這裏添加你想要的關聯(越高越好)。您可以在​​中創建自定義查詢以生成更高的屬性匹配關聯。

3

回答你的第一個問題(1): 要使一個,而是搜尋或,你將需要重寫類

Mage_CatalogSearch_Model_Resource_Fulltext 

在該方法中

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

你想到

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

切換部分

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

務必重新索引搜索索引後才能生效。

+0

_這裏是我已經做的:_在列表的頭部 –

+0

@mpapper,我已經完成了這些。我的問題是修改搜索查詢。 – enenen

+0

@enenen對不起,我誤解了你的問題。 – mpaepper

相關問題