Arama Türü: Gibi, Tam Metin veya Kombine?


48

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.

Yanıtlar:


63

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.


Sevmek

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.


Tam metin

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_Mysql444. 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


birleştirmek

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.


Dikkat edilecek şeyler

  1. Daha iyi performans ve ilgili sonuçlar için FULLTEXT kullanmanızı şiddetle tavsiye ederim
  2. Her özelliği gözden geçirin ve tam metin dizinine eklemenin gerekli olup olmadığını düşünün ('Hızlı aramada kullanın')
  3. Varsayılan olarak ürün açıklamaları FULLTEXT endekslemesine dahil edilir. Alakasız bağlamlarda kullanılan kelimelerle alaka düzeyi puanlarını kirlettiği için açıklamaları neredeyse her zaman kaldırırım.
  4. Meta niteliklerinizin tam metin dizininde kullanıldığından emin olun. Onları anlamlı içerikle doldurun.
  5. MySQL FULLTEXT bazı tuhaflıklar içeriyor - ürün isimleriniz bu kelimelerden oluşuyorsa, sorunlu olabilecek , dikkate alınmayan kelimelerin bir listesine sahiptir !
  6. MySQL varsayılan olarak 4 karakterin altındaki FULLTEXT sorgularını yoksayar . Bu değeri değiştirmezseniz, kısa değerli öznitelikler dikkate alınmaz.

Combine yöntemini kullanarak 5. ve 6. noktalarda çalışabilirsiniz - LIKE sonuçları FULLTEXT'nin yok sayılan sözcükleri telafi etmesi gerekir.


7

"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:

  • hızla performans sorunu olacak
  • alaka düzeyi kötüdür. Aslında benzer sorgularda "alaka düzeyi" kavramı yoktur.

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:

  • performans daha iyi
  • stopwords'leri hariç tutacaktır ("ve", "gibi" vb.)
  • Alaka düzeyine göre her bir sonuç için varsayılan olarak bir puan atar

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.


1
Bu cevap için teşekkürler. Magento EE'ye neden ihtiyacım olsun?
PiTheNumber

1
Solr araması, Magento Girişiminin bir parçasıdır (topluluğun bir özelliği değildir). Magentocommerce.com/magento-connect/solr-bridge-search.html gibi toplulukta arama uygulayacak uzantılar vardır . Onları ben kullanmadım.
Paul Grigoruta

6

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


Tam metin daha güçlüdür, ancak varsayılan düzeneğe bağlı olarak, 5 veya 4 karakterden daha kısa sözcükler için sonuç verecekse, benim.cnf'deki kurulumlara ihtiyaç duyar. Gibi arama sık sık kırık gönderilir ve mantığının VEYA'dan VE'ye değişmesi gerekir, bu nedenle çok fazla alakasız sonuç vermez.
Fiasco Labs

Tam metin konusunda haklısın. Bir VPS'de veya Magento'da barındırma sunan bir şirketle ev sahipliği yapmak her zaman akıllıdır. Fulltext config gibi seçenekler mevcut olmalıdır ya da en azından kendiniz ayarlayabilirsiniz. @Fiasco Labs için herhangi bir 3. parti arama öneriniz var mı?
Sander Mangel

@FiascoLabs, nasıl değiştiririm ORiçin AND?
Michael Yaeger

3

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.phpsize ç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)


1
Geçersiz kılmayı söyledin app/code/local/Mage/Core/Model/Resource/Helper/Abstract.php. Bu dosya arama fonksiyonundan başka bir yerde kullanılmaz mı?
amitshree

1
@ amitshree İyi bir soru. Kafamın tepesinden haberim yok. Sanırım arama sonuçları için herhangi bir model kaynak tarafından kullanılabilir. Fakat bu, özellikle LIKESQL 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.
Buttle Butkus

2

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.