Тип пошуку: Подобається, повний текст чи комбінований?


48

Яка різниця між різними типами пошуку?

  • Подібно до
  • Повний текст
  • Комбінований

Мене особливо цікавить, як змінюються поведінка пошуку та продуктивність для цих налаштувань.

Відповіді:


63

Всі завжди скаржаться на пошук 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 ... ПРОТИ запиту. Ви можете побачити це в дії у 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|

Ці значення безпосередньо пов'язані з атрибутами, які ви вказали як "Використовувати в швидкому пошуку" в розділі Каталог> Атрибути> Керувати атрибутами


Об’єднайте

Досить пояснюючи себе. Погляньте на рядок 354 Mage_CatalogSearch_Model_Resource_Fulltext :

        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;
        }

Ви можете бачити, що він просто додає результати LIKE після повернення результатів FULLTEXT.


Що потрібно відзначити

  1. Настійно рекомендую використовувати FULLTEXT для кращих показників та відповідних результатів
  2. Перегляньте кожен атрибут і подумайте, чи потрібно додавати його до індексу повного тексту ("Використовувати в швидкому пошуку")
  3. За замовчуванням описи товарів включаються в індексацію FULLTEXT. Я майже завжди знімаю описи, оскільки вони забруднюють результати відповідності словами, які використовуються у невідповідних контекстах.
  4. Переконайтеся, що ваші мета-атрибути використовуються в індексі повного тексту. Населяйте їх змістовним змістом.
  5. У MySQL FULLTEXT є деякі химерності - у ньому є список ігнорованих слів, які можуть бути проблематичними, якщо назви ваших продуктів складаються з цих слів!
  6. MySQL за замовчуванням ігнорує FULLTEXT запити під 4 символами . Атрибути з короткими значеннями будуть ігноруватися, якщо ви не зміните це значення.

Ви можете подолати точки 5 та 6, використовуючи метод Комбінувати - результати LIKE повинні компенсувати будь-які слова, які FULLTEXT ігнорується.


7

Пошук "подобається" виконає звичайну відповідність, використовуючи запит типу "ключове слово%". Однією з переваг цього типу пошуку є те, що він відповідатиме частковим словам. Однак він має серйозні недоліки:

  • швидко стане проблемою продуктивності
  • актуальність погана. Насправді немає поняття "релевантність" у подібних запитах

Пошук у повнотекстовому режимі буде працювати за допомогою повнотекстового пошуку MyISAM ( http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html ). Ви повинні прочитати про це, але в двох словах:

  • продуктивність краща
  • він буде виключати зупинки (наприклад, "і", "з" тощо)
  • Він призначить за замовчуванням бал кожному результату на основі релевантності

Недолік повного тексту полягає в тому, що він не може робити часткові збіги, тобто пошук "pho" не знайде "телефон"

"Комбінований" пошук використовує умову "подобається", щоб відповідати результатам, але також враховуватиме повний текст пошуку для їх сортування. Це означає, що ви отримаєте більше результатів (як і пошук, і часткові збіги), і вони також будуть замовлені краще через повний бал.

Як говорили інші, якщо ви серйозно ставитесь до пошуку, вам слід скористатися 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 ДОПОМОГА документація тут: http://dev.mysql.com/doc/refman/5.0 /en/string-comppare-functions.html


Fulltext є більш потужним, але він потребує налаштувань у my.cnf, якщо він буде давати результати для слів менше 5 або 4 символів, залежно від налаштування за замовчуванням. Як і пошук, часто постачається порушеним, і його потрібно змінити логіку з АБО на І, щоб він не мав занадто багато неактуальних результатів.
Лабораторії Фіаско

Ви маєте рацію щодо повного тексту. Завжди розумний або з хостом на VPS, або з компанією, яка пропонує хостинг Magento. Такі параметри, як конфігурація Fulltext, повинні бути доступні тоді або принаймні ви можете їх встановити самостійно. Чи є якісь пропозиції щодо пошуку третьої сторони @Fiasco Labs?
Сандер Мангел

@FiascoLabs, як змінити ORна AND?
Майкл Йегер

3

Проблема з LIKE полягає в тому, що він використовує "% term%" за замовчуванням. Я змінив його на "термін%" (відзначте пробіл перед терміном), щоб він відповідав початкам слів. Я також відрізав остаточне слово в пошуковому терміні, щоб "машини" давали ті самі результати, що і "машина". Очевидно, що це не допомагає з неправильними іменниками типу "діти", але це все-таки величезне вдосконалення.

Найбільший незрозумілий безглуздий крок Magento - використовувати пошук "АБО" замість "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'])) {є перемикач. Я змінив регістри для 'start' і 'end', щоб додати пробіли до та після значення:

 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;

Для пробілів до / після роботи, ймовірно, вам також доведеться змінити спосіб побудови індексу пошуку, як я це зробив, щоб він переконався, що перед кожним словом є пробіл. Типовим способом побудови індексу є відокремлення кожного поля знаком "|" (характер труби), наприклад, "синій | автомобіль | дуже хороший автомобіль" для індексації кольору, типу товару, опису товару. Але мій індекс має "синій | автомобіль | дуже хороший автомобіль". Можна навіть змінити індекс пошуку, щоб, можливо, замінили дефісні слова ("надшвидкий автомобіль" стає "супер швидкий автомобіль") тощо, тощо.

Позичаючи examplen з відповіді 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 Добре запитання. Я не знаю, як з голови. Думаю, це може бути використаний будь-яким ресурсом моделі для результатів пошуку. Але це дійсно спеціально для втечі LIKEу пошукових запитах SQL, а де ще Magento шукає, крім індексу пошуку продуктів? Я змінив 2 роки тому на виробничому майданчику, і помилок, пов’язаних із цим, ми не знайшли. Все, що вона насправді робить, це зробити так, що "початок слова" повинен мати пробіл перед ним, а "кінець слова" повинен мати пробіл після. Окремо в індексі я переконуюсь, що кожне слово має пробіли навколо нього.
Buttle Butkus

2

Нічого з перерахованого вище, використовуйте вбудовану пошукову систему Zend Lucene, встановивши щось на кшталт Blast Lucene Search або Extendeware Lucene Search. Актуальність перевищує будь-яку пропозицію MySQL.

Так, я пройшов усі ітерації щодо прийнятої відповіді, але, чесно кажучи, оптимізованого пошуку запасів Magento все ще не вистачало.

З іншого боку, Lucene доставляє і вже включений у встановлення Magento, для його увімкнення просто потрібен модуль.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.