13

まず、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つの結合を追加し、フィールド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.value、はshort_descriptionフィールドです。さらに、これらのフィールドで結果を並べ替えることはできません。$collection->addOrder('SUM(rel1+rel2)');、、$collection->getSelect()->order(new Zend_Db_Expr('SUM(rel1+rel2)').' DESC');いくつかのaddAttributeToFilterものなどを試しましたが、機能しません。

編集2:@jamesの回答 を受け入れましたが、最終的に検索結果を改善するための拡張機能を購入しました。

4

2 に答える 2

5

Mage_CatalogSearch_Model_Resource_Fulltextチェックアウト(prepareResult1.7 CEの行310)で、次を探します。

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

Magentoは、すべての検索結果の関連性を0(!)として設定します。ここに必要な関連性を追加します(高いほど良い)。でカスタムクエリを作成して、Zend_Db_Expr()属性の一致により高い関連性を生成できます。

于 2013-01-10T18:36:09.740 に答える
3

最初の質問への回答(1):ORの代わりにAND検索を行うには、クラスを書き直す必要があります

Mage_CatalogSearch_Model_Resource_Fulltext

メソッドで

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

パーツを切り替えたい

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

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

効果を得るには、後で検索インデックスのインデックスを再作成してください。

于 2012-12-19T13:59:11.817 に答える