|
|
|
| Пожалуйста, гляньте, в чем может быть проблема?
Пытаюсь сделать поиск по сайту средствами MySQL, но почему-то при любых $keyword ничего не находит. В чем может быть дело?
Данные хранятся в UTF-8, но на хостинге не знаю, как можно это явно задать (в MySQL такой опции не нашел в PHPMyAdmi-е их), может что с этим связано?
Таблица
CREATE TABLE `ru_sections` (
`ru_id` bigint(20) NOT NULL default '0',
`ru_left` bigint(20) NOT NULL default '0',
`ru_right` bigint(20) NOT NULL default '0',
`ru_level` int(11) default NULL,
`ru_name` varchar(255) NOT NULL default '',
`ru_inmenu` tinyint(1) NOT NULL default '0',
`ru_link` varchar(255) NOT NULL default '',
`ru_template` varchar(255) NOT NULL default '',
`ru_content` mediumtext,
`ru_logo` varchar(255) NOT NULL default '',
`ru_title` varchar(255) NOT NULL default '',
`ru_description` varchar(255) NOT NULL default '',
`ru_keywords` varchar(255) NOT NULL default '',
`ru_date` varchar(19) NOT NULL default '',
`ru_header` text NOT NULL,
`ru_show_annotation` tinyint(4) NOT NULL default '0',
`ru_annotation` blob NOT NULL,
UNIQUE KEY `ru_id` (`ru_id`),
FULLTEXT KEY `Content_search` (`ru_content`,`ru_title`,`ru_description`)
) TYPE=MyISAM;
|
И такой запрос:
SELECT ru_id, ru_title, ru_link, ru_description,
MATCH (ru_content, ru_title, ru_description)
AGAINST ('$keyword' IN BOOLEAN MODE)
AS matchindex,
MATCH (ru_content, ru_title, ru_description)
AGAINST ('$keyword' )
AS matchindex1 FROM ru_sections
WHERE MATCH (ru_content, ru_title, ru_description)
AGAINST ('$keyword' IN BOOLEAN MODE)
AND ru_link<>''
AND ru_title<>''
ORDER BY matchindex1 DESC LIMIT 50
|
| |
|
|
|
|
|
|
|
для: Anatoly_ua
(03.11.2006 в 14:44)
| | Наверное он ничего не выводит в качестве результата? Попробуйте уменьшить число параметров.
Также неплохо бы было прикрепить дамп из БД с тестовыми данными, чтобы можно было заполнить базу и попробовать самому повыполнять запросы.
Для указания кодировки, используете примерно такой код при соединении с БД:
<?
// сейчас выставлен сервер локальной машины
$dblocation = "localhost";
// Имя базы данных, на хостинге или локальной машине
$dbname = "dbname";
// Имя пользователя базы данных
$dbuser = "root";
// Пароль
$dbpasswd = "";
// Соединяемся с сервером базы данных
$dbcnx = @mysql_connect($dblocation,$dbuser,$dbpasswd);
if (!$dbcnx)
{
echo( "<P>В настоящий момент сервер базы данных не доступен, поэтому корректное отображение страницы невозможно.</P>" );
exit();
}
// Выбираем базу данных
if (! @mysql_select_db($dbname,$dbcnx) )
{
echo( "<P>В настоящий момент база данных не доступна, поэтому корректное отображение страницы невозможно.</P>" );
exit();
}
// Определяем версию сервера
$query = "SELECT VERSION()";
$ver = mysql_query($query);
if(!$ver) exit("Ошибка при определении версии MySQL-сервера");
$version = mysql_result($ver, 0);
list($major, $minor) = explode(".", $version);
// Если версия выше 4.1 сообщаем серверу, что будем работать с
// кодировкой cp1251
$ver = $major.".".$minor;
if((float)$ver >= 4.1)
{
mysql_query("SET NAMES 'cp1251'");
}
// Небольшая вспомогательная функция, которая выводит сообщение об ошибке
// в случае ошибки запроса к базе данных
function puterror($message)
{
echo("<p>$message</p>");
exit();
}
?>
|
| |
|
|
|
|
|
|
|
для: mishaMC
(03.11.2006 в 14:50)
| | Версия MySQL: 4.0.26
Может оно из-за этого не работает?
Данные прицепил | |
|
|
|
|
|
|
|
для: Anatoly_ua
(03.11.2006 в 14:44)
| | Пожалуйста, подскажите, что может быть не так? Вроде бы в этой версии MySQL должно работать. У меня подозрения на UTF-8, потому что, когда попробовал с английским текстом, то все нормально заработало. Можно с этим как-то бороться?
Хостинг .masterhost -- суппорт молчит... | |
|
|
|
|
|
|
|
для: Anatoly_ua
(04.11.2006 в 01:21)
| | Не очень понятно в какой кодировке информация в базе данных и в какой кодировке вы ищете (дамп действительно в UTF-8, но эту кодировку мог сделать phpMyAdmin, а в какой кодировке информация в самой таблице?). | |
|
|
|
|
|
|
|
для: cheops
(04.11.2006 в 11:55)
| | И сайт и сама таблица в UTF-8, и все php скрипты тоже в UTF-8... Отображается все нормально. Переписал запросы на LIKE, теперь странные вещи происходят. Ищу так:
SELECT ru_id, ru_title, ru_link, ru_description
FROM ru_sections
WHERE
ru_link<>''
AND ru_title<>''
AND (ru_content LIKE '%$keyword%' OR ru_title LIKE '%$keyword%')
LIMIT 50
|
Странно, но на русском находит то, чего нет. Например, выдает страницы по запросу "ложка", например, хотя в упор не вижу этого слова, ну и т.п. Проблема точно в кодировке, потому что, опять таки, с английским проблем никаких -- и с LIKE ищет нормально... В MySQL нужно задать явно, что искать нужно в UTF-8, но как можно это сделать в этой версии? (SET NAMES не работает) | |
|
|
|
|
|
|
|
для: Anatoly_ua
(04.11.2006 в 12:37)
| | Вот чего не понимаю, если у вас UTF8, везде, зачем настраиваете соединение на кодировку cp1251? Настраивайте её на UTF8
<?php
mysql_query("SET NAMES 'utf8'");
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(04.11.2006 в 12:54)
| | Так вот я ж и спрашиваю, как мне сказать MySQL версии _4.0.26_, (а не 4.1...), что мне нужно SET NAMES 'utf8'. Код который выше -- не мой, у меня такого нет: 4.0.26 SET NAMES не понимает :(
Я все время делал SET NAMES 'utf8' и проблем вроде бы не было особых, а тут вот этот запрос не проходит. Можно как-то все-таки это сделать в 4.0.26? | |
|
|
|
|
|
|
|
для: Anatoly_ua
(04.11.2006 в 13:31)
| | В MySQL 4.0.x нет оператора SET NAMES, попробуйте использовать BINARY тогда
SELECT ru_id, ru_title, ru_link, ru_description
FROM ru_sections
WHERE
ru_link<>''
AND ru_title<>''
AND (BINARY ru_content LIKE '%$keyword%' OR BINARY ru_title LIKE '%$keyword%')
LIMIT 50
|
| |
|
|
|
|
|
|
|
для: cheops
(04.11.2006 в 14:53)
| | Спасибо! :) Так работает!!
А можно с этим BINARY и MATCH, AGAINST как-то использовать?
Или есть ли какая либо возможность по релевантности результаты сортировать, полученные с помощью LIKE? | |
|
|
|
|
|
|
|
для: Anatoly_ua
(04.11.2006 в 15:37)
| | >А можно с этим BINARY и MATCH, AGAINST как-то использовать?
Да, тоже должно сработать... нужно поэкспериментировать.
>Или есть ли какая либо возможность по релевантности результаты сортировать, полученные с
>помощью LIKE?
Лучше ориентироваться на полнотектовый поиск - быстрее всё равно не сделаете. | |
|
|
|