2011-07-08 10 views
2

現在、フロントエンドの製品検索フィールドの結果を提供するMySQLデータベースクエリは、WHERE句で "OR"リンク条件を使用しているようですクエリのMagento/PHP - フロントエンド製品検索ボックスの基礎となるMySQLクエリの変更

"OR"を使用していると仮定した理由は、 "緑と赤のチェックシャツ"のようなものを検索すると、 "赤"( "退屈"、 "保存済み"など) )、すべての製品は "緑"、すべての製品は "格子縞"、およびすべての製品は "シャツ"。今

コードでクエリが構築されているところ、私はちょうど見つけることができれば、私はそれを変更「AND」と、このようなクエリで終わることができる必要があります:

SELECT `product_id` FROM `products` WHERE `search_index` LIKE '%red%' AND `search_index` LIKE '%green%' AND `search_index` LIKE '%plaid%' AND `search_index` LIKE '%shirt%'; 

Iの避難所」 GoogleやMagentoのフォーラムを検索することで情報を見つけることができました。私はapp/code/core/Mage/CatalogSearch /の周りを掘り下げていますが、まだ母親の手を見つけていません。私は混乱しているはずのZendインターフェイスがあるかもしれないが、まだそれを見つけられていないことを知っている。事前に

おかげ

+0

"mother lode"を正しく使用するための+1インターネット。 – clockworkgeek

+0

@clockworkgeek fanks。 P.P.私はそれを見つけたと思う! –

答えて

3

UPDATE

Mage_CatalogSearch_Model_Query中とMage_CatalogSearch_Model_Mysql4_Search_CollectionクラスのCataloSearchフォルダ下の答えは、nを行います彼らは検索コードのいくつかを変更しているので、Magento 1.7+ではうまくいかないようです。私はそれを解決するために取り組んでおり、後で更新する予定です。


私は自分の質問に答えるつもりです。ありがとうございました、Anton Sに手がかりがありましたが、私は自分でいくつかの鍵ファイルを見つけ、私が望む変更を実装することができました。ここで

キーファイルです: アプリ/コード/コア/メイジ/ CatalogSearch /モデル/ Mysql4/Fulltext.php

あなたはcorelocal構造にそのファイルにつながる構造、およびコピーをコピーしますそこにもコアファイルは、そのよう: アプリ/コード/ローカル/メイジ/ CatalogSearch /モデル/ Mysql4/Fulltext.php

はその後一人でcoreファイルを残して、localファイルに対するすべての変更を行います。この関数prepareResult内側の線315の周りのコードのビット、($オブジェクト、$ QUERYTEXT、$クエリ)のための

ルック:

foreach($words as $word) { 
    $like[ ] = '`s`.`data_index` LIKE :likew' . $likeI; 
    $bind[':likew' . $likeI] = '%' . $word . '%'; 
    $likeI ++; 
} 
if ($like) { 
    $likeCond = '(' . join(' OR ', $like). ')'; 
} 

そうだOR '私に役に立たない結果の数千を与えていたものがあります。例えば、 "緑と赤のチェックシャツ"の検索は、緑、赤、および/またはチェック柄(シャツ、スカート、ブリム、ウサギを含む)、店内のすべてのシャツを私に見せてしまうでしょう。ユーザーが実際に探したいのは、すべての検索語を含む製品です。上記のように、「赤い」が含まれているため「退屈」や「保存済み」などの検索結果も表示されます。

問題のほとんどを解決するには、単に「OR」を「AND」に変更するだけです。また、変更は「FULLTEXT」タイプではなく、「LIKE」タイプの検索にのみ適用されます。あまりにも多くの結果を排除するため、FULLTEXTはMagentoではうまく機能しません。以下に概説されている方法がはるかに優れています。

変更するには:

  1. は、上記の変更でファイルを保存します。
  2. システム - >カタログ - >カタログ検索に移動し、検索タイプが「好き」であることを確認します。
  3. 管理者で、システム - >インデックス管理に移動し、カタログ検索インデックスの隣にあるチェックボックスをオンにしてインデックスを再作成するか、またはすべてインデックスを再作成します。 (OR Magentoのルート型で、コマンドラインから:

    PHPシェル/ indexer.php --reindex catalogsearch_fulltext

あなたはときにも "退屈" などの単語を除外したい場合"red"を検索すると、同じファイルに2回目の変更を実装することができます。その読み取り内部コードの別のセクションがあり

$bind[':likew' . $likeI] = '%' . $word . '%'; 

%前面には「退屈」%赤%のようなものであることを意味します。しかし、インデックスが構築される方法のために適切な効果を得るためには、最初の%を削除するだけではありません。

  1. 変化に上記のコード行:

    $バインド[ ':likew' だからではなく、あなたは、これら2つの変更を行います。 $ likeI] = '%'。 $ word。 '%';

    閉じる引用符の前の最初の%の後のSPACEに注意してください。これで、$ wordで始まる単語だけが検索されます(例:red、redding、reddy、rediculousはすべて '%red%'と一致します)。ただし、すべての単語の前にスペースがあるようにする必要があります。ファイルの先頭付近

  2. 、クラスMage_CatalogSearch_Model_Mysql4_Fulltextの下で、ライン48の周りに、あなたはこれを見つける必要があります。

    保護の$ _separator = '|';

私はちょうどこれにそれを変更:

protected $_separator = ' | '; 

は、パイプの両側にスペースを置きます。インデックスを再作成すると、すべての単語の前後に空白が表示されます。 "kit"を検索すると "kitchen"の検索結果が得られますが、少なくとも "skit"の検索結果は表示されません。

最後に、私が行った最後の変更の1つは、少なくとも複数の「s」で終わる複数の検索が単一の検索と同じ結果を返すようにすることでした。今、「赤と緑の格子縞のシャツ」は赤の論理積の緑のチェック模様「と同じ結果を返し、

foreach($words as $word) { 
    $word = rtrim($word, 's'); //this line added 
    $like[ ] = '`s`.`data_index` LIKE :likew' . $likeI; 
    $bind[':likew' . $likeI] = '%' . $word . '%'; 
    $likeI ++; 
} 

単にすべての単語の終わりオフ「s」をチョップ: Iは示されたコードの行を追加しましたシャツ"。

私の次のプロジェクトでは、複数単語の検索でより良い結果を得るために、文字列の解析にいくつかの変更を加えることがあります。私はFYI、このファイルを探しています:文字列解析のためのFulltext.phpファイルで使用されているアプリ/コード/コア/メイジ/コア/ヘルパー/ String.php

function splitWords 

を、。

注:この変更がアップグレードセーフにするには、あなたがapp/code/localapp/code/core過ぎてフォルダ構造を複製するだろう、このような: アプリ/コード/ローカル/メイジ/ CatalogSearch /モデル/ Mysql4/Fulltext.php

そこにコアファイルをコピーしてそこに変更を加えてください。

+0

ええ、ローカルのフォルダ構造を作り直す方法があります。 – demonkoryu

+0

私はまだそれをしていませんが、私がこの投稿を編集して(私が覚えていれば)それらのステップを追加します。 –

1
あなたは、検索クエリのシステムから>設定>カタログ>カタログ検索を設定し、自身がアプリ/コード/コア/メイジの下に配置され、クエリの

検索コードの種類を選択することができます

/

+0

チップをありがとう。私はapp/code/core/Mage/CatalogSearch/Model/Mysql4/Search/Collection.phpを見て、ファイルには基本的なクエリ文字列の構築がたくさんあります。それは正しい場所のように見えました。しかし、ファイルを破損させてファイルの名前を変更しようとしましたが、フロントエンドの検索機能には何の影響もありませんでした。解析エラーでもありませんでした。 一方、app/code/core/Mage/CatalogSearch/Model/Query.php DIDを使用すると、サーバーエラーが発生しますが、そのファイルにはベースレベルのクエリ文字列がありません。何か案は? –

1

Magento CE 1.6.0.0を使用していますが、MySql4フォルダではなくResourceフォルダにファイルがあります。お役に立てれば。

+0

はい、彼らは明らかにそれをCE 1.5と1.6の間でいつか動かしました。 1.7の '/ app/code/core/Mage/CatalogSearch/Model/Resource'フォルダにあります。 –

関連する問題