Яка різниця між різними типами пошуку?
- Подібно до
- Повний текст
- Комбінований
Мене особливо цікавить, як змінюються поведінка пошуку та продуктивність для цих налаштувань.
Яка різниця між різними типами пошуку?
Мене особливо цікавить, як змінюються поведінка пошуку та продуктивність для цих налаштувань.
Відповіді:
Всі завжди скаржаться на пошук 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.
Ви можете подолати точки 5 та 6, використовуючи метод Комбінувати - результати LIKE повинні компенсувати будь-які слова, які FULLTEXT ігнорується.
Пошук "подобається" виконає звичайну відповідність, використовуючи запит типу "ключове слово%". Однією з переваг цього типу пошуку є те, що він відповідатиме частковим словам. Однак він має серйозні недоліки:
Пошук у повнотекстовому режимі буде працювати за допомогою повнотекстового пошуку MyISAM ( http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html ). Ви повинні прочитати про це, але в двох словах:
Недолік повного тексту полягає в тому, що він не може робити часткові збіги, тобто пошук "pho" не знайде "телефон"
"Комбінований" пошук використовує умову "подобається", щоб відповідати результатам, але також враховуватиме повний текст пошуку для їх сортування. Це означає, що ви отримаєте більше результатів (як і пошук, і часткові збіги), і вони також будуть замовлені краще через повний бал.
Як говорили інші, якщо ви серйозно ставитесь до пошуку, вам слід скористатися 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 ДОПОМОГА документація тут: http://dev.mysql.com/doc/refman/5.0 /en/string-comppare-functions.html
OR
на AND
?
Проблема з 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 |
(відзначте пробіли до та після кожного "|" та "/" та пробіл перед першим словом)
app/code/local/Mage/Core/Model/Resource/Helper/Abstract.php
. Цей файл не використовується ніде, окрім функції пошуку?
LIKE
у пошукових запитах SQL, а де ще Magento шукає, крім індексу пошуку продуктів? Я змінив 2 роки тому на виробничому майданчику, і помилок, пов’язаних із цим, ми не знайшли. Все, що вона насправді робить, це зробити так, що "початок слова" повинен мати пробіл перед ним, а "кінець слова" повинен мати пробіл після. Окремо в індексі я переконуюсь, що кожне слово має пробіли навколо нього.
Нічого з перерахованого вище, використовуйте вбудовану пошукову систему Zend Lucene, встановивши щось на кшталт Blast Lucene Search або Extendeware Lucene Search. Актуальність перевищує будь-яку пропозицію MySQL.
Так, я пройшов усі ітерації щодо прийнятої відповіді, але, чесно кажучи, оптимізованого пошуку запасів Magento все ще не вистачало.
З іншого боку, Lucene доставляє і вже включений у встановлення Magento, для його увімкнення просто потрібен модуль.