検索タイプ:「いいね」、「フルテキスト」、または「組み合わせ」


48

異なる検索タイプの違いは何ですか?

  • 好む
  • 全文
  • 組み合わせた

これらの設定の検索動作とパフォーマンスがどのように変化するかに特に興味があります。

回答:


63

Magentoの検索については誰もがいつも不満を言っていますが、計画と構成に時間をかければ、Magentoの検索は本当にうまくいくと思います。


好む

クエリを個々の単語に分割するキーワードベースの検索方法。クラスの326行目から以下を参照してくださいMage_CatalogSearch_Model_Resource_Fulltext::prepareResult()

            $words = Mage::helper('core/string')->splitWords($queryText, true, $query->getMaxQueryWords());
            foreach ($words as $word) {
                $like[] = $helper->getCILike('s.data_index', $word, array('position' => 'any'));
            }
            if ($like) {
                $likeCond = '(' . join(' OR ', $like) . ')';
            }

検索クエリの各単語を分割し、LIKEステートメントでそれらを結合していることがわかります。次のようになります。

WHERE `attribute` LIKE 'my' OR `attribute` LIKE 'search' OR `attribute` LIKE 'query'

この方法は、製品名がシンプルで、顧客が非常に特定のアイテムを検索する特定の店舗設定​​で機能する場合がありますが、私の経験ではそれは良い選択ではありません。


全文

関連性ベースの検索-すべての検索クエリは、MySQLのMATCH ... AGAINSTクエリに基づいて割り当てられたスコアに従って評価されます。Mage_CatalogSearch_Model_Resource_Helper_Mysql444行目でこの動作を確認できます。

public function chooseFulltext($table, $alias, $select)
{
    $field = new Zend_Db_Expr('MATCH ('.$alias.'.data_index) AGAINST (:query IN BOOLEAN MODE)');
    $select->columns(array('relevance' => $field));
    return $field;
}

全文検索の実行時にMagentoが使用するデータベーステーブルはcatalogsearch_fulltextです。値の例:

EmCO0014e|Emma Certified|Emma Certified Organic Herbal Tonic Mist TRIAL/TRAVEL|Australian|Certified Organic|Palm Oil Free|Nut Free|Vegan Suitable|

これらの値は、[カタログ]> [属性]> [属性の管理]で[クイック検索で使用]として指定した属性に直接リンクされています


組み合わせる

かなり自明です。Mage_CatalogSearch_Model_Resource_Fulltextの 354行目を見てください

        if ($likeCond != '' && $searchType == Mage_CatalogSearch_Model_Fulltext::SEARCH_TYPE_COMBINE) {
                $where .= ($where ? ' OR ' : '') . $likeCond;
        } elseif ($likeCond != '' && $searchType == Mage_CatalogSearch_Model_Fulltext::SEARCH_TYPE_LIKE) {
            $select->columns(array('relevance'  => new Zend_Db_Expr(0)));
            $where = $likeCond;
        }

FULLTEXTの結果が返された後、LIKEの結果が追加されるだけです。


注意事項

  1. パフォーマンスと関連する結果を向上させるために、FULLTEXTを使用することを強くお勧めします
  2. 各属性を調べて、フルテキストインデックスに追加する必要があるかどうかを検討します(「クイック検索で使用する」)
  3. デフォルトでは、製品の説明はFULLTEXTインデックスに含まれています。無関係なコンテキストで使用される単語で関連性スコアを汚染するため、ほとんどの場合、説明を削除します。
  4. メタ属性がフルテキストインデックスで使用されていることを確認してください。それらに意味のあるコンテンツを入力します。
  5. MySQL FULLTEXTにはいくつかの癖があります- 製品名がこれらの単語で構成されている場合、問題になる可能性のある無視された単語のリストがあります!
  6. MySQLはデフォルトで4文字未満の FULLTEXT クエリを無視します。この値を変更しない限り、短い値を持つ属性は無視されます。

Combineメソッドを使用すると、ポイント5および6を回避できます。LIKEの結果は、FULLTEXTが無視された単語を補正する必要があります。


7

「like」検索は、like '%keyword%'クエリを使用して、通常のlikeマッチを実行します。このタイプの検索の利点の1つは、部分的な単語に一致することです。ただし、次のような重大な欠点があります。

  • すぐにパフォーマンスの問題になります
  • 関連性が悪い。実際には、類似クエリには「関連性」という概念はありません。

全文検索は、MyISAM全文検索(http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html)を使用して機能します。あなたはそれについて読むべきですが、一言で言えば:

  • パフォーマンスが優れています
  • ストップワード(「and」、「with」など)を除外します
  • デフォルトでは、関連性に基づいて各結果にスコアが割り当てられます

フルテキストの欠点は、部分一致ができないことです。つまり、「pho」を検索しても「phone」が見つかりません。

「結合」検索では、「いいね」条件を使用して結果を一致させますが、それらをソートするために全文検索スコアも考慮します。これは、より多くの結果が得られることを意味し(検索も部分一致を行うように)、フルテキストスコアのために、より良い順序で並べられます。

他の人が言ったように、検索を真剣に考えているなら、Solrを使うべきです。それはずっと速く、ずっと関連性があります。ただし、Magento EEを所有し、Solrを自分でインストールする必要があります。


1
この答えをありがとう。なぜMagento EEが必要なのですか?
PiTheNumber

1
Solr検索はMagento Enterpriseの一部です(コミュニティの機能ではありません)。magentocommerce.com/magento-connect/solr-bridge-search.htmlのようなコミュニティで検索を実装する拡張機能があります。私はそれらを使用しませんでした。
ポールグリゴルタ

6

これらは、Magentoが使用するクエリのタイプへの直接参照です。個人的には、フルテキスト検索はより強力で、パフォーマンスが向上すると思います。特に、LIKEをワイルドカード(%)で使用する場合はそうです。おそらく両方の組み合わせが最も正確ですが、やり過ぎかもしれません。私は全文に固執します。

しかし、強力な検索ソリューションを探しているなら、このプロジェクトをチェックしてくださいhttps : //code.google.com/p/magento-solr/。SOLRは、大規模なコレクションを検索するために構築されたもので、実装には時間がかかる場合がありますが、価値があるはずです。個人的には、Magentoで使用したことはありませんが、他のPHPプロジェクトでは非常にうまく機能しました。

全文ドキュメントはここにあります:http : //dev.mysql.com/doc/refman/5.0/en/fulltext-search.html LIKEドキュメントはここにあります:http : //dev.mysql.com/doc/refman/5.0 /en/string-comparison-functions.html


フルテキストはより強力ですが、デフォルトの設定に応じて5文字または4文字未満の単語に対して結果を提供する場合は、my.cnfでの設定が必要です。検索と同様に、多くの場合、破損して出荷されるため、ORからANDにロジックを変更する必要があるため、無関係な結果が大量に生成されることはありません。
フィアスコラボ

あなたはフルテキストについて正しいです。VPSでホストするか、Magentoホスティングを提供する会社でホストすることは常に賢明です。フルテキスト設定などのオプションが利用可能になるか、少なくとも自分で設定できます。@Fiasco Labsにサードパーティ検索の提案はありますか?
サンダーマンジェル

@FiascoLabs、どのように変更ORANDますか?
マイケルヤーガー

3

LIKEの問題は、デフォルトで「%term%」を使用することです。「term%」(用語の前のスペースに注意)に一致するように変更したため、単語の先頭に一致します。また、「cars」が「car」と同じ結果になるように、検索語の最後の「s」を切り捨てました。明らかに、それは「子供」のような不規則な名詞には役立ちませんが、とにかく大きな改善です。

Magentoによる不可解な最大の動きは、「AND」の代わりに「OR」検索を使用することです。「赤い車」を検索すると、すべてが赤(車、犬、フォーク、山腹など)、およびあらゆる種類の車(赤、青、緑、黄色など)が表示されます。「AND」、あなたは検索がどのようにしている、「赤」と「車」含まれている項目のみを取得する必要があります仕事します!

jharrison.auの答えから引用して、これを変更してください:

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

これに:

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

検索結果の関連性を即座に大幅に高めるため。

複数形の場合、次のような単語の最後の「s」を切り取ることができます。

$words = Mage::helper('core/string')->splitWords($queryText, true, $query->getMaxQueryWords());
$words = array_walk($words,function(&$value, &$key) { 
    // use substr(...) instead of rtrim($value,'s') 
    // because rtrim will remove multiple esses
    $value = (substr($value,-1,1) === 's') ? substr($value,0,strlen($value - 1)) : $value;
});
foreach ($words as $word) {
       $like[] = $helper->getCILike('s.data_index', $word, array('position' => 'start')); // note I changed this to 'start'
}

ではapp/code/local/Mage/Core/Model/Resource/Helper/Abstract.php、あなたコアファイルを上書きすることができますし、変更するpublic function escapeLikeValue($value, $options = array())ことをお勧めの方法は、モジュールで同じことを行うことですが、迅速なショートカットとして。しかし、ここにあります。

if (isset($options['position'])) {にスイッチがあります。値の前後にスペースを追加するために、「開始」と「終了」のケースを変更しました。

 case 'start':
      $value = '% ' . $value . '%'; // added '% ' . before
      // $value = $value . '%'; // core way (bad way)
      break;
 case 'end':
      $value = '%' . $value . ' %'; // added . ' %' after
      // $value = '%' . $value; // core way (bad way)
      break;

前後のスペースが機能するためには、おそらく私が行ったように、検索インデックスの作成方法も変更する必要があります。これにより、すべての単語の前後にスペースがあることを確認します。インデックスを作成するデフォルトの方法は、各フィールドを「|」で区切ることです (パイプ文字)、たとえば、色、製品タイプ、製品説明のインデックスを作成するための「青|車|非常にいい車」。しかし、私のインデックスには「青|車|非常にいい車」があります。検索インデックスの構築を変更して、ハイフンでつながれた単語を置き換えることもできます(「超高速車」が「超高速車」になるなど)。

デフォルトの検索インデックスフィールドが次のようになっているjharrison.auの答えから例を借ります。

EmCO0014e|Emma Certified|Emma Certified Organic Herbal Tonic Mist TRIAL/TRAVEL|Australian|Certified Organic|Palm Oil Free|Nut Free|Vegan Suitable|

私のものは次のようになります。

 EmCO0014e | Emma Certified | Emma Certified Organic Herbal Tonic Mist TRIAL / TRAVEL | Australian | Certified Organic | Palm Oil Free | Nut Free | Vegan Suitable | 

(すべての「|」と「/」の前後のスペースと、最初の単語の前のスペースに注意してください)


1
をオーバーライドするように言及しましたapp/code/local/Mage/Core/Model/Resource/Helper/Abstract.php。このファイルは検索機能以外では使用されていませんか?
amitshree

1
@amitshree良い質問です。私は頭のてっぺんから知らない。おそらく、検索結果のモデルリソースで使用できると思います。しかし、これは本当にLIKESQL検索クエリでのエスケープに特化したもので、Magentoで検索するのは製品検索インデックスのどこにあるのでしょうか?2年以上前に実稼働サイトでこの変更を行いましたが、これに関連するバグはまったく見つかりませんでした。実際に行うのは、「単語の始まり」の前にスペースが必要で、「単語の終わり」の後にスペースが必要です。それとは別に、インデックスでは、すべての単語の周りにスペースがあることを確認します。
バトルビュータス

2

上記のいずれでもない、Blast Lucene SearchやExtendeware Lucene Searchなどをインストールして、組み込みのZend Lucene検索エンジンを使用します。この関連性は、MySQLのどの製品よりも優れています。

ええ、私は受け入れられた答えのすべての反復を経験しましたが、率直に言って、最適化されたストックMagentoの検索はまだ非常に欠けていました。

一方、Luceneは、Magentoのインストールに含まれており、これを提供します。これを有効にするにはモジュールが必要です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.