まず、SOで同様の質問を見つけましたが、答えはありません。したがって、質問の最初の部分は少し重複しています。Magentoの検索結果を改善したい。これが私がすでに行ったことです:
1.複数の単語がある場合ではAND
なく、で検索します。OR
2. Ajax検索は、フィールドの先頭からだけでなく、どこからでも検索を開始します。
3.s
複数形で検索するときに空の結果が出ないように、単語の最後をトリミングします。
4.検索タイプをLike
からFulltext
またはに変更しまし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)
これが私のクエリですが、テストできないため、うまくいくかどうかはわかりません。
$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。
注:検索結果を改善するための拡張機能は、私のソリューションよりもはるかにうまく機能することを知っていますが、今のところ、そのようにする必要があります。それは私にとっても良い経験になるでしょう。
編集:
そこで、注文用にカスタムフィールドを追加する方法を見つけましたが、それは
間違いだと思います。class Mage_CatalogSearch_Model_Layer extends Mage_Catalog_Model_Layer
のメソッドではprepareProductCollection
、クエリに2つの結合を追加し、フィールド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_description
フィールドにアクセスしていないので、このように書きましたが、結果に含まれています。理由はわかりません。つまり、cpev.value
はname
フィールドでありcpet.value
、はshort_description
フィールドです。さらに、これらのフィールドで結果を並べ替えることはできません。$collection->addOrder('SUM(rel1+rel2)');
、、$collection->getSelect()->order(new Zend_Db_Expr('SUM(rel1+rel2)').' DESC');
いくつかのaddAttributeToFilter
ものなどを試しましたが、機能しません。
編集2:@jamesの回答 を受け入れましたが、最終的に検索結果を改善するための拡張機能を購入しました。