Задать вопрос

Yii2 Поиск по каталогу?

Здравствуйте. Есть что-то похожее на каталог. 3 таблицы - catalog(каталог), section(разделы), product(товары). Section связывается с catalog, а product связывается с section. Через gii всё сгенерил.
На сайте нужен поиск. Подскажите, пожалуйста, вариант алгоритма для поиска. Ведь пользователей может ввести Ноутбуки(catalog) или Ноутбуки Acer(catalog + section) или Acer(section) или Монитор Acer XXX(catalog+section+product) или XXX(product).
Если допустим вводилось бы Ноутбук Acer, то получал получал бы id_catalog через catalog_name LIKE '%Ноутбук%'. Затем бы получал section.id_section совпадения при
catalog_id = '$catalog' AND section_name LIKE '%Acer%'
. Ну и зная id_section найти product дело одного запроса.
Но ведь пользователь может ввести что угодно. Поэтому не могу придумать алгоритм. Буду рад любому совет.
Заранее спасибо.
  • Вопрос задан
  • 848 просмотров
Подписаться 3 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
@Wol_fi
php, js, mysql, highload
Вообще по хорошему, нужен поисковой движок, типа sphinx или elasticsearch.
Ну а если нужен простой костыль, то:
заведите myisam таблицу search_table с полями name, type, id. В name запихнуть название (каталогов, разделов, товаров), в type собственно тип сущности - (каталог, раздел, товар), в id - айди сущности в её родной таблице. Далее на name повесить полнотекстовый индекс, и уже искать по нему, а результат поиска уже обрабатывать (если каталог или секция, то выводить все товары с них, если товар - то показывать его). Ну и конечно поддерживать актуальность таблицы search_table когда создаётся\редактируется\удаляется любая сущность.
Ответ написан
class ProductSearch extends Product
{
..........
public function search($params)
{
$query = Product::find();

$dataProvider = new ActiveDataProvider([
'query' => $query,
]);

$query->joinWith(['section' => function($query) { $query->from(['section' => 'section']); }]);
$query->joinWith(['catalog' => function($query) { $query->from(['catalog' => 'catalog']); }]);
..........
$search_array = explode(' ', $this->search_string);
$query->andFilterWhere(['OR LIKE', 'catalog.catalog_name', $search_array])
$query->andFilterWhere(['OR LIKE', 'section.section_name', $search_array])
...........
}
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы