- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Есть функция
{
$sql = array();
if(!empty($names))
{
foreach($names as $name)
{
$sql[] = "name LIKE ".$this->_db->quote('%'.$name.'%')."";
}
}
if(!empty($sql))
{
$this->_db->setQuery("SELECT id, name, description, price, url, picture AS image FROM #__price2 WHERE price > 1 AND (".implode(' OR ', $sql).") ORDER BY price DESC LIMIT 25");
return $this->_db->loadObjectList();
}
}
которая генерирует подобные запросы:
FROM x4q7_price2
WHERE price > 1 AND (name LIKE '%Свитер%')
ORDER BY price DESC LIMIT 25;
Таблица большая и запрос иногда выполняется более 1 сек. Я добавил FULLTEXT индекс и проверил запрос вида
FROM x4q7_price2
WHERE price > 1 AND MATCH(name) AGAINST('Свитер')
ORDER BY price DESC LIMIT 25
теперь он выполняется 0,005 сек.
Помогите теперь изменить пхп код под полнотекстовый поиск.
function getSearch($names)
{
$sql = array();
if(!empty($names))
{
foreach($names as $name)
{
$sql[] = "+".$this->_db->quote($name)."";
}
}
if(!empty($sql))
{
$this->_db->setQuery("SELECT id, name, description, price, url, picture AS image FROM #__price2 WHERE price > 1
AND ( match(name) against '".implode(' ', $sql)."' in boolean mode) ORDER BY price DESC LIMIT 25");
return $this->_db->loadObjectList();
}
}
Примерно так.
Почему boolean mode ? Потому что Вам нужен точный поиск видимо, а не что там мускулу в голову взбредет.
Так же неплохо бы в my.cnf проставить
ft_stopword_file = ""
ft_min_word_len = 1
Первое что бы искало по любым словам, без исключений в виде стопслов.
Второе что бы длина слов была от 1 символа (по умолчанию 3, но если иногда ищите по "и" то придется ставить 1).
Кроме того, учтите, что фултекст ищет слова.
Лайком Вы "мойсвитер" по слову "свитер" найдете и "свитера" тоже, а фултекстом уже нет.
Однако можно найти "свитера" по слову "свитер" если запрос составлять не как +свитер, а как +свитер*, но "мойсвитер" не найдете все равно.
Кроме того если в таблица в innodb, то о +слово* забудьте, это innodb не умеет, умеет myisam. Фултекст в иннодб хоть и впилили наконец-то, но он там еще не дотягивает.
p.s.: Можете посмотреть на sphinx. Как фултекст поиск он во многих вещах лучше мускула, однако жрет память дай боже и в булевом поиске особых преимуществ не имеет.
Как то вы пугаете :(
уже ответили.....
edogs, SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''+'Свитер'' in boolean mode) ORDER BY price DESC LIMIT 25' at line 1
---------- Добавлено 26.09.2017 в 17:35 ----------
Chukcha, SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'MATCH(name) AGAINST('%Свитер%')) ORDER BY price DESC LIMIT 25' at line 1
edogs, SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''+'Свитер'' in boolean mode) ORDER BY price DESC LIMIT 25' at line 1
А что у Вас функция db->quote делает? Добавляет кавычки вокруг кроме всего прочего?
В общем запрос должен получится вида match (name) against ('+Свитер +шерсть' in boolean mode)
Проще всего вероятно так
В цикле $sql[] = "+".$name.""
а дальше не AND ( match(name) against '".implode(' ', $sql)."' in boolean mode) ORDER BY
А нечто вроде AND ( match(name) against ( ".$this->_db->quote(implode(' ', $sql))." in boolean mode) ) ORDER BY
---------- Добавлено 26.09.2017 в 18:29 ----------
Как то вы пугаете :(
уже ответили.....
Спасибо, вроде работает :))
Через час? Да вроде не так что бы скорость
та пока писал, отвлекли, продолжил
Упс.. а там более продвинутый ответ