Magento / PHP - изменение запросов MySQL, лежащих в основе окна поиска продукта переднего плана - PullRequest
2 голосов
/ 08 июля 2011

В настоящее время запросы к базе данных MySQL, которые предоставляют результаты для поля поиска продукта во внешнем интерфейсе, по-видимому, используют критерии связывания «ИЛИ» в предложении WHERE запросов.

Причина, по которой я предполагаю, что этоиспользование «ИЛИ» происходит потому, что если вы ищете что-то вроде «зеленой и красной клетчатой ​​рубашки», вы получите каждый продукт с «красным» (включая «скучно», «сохраненный» и т. д.), каждый продукт с «зеленым», каждыйпродукт с «пледом», а каждый продукт с «рубашкой».

Теперь, если я могу просто узнать, где в коде строятся запросы, я смогу изменить это на «И» и завершитьс такими запросами:

SELECT `product_id` FROM `products` WHERE `search_index` LIKE '%red%' AND `search_index` LIKE '%green%' AND `search_index` LIKE '%plaid%' AND `search_index` LIKE '%shirt%';

Мне не удалось найти какую-либо информацию с помощью поиска в форумах Google или Magento.Я ковырялся в app / code / core / Mage / CatalogSearch /, но пока не нашел своего родного друга.Я знаю, что, вероятно, есть какой-то интерфейс Zend, с которым мне следует связываться, но я еще не нашел его.

Заранее спасибо

Ответы [ 3 ]

3 голосов
/ 22 июля 2011

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, потому что он исключает слишком много результатов. Метод, описанный ниже, намного лучше.

Чтобы внести изменения:

  1. сохранить файл с указанным выше изменением.
  2. Зайдите в админ, выберите Система-> Каталог-> Поиск по каталогу и убедитесь, что Тип поиска "Нравится".
  3. Сохранить конфигурацию
  4. В администраторе перейдите в систему-> Управление индексами и установите флажок рядом с Индексом поиска по каталогу и переиндексируйте его (или просто переиндексируйте все). (ИЛИ из командной строки в корне magento типа:

    php shell / indexer.php --reindex catalogsearch_fulltext

)

Если вы также хотите исключить такие слова, как «скучно», при поиске слова «красный», возможно, вы захотите внести 2-е изменение в тот же файл.

Есть еще один раздел кода, который гласит:

$bind[':likew' . $likeI] = '%' . $word . '%';

% впереди означает, что "скучно" похоже на% red%. Но вы не можете просто удалить 1%, чтобы получить правильный эффект из-за способа построения индекса. Таким образом, вместо этого вы делаете эти два изменения:

  1. изменить вышеприведенную строку кода на:

    $ bind [': likew'. $ likeI] = '%'. $ word. '%';

    Обратите внимание на пробел после первого% перед закрывающей кавычкой. Теперь будут найдены только те слова, которые начинаются с $ word (например, красный, красный, красный, красный, все совпадают с "% red%"), но вы также должны убедиться, что перед всеми словами будут пробелы.

  2. В верхней части файла, в классе 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 и внесите в него изменения.

1 голос
/ 05 января 2012

Я использую Magento CE 1.6.0.0, и я нашел файл в папке Resource, а не в папке MySql4.Надеюсь, это поможет.

1 голос
/ 08 июля 2011

Вы можете настроить поисковые запросы из системы> конфигурация> каталог> поиск по каталогу и выбрать тип запроса

Сам код поиска находится в папке app / code / core / Mage / CataloSearch в Mage_CatalogSearch_Model_Query и вMage_CatalogSearch_Model_Mysql4_Search_Collection class

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...