Dec 04, 2008, 12:57 AM *
Welcome, Guest. Please login or register.
Did you miss your activation email?

Login with username, password and session length
Search via SMF or Google: modx forums all of modxcms.com web
  MODxCMS.com   Forums   Help Login Register  
News:Read what MODx Developers say: MODx Dev. Blogs
Pages: [1] 2   Go Down
  Print  
Author Topic: [TIP] Поиск на сайте, регистр и русский язык  (Read 7634 times)
0 Members and 1 Guest are viewing this topic.
Fuzzy
Moderator
*****
Posts: 696



WWW
« on: Aug 28, 2006, 06:51 AM »

Часто возникают вопросы, связанные с поиском на сайте - нужен поиск без различения регистра; некорректно работает поиск с русским (украинским, латышским, ...) языком, т.е.  отличающимся от английского наличием собственных символов в алфавите.

Опишу свой способ решения этих вопросов:

1. Вначале сниппета, который обрабатывает на вашем сайте данные из поисковой формы, прописываем такую директиву (кодировку можете установить свою):
Code: (php)
mb_internal_encoding("UTF-8");
Таким образом мы установим внутреннюю кодировку символов UTF-8.

2. Во всем сниппете выбираем строковые функции и добавляем к ним приставку mb_ (мультибайтный). Таким образом у нас уже должен по идее корректно работать поиск с языками, отличными от английского.

3. Чтобы поиск стал неразборчив к регистру, необходимо перед запросом сравнения в БД привести все данные к одному регистру.
3.1. Для переменной, содержащей строку с искомыми данными, проделываем следующее:
Code: (php)
$searchString = mb_strtolower($searchString);
т.е. приводим всю строку к нижнему регистру.
3.2. Тоже самое надо сделать с хранимыми данными в БД, с которыми будет производиться сравнение. Для этого в SQL запросе используем функцию MySQL: LOWER.
Code: (php)
$sql = "SELECT id, pagetitle, description, content, introtext ";
$sql .= "FROM $tbl ";
$sql .= "WHERE (LOWER(pagetitle) LIKE '%$searchString%' OR LOWER(description) LIKE '%$searchString%'
         OR LOWER(content) LIKE '%$searchString%'
         OR LOWER(introtext) LIKE '%$searchString%') ";
$sql .= "AND $tbl.published = 1 AND $tbl.searchable=1 AND $tbl.deleted=0;";
3.3. Выполняем $sql запрос в БД.

Собственно говоря, это все. Вопросы, комментарии - welcome Smiley
« Last Edit: Aug 28, 2006, 03:47 PM by Igor » Logged

yentsun
MODx Russia
Moderator
*
Posts: 516



WWW
« Reply #1 on: Aug 28, 2006, 03:11 PM »

спасибо за отличный [TIP]Smiley! Механизм PublicSerach от Google похоже не настолько развит чтобы понимать кириллицую Скорее всего поспользуюсь твоим вариантом.

PS добавь пожалуйста префикс [СОВЕТ] к своей теме, чтобы видно было сразу... как это принято на общем форуме Smiley
« Last Edit: Aug 28, 2006, 03:13 PM by yentsun » Logged

http://modx.ru - российская поддержка MODx
http://modxnotes.blogspot.com/ - личный блог по MODx
Fuzzy
Moderator
*****
Posts: 696



WWW
« Reply #2 on: Aug 28, 2006, 03:44 PM »

ОК, добавлю Smiley

PS: Написал по английски, ибо слово СОВЕТ слишком большое, название топика обрезалось и искажалось
« Last Edit: Aug 28, 2006, 03:48 PM by Igor » Logged

yurican
Member
**
Posts: 60



« Reply #3 on: Mar 03, 2007, 03:15 AM »

Спасибо, Игорь.
С твоей помощью всё, что связано с кодировками, у меня заработало. Поэтому уверен - поиск тоже заработает. )
Проделал шаги
1) без комментариев
2) заменил ВСЕ строковые функции..
попались на глаза
strip_tags, strtolower, strlen, substr, preg_match_all, strpos, substr_replace. stripslashes, urldecode, urlencode, preg_replace, и ещё какие-то мелкие...
3) Третий шаг пока не делал

Страница с формой поиска HyperFlexSearchForm (v.2r4) вообще не открывается.. Чистый лист...
Ладно бы просто не работал, как до этого.... Cheesy
Logged
Fuzzy
Moderator
*****
Posts: 696



WWW
« Reply #4 on: Mar 03, 2007, 03:25 AM »

Проверь внимательно все измененные функции, к примеру mb_strip_tags - такой функции нет в PHP, да и зачем, если strip_tags просто удаляет HTML и PHP тэги из строки, т.е. не влияет никаким образом на сам текст и результат ее действия никак не может зависеть от текста. Проверять на существование мультибайтные функции здесь: http://lv2.php.net/manual/ru/ref.mbstring.php
« Last Edit: Mar 03, 2007, 03:27 AM by Igor » Logged

yurican
Member
**
Posts: 60



« Reply #5 on: Mar 03, 2007, 03:33 AM »

Опс! Оказывается, по первому пункту есть комментарий.
Вернул всё как было изначально. Единственно -- добавил строку mb_internal_encoding("UTF-8");
в самое начало сниппета HyperFlexSearchForm.
Может, я куда-то не туда вставил?
просто с добавлением одной только этой строки перестаёт отображаться вся страница. Даже <title>...
PHP 4.4.4
Кодировка UTF-8. (Успешно проделал всё, что ты советовал в посте "MySQL, UTF-8 и русский язык")

P.S. Спасибо за ответ - только что прочитал ответ насчет справочника по мультибайтным функциям. Сейчас разберусь.
Logged
Fuzzy
Moderator
*****
Posts: 696



WWW
« Reply #6 on: Mar 03, 2007, 03:44 AM »

Опс! Оказывается, по первому пункту есть комментарий.
Вернул всё как было изначально. Единственно -- добавил строку mb_internal_encoding("UTF-8");
в самое начало сниппета HyperFlexSearchForm.
Может, я куда-то не туда вставил?
Туда, туда, там и есть ей самое место Smiley
просто с добавлением одной только этой строки перестаёт отображаться вся страница. Даже <title>...
PHP 4.4.4
Кодировка UTF-8. (Успешно проделал всё, что ты советовал в посте "MySQL, UTF-8 и русский язык")
А это для меня великая загадка Smiley Чтобы пропадал даже title, это странно.
Я могу сказать, что однажды ко мне в приват обратился болгарин, у него тоже стояла проблема поиска с кириллическим алфавитом и кодировкой UTF-8. По-русски он практически не понимал, сумел ему все объяснить на английском. В итоге было много благодарностей, даже звал к себе в гости в Софию Smiley Я это к чему.. правильной дорогой идете, товарищ (c) Должно все получиться Wink
Logged

yurican
Member
**
Posts: 60



« Reply #7 on: Mar 03, 2007, 04:44 AM »

УРАААА!
Игорь -- памятник тебе.  Grin
к тому же та ссылка, которую ты дал, оказалась исчерпывающей.

Для тех, кто столкнётся с подобным:
В php.ini должна быть поддержка библиотеки mb_string.dll и настроены соответствующие параметры в [mbstring]

А вот там везде пугают Function Overloading'ом
It is not recommended to use the function overloading option in the per-directory context, because it's not confirmed yet to be stable enough in a production environment and may lead to undefined behaviour.
Это страшно? Или.... как с этим бороться? )

А вообще... приезжай лучше к нам. ))
Logged
Fuzzy
Moderator
*****
Posts: 696



WWW
« Reply #8 on: Mar 03, 2007, 04:54 AM »

А вот там везде пугают Function Overloading'ом
It is not recommended to use the function overloading option in the per-directory context, because it's not confirmed yet to be stable enough in a production environment and may lead to undefined behaviour.
Это страшно? Или.... как с этим бороться? )
Проще всего - забить на это дело Wink Все работает оченно хорошо на многих сайтах, никаких проблем замечено не было.
А вообще... приезжай лучше к нам. ))
К вам - это куда? Россия-матушка? Smiley Так я был там не раз, даже жил до 20 лет.. Летом вот еще собираюсь на родину, в ростовские степи.. Так что лучше уж вы к нам Smiley Ладно, флуд прекращаем )
Logged

yurican
Member
**
Posts: 60



« Reply #9 on: Mar 03, 2007, 07:21 AM »

Ну, в общем, СПАСИБО, ИГОРЬ. Кто скажет, что это флуд? -в личку.  Grin
Logged
yurican
Member
**
Posts: 60



« Reply #10 on: Mar 06, 2007, 09:46 AM »

Хм... всё хорошо работает.
Единственно, может как-то связано.. мне кажется, связано... поэтому и пишу.
Ditto (1.1beta) не фильтрует по тегам tv (checkbox, delimited list), если во всей tv хоть одно значение написано на русском языке..
если tv того же типа содержит ТОЛЬКО латиницу, -- тогда всё нормально.
Чем лечить? Тем же способом? П_е_р_е_л_о_п_а_ч_и_в_а_т_ь    в_е_с_ь   Ditto??
Logged
Fuzzy
Moderator
*****
Posts: 696



WWW
« Reply #11 on: Mar 06, 2007, 02:45 PM »

Не знаю.. если честно, я вообще не пользуюсь Дитто Smiley
Logged

yurican
Member
**
Posts: 60



« Reply #12 on: Mar 06, 2007, 09:46 PM »

Спасибо за ответ.
Чуть-чуть яснее стало, выявил действительную причину. Не в кириллице дело - с русским хорошо работает, поэтому забираю свой пост обратно.  Cheesy
всё дело в долбаном delimited list.
у меня checkbox - delimited list. Разделитель - запятая с пробелом.
только вот пробел не сохраняется как пробел (вырезается), и поэтому я назначил разделителем ,&nbsp;
Ну и вот... Дитто не врубается в такой разделитель, и ВСЁ-ТАКИ НАХОДИТ то, что нужно, если это то_что_нужно находится на самой первой позиции delimited list, то есть пока разделителя ещё не было.....
Если разделителем назначить просто запятую, всё чудесно работает, но отображается без пробелов:
опция1,опция2,опция3....
вот борода, блин. Наверно, есть какой-то выход.
Logged
Silver_SS
Jr. Member
*
Posts: 6


« Reply #13 on: Mar 23, 2007, 06:04 AM »

Можно ли на примере HyperFlexSearchForm объяснить куда надо прописывать префикс, к сожалению не особо силен в программировании
Logged
[e]Bu$ter
Committed to MODx
*****
Posts: 700


WWW
« Reply #14 on: Mar 23, 2007, 12:39 PM »

Silver_SS, о каком префиске речь то?
Logged
Pages: [1] 2   Go Up
  Print  
 
Jump to: