Farklı arama türleri arasındaki fark nedir?
- Sevmek
- Tam metin
- kombine
Bu davranış için arama davranışının ve performansın nasıl değiştiğiyle özellikle ilgileniyorum.
Farklı arama türleri arasındaki fark nedir?
Bu davranış için arama davranışının ve performansın nasıl değiştiğiyle özellikle ilgileniyorum.
Yanıtlar:
Herkes her zaman Magento araştırmasından şikayet eder, ancak zaman planlaması ve yapılandırması için zaman harcarsanız gerçekten işe yarayacağına inanıyorum.
Anahtar kelimeye dayalı arama yöntemi, sorgunuzu tek tek kelimelere ayırma. Sınıftaki 326 satırından aşağıya bakınızMage_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) . ')';
}
Arama sorgunuzdaki her bir kelimeyi böldüğünü ve bunları LIKE ifadelerinde birleştirdiğini görebilirsiniz - bununla sonuçlanacaksınız:
WHERE `attribute` LIKE 'my' OR `attribute` LIKE 'search' OR `attribute` LIKE 'query'
Bu yöntem, ürün adlarının basit olduğu ve müşterilerin çok özel öğeleri aradığı bazı mağaza kurulumlarında işe yarayabilir, ancak deneyimlerime göre iyi bir seçim değil.
Alaka düzeyi temelli arama - her arama sorgusu, MySQL'in MATCH ... AGAINST sorgusuna göre atanan puanlara göre derecelendirilir . Bunu Mage_CatalogSearch_Model_Resource_Helper_Mysql4
44. satırda çalışırken görebilirsiniz:
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, tam metin aramaları yaparken kullandığı veritabanı tablosudur catalogsearch_fulltext
. Örnek bir değer:
EmCO0014e|Emma Certified|Emma Certified Organic Herbal Tonic Mist TRIAL/TRAVEL|Australian|Certified Organic|Palm Oil Free|Nut Free|Vegan Suitable|
Bu değerler, Katalog> Öznitelikler> Öznitelikleri Yönet altındaki 'Hızlı Aramada Kullanım' olarak belirttiğiniz özelliklere doğrudan bağlanır
Oldukça kendini açıklayıcı. Mage_CatalogSearch_Model_Resource_Fulltext satırının 354. satırına bakın :
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 sonuçları geri döndükten sonra sadece LIKE sonuçlarını eklediğini görebilirsiniz.
Combine yöntemini kullanarak 5. ve 6. noktalarda çalışabilirsiniz - LIKE sonuçları FULLTEXT'nin yok sayılan sözcükleri telafi etmesi gerekir.
"Beğen" araması, benzer bir '% anahtar kelime%' sorgusu kullanarak her zamanki benzer eşleşmeyi yapar. Bu tür bir aramanın bir avantajı, kısmi kelimelerle eşleşmesidir. Yine de ciddi sakıncaları var:
Tam metin araması, MyISAM tam metin aramasını kullanarak çalışacaktır ( http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html ). Bunu okumalısınız, ama kısaca:
Tam metnin dezavantajı kısmi eşleşmeler yapamamasıdır, yani "pho" araması "telefonu" bulamaz.
"Birleştirilmiş" arama, sonuçları eşleştirmek için bir "like" koşulu kullanır, ancak bunları sıralamak için tam metin arama puanını da dikkate alır. Bu, daha fazla sonuç alacağınız anlamına gelir (tıpkı arama gibi kısmi eşleşmeler de yapar) ve tam metin puanı nedeniyle daha iyi sıralanırlar.
Diğer kişilerin dediği gibi, eğer arama konusunda ciddiysen, Solr'u kullanmalısın. Çok daha hızlı ve çok daha alakalı. Magento EE'ye sahip olmanız ve Solr'ı kendiniz yüklemeniz gerekir.
Magento'nun kullanacağı sorgu türüne doğrudan referanslar. Şahsen, Tam Metin aramasının daha güçlü olduğunu ve performansının daha iyi olduğunu düşünüyorum, özellikle de LIKE joker karakterlerle kullanılıyorsa (%). Her ikisinin bir kombinasyonu muhtemelen en doğru olacaktır ancak fazlaca olabilir. Ben tam metni ile sopa.
Ancak güçlü bir arama çözümü arıyorsanız, bu projeye göz atın: https://code.google.com/p/magento-solr/ . SOLR büyük koleksiyonları aramak için üretildi ve uygulanması biraz zaman alabilir ancak buna değer olmalı. Şahsen daha önce Magento'da hiç kullanmamıştım ama diğer PHP projelerinde çok iyi bir performans sergiledi.
Tam metin dokümantasyonunu burada bulabilirsiniz: http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html Burada LIKE dokümantasyonu: http://dev.mysql.com/doc/refman/5.0 /en/string-comparison-functions.html
OR
için AND
?
LIKE ile ilgili sorun varsayılan olarak "% terim%" i kullanıyor. Kelimelerin başlangıcıyla eşleşmesi için "terim%" (terimden önceki boşluğa dikkat edin) eşleşecek şekilde değiştirdim. Ayrıca arama terimlerindeki finaldeki finalleri de kestim, böylece "otomobiller", "otomobiller" ile aynı sonuçları veriyor. Açıkçası bu, "çocuklar" gibi düzensiz isimlere yardımcı olmuyor, ancak yine de çok büyük bir gelişme.
Magento'nun en açıklanamayan en saçma hareketi, "VE" yerine "VEYA" aramasını kullanmaktır. Eğer "kırmızı arabaları" ararsanız, kırmızı olan her şeyi (arabalar, köpekler, çatallar, dağ tarafı vb. Dahil) ve her türlü araba (kırmızı, mavi, yeşil, sarı vb. Dahil) elde edersiniz. İle "AND", arama nasıl olduğu, "kırmızı" VE "otomobil" içeren tek ürün almak gerekir çalışır!
Jharrison.au kullanıcısının yanıtından alıntı yapın, bunu değiştirin:
if ($like) {
$likeCond = '(' . join(' OR ', $like) . ')';
}
Buna:
if ($like) {
$likeCond = '(' . join(' AND ', $like) . ')';
}
Arama sonuçlarınızın alaka düzeyine hemen ve büyük bir destek vermek için.
Çoğul şey için, böyle bir kelimenin son "s" sini kesebilirsiniz:
$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'
}
In app/code/local/Mage/Core/Model/Resource/Helper/Abstract.php
size çekirdek dosyası geçersiz kılabilir ve değişim public function escapeLikeValue($value, $options = array())
tavsiye yolu modülde aynı şeyi yapmak olmasına rağmen, hızlı bir kısayol olarak. Ama işte burada.
Altında if (isset($options['position'])) {
bir anahtar var. Değerden önce ve sonra boşluk eklemek için 'start' ve 'end' durumlarını değiştirdim:
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;
Çalışmadan önceki / sonraki boşluklar için, muhtemelen yaptığım gibi, arama dizininin oluşturulma şeklini de değiştirmeniz gerekir, böylece her kelimeden önce ve sonra bir boşluk olduğundan emin olursunuz. Dizini oluşturmanın varsayılan yolu, her alanı '|' ile ayırmaktır. (boru karakteri), örneğin renk, ürün tipi ve ürün tanımlaması için "mavi | araba | çok güzel bir araba". Ama dizinimde "mavi | araba | çok güzel bir araba" var. Arama dizininin oluşturulmasını bile değiştirebilirsiniz; böylece belki hecelenmiş sözcükler değiştirilir ("süper hızlı araba", "süper hızlı araba" olur), vb.
Varsayılan bir arama dizini alanının şu şekilde görüneceği jharrison.au'nun cevabından bir örnek ödünç almak:
EmCO0014e|Emma Certified|Emma Certified Organic Herbal Tonic Mist TRIAL/TRAVEL|Australian|Certified Organic|Palm Oil Free|Nut Free|Vegan Suitable|
Benimki şöyle görünür:
EmCO0014e | Emma Certified | Emma Certified Organic Herbal Tonic Mist TRIAL / TRAVEL | Australian | Certified Organic | Palm Oil Free | Nut Free | Vegan Suitable |
(her "|" ve "/" 'den önce ve sonra ve ilk kelimeden önce bir boşluk bırakınız)
app/code/local/Mage/Core/Model/Resource/Helper/Abstract.php
. Bu dosya arama fonksiyonundan başka bir yerde kullanılmaz mı?
LIKE
SQL arama sorgularında kaçmak için ve Magento başka yerde ancak ürün arama endeksinde arama yapıyor mu? Bu değişikliği 2 yıl önce bir üretim tesisinde yaptım ve bununla ilgili herhangi bir hata bulamadık. Tek yaptığı şey, bir “kelimenin başlangıcı” ndan önce boşluk bırakmalı ve “kelimenin sonunda” sonradan boşluk bırakmalı. Ayrı olarak, endekste her kelimenin etrafında boşluk olduğundan emin olun.
Yukarıdakilerin hiçbiri, Blast Lucene Search veya Extendeware Lucene Search gibi bir şey yükleyerek yerleşik Zend Lucene arama motorunu kullanın. Alaka düzeyi, MySQL tekliflerinden herhangi birini yener.
Evet, kabul edilen cevabın bütün yinelemelerini geçtim, ama açıkçası, Optimize Edilmiş Stok Magento araştırması hala çok eksikti.
Lucene ise Magento tesisine teslim ediyor ve zaten dahil edilmiş durumda, sadece bunu etkinleştirmek için bir Modül gerekiyor.