異なる検索タイプの違いは何ですか?
- 好む
- 全文
- 組み合わせた
これらの設定の検索動作とパフォーマンスがどのように変化するかに特に興味があります。
異なる検索タイプの違いは何ですか?
これらの設定の検索動作とパフォーマンスがどのように変化するかに特に興味があります。
回答:
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_Mysql4
44行目でこの動作を確認できます。
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の結果が追加されるだけです。
Combineメソッドを使用すると、ポイント5および6を回避できます。LIKEの結果は、FULLTEXTが無視された単語を補正する必要があります。
「like」検索は、like '%keyword%'クエリを使用して、通常のlikeマッチを実行します。このタイプの検索の利点の1つは、部分的な単語に一致することです。ただし、次のような重大な欠点があります。
全文検索は、MyISAM全文検索(http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html)を使用して機能します。あなたはそれについて読むべきですが、一言で言えば:
フルテキストの欠点は、部分一致ができないことです。つまり、「pho」を検索しても「phone」が見つかりません。
「結合」検索では、「いいね」条件を使用して結果を一致させますが、それらをソートするために全文検索スコアも考慮します。これは、より多くの結果が得られることを意味し(検索も部分一致を行うように)、フルテキストスコアのために、より良い順序で並べられます。
他の人が言ったように、検索を真剣に考えているなら、Solrを使うべきです。それはずっと速く、ずっと関連性があります。ただし、Magento EEを所有し、Solrを自分でインストールする必要があります。
これらは、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
OR
しAND
ますか?
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 |
(すべての「|」と「/」の前後のスペースと、最初の単語の前のスペースに注意してください)
app/code/local/Mage/Core/Model/Resource/Helper/Abstract.php
。このファイルは検索機能以外では使用されていませんか?
LIKE
SQL検索クエリでのエスケープに特化したもので、Magentoで検索するのは製品検索インデックスのどこにあるのでしょうか?2年以上前に実稼働サイトでこの変更を行いましたが、これに関連するバグはまったく見つかりませんでした。実際に行うのは、「単語の始まり」の前にスペースが必要で、「単語の終わり」の後にスペースが必要です。それとは別に、インデックスでは、すべての単語の周りにスペースがあることを確認します。
上記のいずれでもない、Blast Lucene SearchやExtendeware Lucene Searchなどをインストールして、組み込みのZend Lucene検索エンジンを使用します。この関連性は、MySQLのどの製品よりも優れています。
ええ、私は受け入れられた答えのすべての反復を経験しましたが、率直に言って、最適化されたストックMagentoの検索はまだ非常に欠けていました。
一方、Luceneは、Magentoのインストールに含まれており、これを提供します。これを有効にするにはモジュールが必要です。