Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Полнотекстовый поиск -- почему не работает?
 
 автор: Anatoly_ua   (03.11.2006 в 14:44)   письмо автору
 
 

Пожалуйста, гляньте, в чем может быть проблема?
Пытаюсь сделать поиск по сайту средствами 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

   
 
 автор: mishaMC   (03.11.2006 в 14: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($ver0);
  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();
  }
?>

   
 
 автор: Anatoly_ua   (03.11.2006 в 15:56)   письмо автору
 
   для: mishaMC   (03.11.2006 в 14:50)
 

Версия MySQL: 4.0.26

Может оно из-за этого не работает?
Данные прицепил

   
 
 автор: Anatoly_ua   (04.11.2006 в 01:21)   письмо автору
 
   для: Anatoly_ua   (03.11.2006 в 14:44)
 

Пожалуйста, подскажите, что может быть не так? Вроде бы в этой версии MySQL должно работать. У меня подозрения на UTF-8, потому что, когда попробовал с английским текстом, то все нормально заработало. Можно с этим как-то бороться?

Хостинг .masterhost -- суппорт молчит...

   
 
 автор: cheops   (04.11.2006 в 11:55)   письмо автору
 
   для: Anatoly_ua   (04.11.2006 в 01:21)
 

Не очень понятно в какой кодировке информация в базе данных и в какой кодировке вы ищете (дамп действительно в UTF-8, но эту кодировку мог сделать phpMyAdmin, а в какой кодировке информация в самой таблице?).

   
 
 автор: Anatoly_ua   (04.11.2006 в 12:37)   письмо автору
 
   для: 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 не работает)

   
 
 автор: cheops   (04.11.2006 в 12:54)   письмо автору
 
   для: Anatoly_ua   (04.11.2006 в 12:37)
 

Вот чего не понимаю, если у вас UTF8, везде, зачем настраиваете соединение на кодировку cp1251? Настраивайте её на UTF8
<?php
mysql_query
("SET NAMES 'utf8'");
?>

   
 
 автор: Anatoly_ua   (04.11.2006 в 13:31)   письмо автору
 
   для: 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?

   
 
 автор: cheops   (04.11.2006 в 14:53)   письмо автору
 
   для: 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

   
 
 автор: Anatoly_ua   (04.11.2006 в 15:37)   письмо автору
 
   для: cheops   (04.11.2006 в 14:53)
 

Спасибо! :) Так работает!!

А можно с этим BINARY и MATCH, AGAINST как-то использовать?

Или есть ли какая либо возможность по релевантности результаты сортировать, полученные с помощью LIKE?

   
 
 автор: cheops   (04.11.2006 в 16:06)   письмо автору
 
   для: Anatoly_ua   (04.11.2006 в 15:37)
 

>А можно с этим BINARY и MATCH, AGAINST как-то использовать?
Да, тоже должно сработать... нужно поэкспериментировать.

>Или есть ли какая либо возможность по релевантности результаты сортировать, полученные с
>помощью LIKE?
Лучше ориентироваться на полнотектовый поиск - быстрее всё равно не сделаете.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования