UPDATE
Приведенный ниже ответ не работает для Magento 1.7+, так как они изменили часть поискового кода. Я работаю над решением для этого и обновлю позже.
Я собираюсь ответить на свой вопрос. Спасибо, Антон С., за подсказки, но я сам нашел несколько ключевых файлов и смог осуществить необходимые изменения.
Вот файл ключа:
Приложение / код / ядро / Mage / CatalogSearch / Модель / mysql4 / Fulltext.php
Вы должны скопировать структуру core
, которая ведет к этому файлу, в структуру local
, а также скопировать туда файл core, например:
Приложение / код / местные / Mage / CatalogSearch / Модель / mysql4 / Fulltext.php
Затем внесите все изменения в файл local
, оставив файл core
в покое.
Найдите этот фрагмент кода в строке 315 внутри функции prepareResult ($ object, $ queryText, $ query):
foreach($words as $word) {
$like[ ] = '`s`.`data_index` LIKE :likew' . $likeI;
$bind[':likew' . $likeI] = '%' . $word . '%';
$likeI ++;
}
if ($like) {
$likeCond = '(' . join(' OR ', $like). ')';
}
Это «ИЛИ» есть то, что дало мне тысячи бесполезных результатов. Например, поиск «зеленая и красная клетчатая рубашка» в конечном итоге показал бы мне все вещи зеленого, красного и / или клетчатого цвета (включая рубашки, юбки, дирижабли, кроликов), а также каждую отдельную рубашку в магазине. Что пользователь действительно хочет найти, так это продукт, содержащий ВСЕ условия поиска. Как отмечалось выше, вы также можете найти результаты типа «скучно» и «сохранено», поскольку они содержат «красный».
Чтобы решить большую часть проблемы, вам просто нужно заменить это «ИЛИ» на «И». Также обратите внимание, что изменение относится только к поиску типа «LIKE», а не к типу «FULLTEXT». FULLTEXT плохо работает в Magento, потому что он исключает слишком много результатов. Метод, описанный ниже, намного лучше.
Чтобы внести изменения:
- сохранить файл с указанным выше изменением.
- Зайдите в админ, выберите Система-> Каталог-> Поиск по каталогу и убедитесь, что Тип поиска "Нравится".
- Сохранить конфигурацию
В администраторе перейдите в систему-> Управление индексами и установите флажок рядом с Индексом поиска по каталогу и переиндексируйте его (или просто переиндексируйте все). (ИЛИ из командной строки в корне magento типа:
php shell / indexer.php --reindex catalogsearch_fulltext
)
Если вы также хотите исключить такие слова, как «скучно», при поиске слова «красный», возможно, вы захотите внести 2-е изменение в тот же файл.
Есть еще один раздел кода, который гласит:
$bind[':likew' . $likeI] = '%' . $word . '%';
% впереди означает, что "скучно" похоже на% red%. Но вы не можете просто удалить 1%, чтобы получить правильный эффект из-за способа построения индекса. Таким образом, вместо этого вы делаете эти два изменения:
изменить вышеприведенную строку кода на:
$ bind [': likew'. $ likeI] = '%'. $ word. '%';
Обратите внимание на пробел после первого% перед закрывающей кавычкой. Теперь будут найдены только те слова, которые начинаются с $ word (например, красный, красный, красный, красный, все совпадают с "% red%"), но вы также должны убедиться, что перед всеми словами будут пробелы.
В верхней части файла, в классе Mage_CatalogSearch_Model_Mysql4_Fulltext, около строки 48 вы должны найти это:
protected $ _separator = '|';
Я просто изменил это на:
protected $_separator = ' | ';
Положить пробелы с обеих сторон трубы. Когда вы переиндексируете, теперь будут пробелы до и после каждого слова. Поиск "kit" все равно даст вам результаты для "kitchen", но, по крайней мере, вы не получите результаты для "skit".
Наконец, одно из последних изменений, которые я сделал, заключалось в том, чтобы множественные поиски возвращали те же результаты, что и единичные поиски, по крайней мере, для множественного числа, заканчивающегося на 's'.
Я добавил строку кода, где указано:
foreach($words as $word) {
$word = rtrim($word, 's'); //this line added
$like[ ] = '`s`.`data_index` LIKE :likew' . $likeI;
$bind[':likew' . $likeI] = '%' . $word . '%';
$likeI ++;
}
Он просто отбирает буквы 's' в конце каждого слова, поэтому теперь "красные и зеленые клетчатые рубашки" возвращают те же результаты, что и "красные и зеленые рубашки в клетку".
Мой следующий проект может состоять в том, чтобы внести еще некоторые изменения в синтаксический анализ строки, чтобы получить лучшие результаты для поиска по нескольким словам. Я смотрю на этот файл, к вашему сведению: app / code / core / Mage / Core / Helper / String.php
function splitWords
, который используется в файле Fulltext.php для разбора строки.
ПРИМЕЧАНИЕ. Чтобы сделать это обновление безопасным для обновления, вы должны продублировать структуру папок за app/code/core
внутри app/code/local
, например так:
Приложение / код / местные / Mage / CatalogSearch / Модель / mysql4 / Fulltext.php
Просто скопируйте туда файл core и внесите в него изменения.