Не индексируются символы кирилицы, в описании нодов типа Image.(Не работает поиск по символам кирилицы у нодов типа image)

Главные вкладки

Аватар пользователя qman qman 15 мая 2006 в 22:00

Всем привет,
Использую drupal 4.6 модуль image (v 1.146.2.14 2006/02/23 04:06:33 walkah)
При добавлении материала типа image содержащий символы кирилицы, эта информация не попадает в поисковую систему drupal.
Если в описание изображения символы латиницы то все работает как надо, но с русским проблемы.

Чтобы разобраться в чем проблема посмотрел содержимое таблицы search_index. Там на самом деле в таблицы отсутствовали записи о нодах с символами кирилицы.

Подскажите хотя бы куда копать и как drupal обновляет таблицу search_index.

Всем спасибо за любые мысли.

P.S. MySQL работает в UTF8

Комментарии

Аватар пользователя duke duke 25 мая 2006 в 17:50

Я тоже обратил внимание на подобные проблемы (http://drupal.ru/node/1680), но я не использую модуль search, а использую trip_search, который ищет без этих дополнительных индексных таблиц.

Главное не ясно, на каком уровне решать эту проблему, либо с MySQL траблы, либо SELECT надо не так писать или еще что-то...

Аватар пользователя qman qman 25 мая 2006 в 19:48

я вроде разобрался в .htaccess должно быть

php_value magic_quotes_gpc 0
php_value register_globals 0
php_value session.auto_start 0
php_value mbstring.language Russian
php_value mbstring.internal_encoding UTF-8
php_value mbstring.http_output UTF-8
php_value mbstring.http_input auto
php_value output_handler mb_output_handler
php_value default_charset UTF-8
# php_value mbstring.substitute_character none
php_value mbstring.func_overload 6

Только с этими настройками если создавать новый сайт поиск работает. Если делать upload базы данных на сервер, то какие то глюки лезут. Сообщения об ошибке типа
warning: array_keys(): The first argument should be an array in /var/www/virtual/ruscor.ru/htdocs/ruscor/includes/menu.inc on line 916.

warning: Wrong parameter count for min() in /var/www/virtual/ruscor.ru/htdocs/ruscor/includes/menu.inc on line 916.

warning: array_key_exists(): The second argument should be either an array or an object in /var/www/virtual/ruscor.ru/htdocs/ruscor/includes/menu.inc on line 920.

Аватар пользователя qman qman 26 мая 2006 в 22:02

Кроме того надо в файле database.mysql.inc внести изменения:

function db_connect($url) {
$url = parse_url($url);

// Allow for non-standard MySQL port.
if (isset($url['port'])) {
$url['host'] = $url['host'] .':'. $url['port'];
}

$connection = mysql_connect($url['host'], $url['user'], $url['pass'], TRUE) or die(mysql_error());
mysql_select_db(substr($url['path'], 1), $connection) or die('unable to select database');
return $connection;
}
Заменить на
function db_connect($url) {
$url = parse_url($url);

// Allow for non-standard MySQL port.
if (isset($url['port'])) {
$url['host'] = $url['host'] .':'. $url['port'];
}

$connection = mysql_connect($url['host'], $url['user'], $url['pass'], TRUE) or die(mysql_error());
mysql_query("SET NAMES 'utf8'");
mysql_query("SET collation_connection='utf8_general_ci'");
mysql_query("SET collation_server='utf8_general_ci'");
mysql_query("SET character_set_client='utf8'");
mysql_query("SET character_set_connection='utf8'");
mysql_query("SET character_set_results='utf8'");
mysql_query("SET character_set_server='utf8'");
mysql_select_db(substr($url['path'], 1), $connection) or die('unable to select database');

return $connection;
}

что интересно на windows все работает и без этих изменений. Но unix хостинг требует эти изменения.
Так же нужно очистить таблицу cache.
To axel наверно было бы не плохо добавить это в FAQ, потому что вопрос настройки кирилицы поднимается периодически каждый 2 месяца за последние 2 года, на этом и родственных сайтах.

Аватар пользователя duke duke 29 мая 2006 в 14:33

А вот эти SET комманды разве надо выполнять каждый раз при коннекте ? Разве не достаточно их один раз выполнить после создания базы данных в качестве инициализации ?

Аватар пользователя shura shura 29 мая 2006 в 16:15

ИМХО достаточно только
mysql_query('SET NAMES utf8');
mysql_query('SET CHARACTER_SET utf8');
(во всяком случае у меня так...), но только при пустой базе. Если добавить эти строки после начала заполнения контента, то лезли какие-то непонятные ошибки...
Дабавить эти строки с самого начала - все работает без проблем... Вроде как и поиск даже работает Wink

Аватар пользователя rgb rgb 30 мая 2006 в 16:16

Quote:
...но только при пустой базе. Если добавить эти строки после начала заполнения контента...

Вероятне всего ошибки из-за того, что контент был не в UTF-8 забит (а как Latin1), а при добавлении SET NAMES MySQL возвращал его перекодированным в UTF... Со всеми вытекающими.

Аватар пользователя rgb rgb 30 мая 2006 в 16:12

Тут написано немного про SET NAMES:

...
A SET NAMES 'x' statement is equivalent to these three statements: 

SET character_set_client = x;
SET character_set_results = x;
SET character_set_connection = x;
...

Так что вышеприведённый код слегка избыточен.

У меня поиск (я про search.module вообще) c кирилицей заработал когда перешёл на MySQL 4.1 и немного изменил includes\database.mysql.inc:

[function db_connect(..)]
...
if (isset($url['port'])) {
    $url['host'] = $url['host'] .':'. $url['port'];
}

$connection = mysql_connect($url['host'], $url['user'], $url['pass'], TRUE) or die(mysql_error());
/* !! */  mysql_query("SET NAMES 'utf8'", $connection);
mysql_select_db(substr($url['path'], 1), $connection) or die('unable to select database');
...

В моём случае этого оказалось достаточно как для Windows, так и для Linux. Само собой, что это ещё от настроек сервера зависит и возможны вариации (типа вызова SET CHARACTER SET).

Ах да, чуть не забыл, это всё относится к Drupal 4.6.х.

Аватар пользователя duke duke 7 июня 2006 в 10:35

Да, есть такое ... вытекающих много Smile
Теперь вопрос - как все это дело провернуть для сайта, на котором очень немеряно всего, и все это очень нужное и убиват ьнельзя.

Что если экспортнуть это все в виде скрипта, потом сделать необходимые изменения, а потом пересоздать таблицы и все залить заново ?