Консультация № 178213
05.05.2010, 12:58
45.00 руб.
0 26 2
Здравствуйте Уважаемые эксперты!
В табличку query записываются все слова введенные в поле поиска. Слова вводятся как русские так и английские.
На главной странице выводятся популярные запросы. Главная страница существует в двух языковых версиях - рус и англ.
Как сделать, что бы на рус версии главной страницы выдавались только запросы на русском языке, а на анг версии соответственно только английские запросы.
Весь сайт в utf-8.

Заранее спасибо!

Обсуждение

Неизвестный
05.05.2010, 13:03
общий
это ответ
Здравствуйте, Pharaoh.

Проще всего это реализовать - добавив в таблицу поле-флаг отвечающее за язык запроса.
Ведь в противном случае вы не можете гарантировать что запрос введен на русской странице, если он например введен латинскими буквами.
При таком подходе достаточно попросту сделать генерацию запроса на выборку из таблицы зависимой от текущего языка.
Например:

SELECT что-то FROM откуда-то WHERE что-то = чему-то AND language = "rus"
С уважением hacpaka
Неизвестный
05.05.2010, 13:26
общий
А как реализовать со стороны поля куда вводят запрос?

На рус версии посетитель так же может и ввести англ запрос.

Объясню по другому. Есть сайт www.site.ru. Это русская версия сайта. На главной сейчас выдаются все запроы (англ и рус). Так же есть www.site.com - это англ версия сайта. Там сейчас тоже выдаются все запросы. Надо разделить, эти запросы. Что бы на www.site.com выдавались англ запросы только, а на www.site.ru рус запросы.
Неизвестный
05.05.2010, 13:31
общий
А со стороны поля - передаем, например, hidden-поле с флагом языка. А заполняется это хидден-поле на стороне сервера ессно.
Неизвестный
05.05.2010, 13:41
общий
а в вашем случае можно, кстати, вообще смотреть откуда пришел запрос - с com или с ru
Неизвестный
05.05.2010, 13:49
общий
Скрытое поле не сработает. Запросы могут быть введены на любом языке. независимо от языка страницы. Предлагаю проверять диапазон символов: все латинские буквы - однобайтные (код<128), все русские - двухбайтные (в кодировке UTF-8). Как следствие, можно попробовать проверять по ширине:
if( mb_strlen(str) == mb_strwidth(str) ) запрос на английском;
else запрос на русском;
Попробуйте такой вариант, отпишитесь о результатах.
Неизвестный
05.05.2010, 13:51
общий
Так смотреть откуда пришел запрос не получится мне кажется, потому то на site.ru пользователь может ввести как англ запрос так и рус.

Допустим, на site.ru человек вводит запрос на рус. Ему выдается информация. Затем он выходит на главную site.ru но там отображается только русские запросы. А англ , даже тот который он возможно искал, не будет выдаваться. Он будет выдаваться на англ site.com.

Как такое реализовать?
Неизвестный
05.05.2010, 13:52
общий
amnick я тоже склонялся к этой реализации. Как точно сделать?
Неизвестный
05.05.2010, 13:55
общий
Господа. Зачем, скажите мне определять язык запросов по буквам?
Подумайте сами - я на русской версии ввожу запрос латинице - зачем он мне в латинской версии??? Какая-то левая статистика выходит.
Логично следующее - ввели на англ версии - помечаем как английский и выводим в статистике на англ версии, а если ввели на русской версии - помечаем как русский и выводи на русской версии.
Зачем придумывать какие-то астральные навароты?
И язык страны тут вообще не при чем. Если залез на англ версию - пишем в хидден-поле "eng", если на русскую - пишем "rus".
Неизвестный
05.05.2010, 13:57
общий
amnick, то есть если я на русской версии ище например AVP то этот запрос по вашему должен попадать и на англ версию?
Неизвестный
05.05.2010, 14:12
общий
05.05.2010, 14:27
это ответ
Здравствуйте, Pharaoh.

Не готов согласиться с предыдущим оратором, поскольку даже русскоязычные посетители бывает ищут на латинице, поэтому трудно определить языковой признак поиска по главной странице.

Предлагаю альтернативу: используйте регулярные выражения в запросе к БД, например такой запрос:

SELECT `word` FROM `table` WHERE `word` RLIKE '[a-zA-Z]'

вернёт слова, в которых содержатся латинские буквы (хотя бы одна), а

SELECT `word` FROM `table` WHERE `word` NOT RLIKE '[a-zA-Z]'

вернёт слова, в которых латинских букв нет - то есть русскоязычные.
5
Неизвестный
05.05.2010, 14:13
общий
Народ, попробую еще более детально описать ситуацию. Что бы не было путаницы с задачей.

Что имеется:
Два сайта www.site.ru и www.site.com. Общая база с запросами поступающими и от site.ru и от site.com. Т.е. с обоих сайтов запросы пишутся в одну базу запросов.
Посетитель заходит на site.ru и вводит запрос "блабла" на русском языке. Далее вводит запрос "blabla" на англ языке. Но при этом он делает эти запросы на site.ru.
Затем он опять заходит на site.ru. И он должен увидеть там только запрос "блабла", но никак не "blabla". А вот если он зайдет на site.com, тогда там он должен увидеть запрос "blabla" и никакого другого запроса там больше не должно быть.

Как такое реализовать?
Неизвестный
05.05.2010, 14:22
общий
Цитата: 195376
то есть если я на русской версии ище например AVP то этот запрос по вашему должен попадать и на англ версию?

Разумеется. Запрос ведь введен латинскими буквами.
Цитата: 195376
я на русской версии ввожу запрос латинице

Давайте уточним - латиница, это запись русских слов латинскими буквами, например: подарок - podarok.
Так вот, зачем вводить русский запрос латиницей? Нормальный человек так и введет: "подарок", а если он захочет ввести запрос по-английски, то введет: "gift".

Так что простейший (хотя и очень грубый) способ различать языки - по используемому алфавиту. Хотите точно - нужны словари, хотя и они не гарантируют абсолютной точности при коротком запросе. А язык страницы к языку, на котором введен запрос, по большому счету, не имеет никакого отношения - вы на русской странице google никогда не вводили запросов на английском?
давно
Посетитель
7438
7205
05.05.2010, 14:28
общий
Волков Алексей aka Lupo:
Подправил.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
05.05.2010, 14:29
общий
Лысков Игорь Витальевич:
спасибо
Неизвестный
05.05.2010, 14:42
общий
amnick. вы правильно подметили. По сути ситуация такая же как с гугл.ру и гугл.ком. И там и там можно вводить запросы и на русском и на англ..

Однако, если бы гугл на своей главной странице публиковал список популярных запросов, конечно же он на русской публиковал русские запросы, а на английском - английские..

Что и требуется.. Есть ли какие то еще идеи.?

p.S. склоняюсь к предложению от Волков Алексей aka Lupo.
Неизвестный
05.05.2010, 14:45
общий
Цитата: 246432
amnick я тоже склонялся к этой реализации. Как точно сделать?

да так прямо и попробовать, как я предложил:

if( mb_strlen(str) == mb_strwidth(str) ) запрос на английском;
else запрос на русском;

Меня смущает только странная табличка ширин символов в описании функции mb_strwidth(), так что такой вариант надо именно попробовать.

Если не получится, то вот еще способ: сконвертировать строку в однобайтную кодировку с помощью mb_convert_encoding(). В качестве целевой кодировки укажите "ISO-8859-5" (8-битная кодовая страница из семейства кодовых страниц стандарта ISO-8859 для представления кириллицы). Затем в результирующей строке проверьте диапазон символов: код всех латинских букв <128, русских - > 128 (ISO 8859-5).
Неизвестный
05.05.2010, 14:54
общий
Pharaoh:
для выбора из базы данных Волков Алексей aka Lupo предложил хороший вариант.
То, что предлагал я, больше годится для анализа непосредственно строки запроса (одной, только что введенной). И я совсем забыл про регулярные выражения.
Неизвестный
05.05.2010, 14:59
общий
amnick:
Простите, уважаемый коллега, но на мой взгляд Вы предлагаете откровенный огород - гораздо проще Вашу идею реализовать моим способом - в том числе ещё и потому, что этим можно снизить нагрузку на сервер - во-первых, мы перекладываем часть нагрузки на БД, которая и построена для быстрой выборки данных по заданному критерию, а во-вторых, мы уменьшаем объём данных, передаваемых скрипту Базой Данных и, следовательно, объём и время обработки этих данных скриптом, ещё на стадии выборки. Кстати напомню, что в PHP время рhfработы скрипта ограничено и при больших объёмах данных это становится критичным.
Неизвестный
05.05.2010, 15:03
общий
amnick:
ЗЫ Вы успели раньше )) именно, ваш способ хорош для обработки поискового запроса перед сохранением в БД, при условии использования признака по языку. Но для массовой обработки символов это мегасложно (((
Неизвестный
05.05.2010, 15:10
общий
Господа, Вы пытаетесь решить задачу частным способом и для текущего набора данных. Язык запроса введенного пользователем в строке поиска должен определяться в первую очередь языком интерфейса, либо языковой версией портала/сайта которые он использует. В частности введя в русской версии например Quake я тем самым по вашей логике сделаю этот запрос актуальным для английской версии и неактуальным для русской.... Я по-вашему выходит что, прошу прощения, пофигу, что 100 русский пользователей ввели в поиске слово Quake и НИКТО из английский пользователь его не ввел (пример естественно чисто условный) - все равно на английской версии портала будет болтаться статистика по поиску Quake. Круто, господа - это безусловно вершина интеллектуальной системы анализа поиска.
ИМХО, надо быть проще и стараться сделать все проще.
Кстати, добавив например белорусскую либо украинскую версию портала, а также например немецкую либо любую другую использующую более-менее стандартные кириллицу/латиницу (умлауты и иже с ними - не в счет - в поисковом запросе их может и не быть) мы увидим что предложенный вам метод не пременим вообще... А если решение работает только в частном случае - то это КОСТЫЛЬ - проверено опытом.

А вот как определять языковую версию - это уже вопрос выбранной техники.... Можно хидден полем можно еще как-либо - не суть важно. Главное что бы работало корректно.
Неизвестный
05.05.2010, 15:18
общий
hаcpaka:
аплодисменты, я тоже не люблю костыли... вот только для конкретно поставленной задачи конкретное решение, считаю, вполне приемлемо, иначе это начинает напоминать стрельбу из пушки по воробьям...
Цитата: 195376
ИМХО, надо быть проще и стараться сделать все проще.
Неизвестный
05.05.2010, 15:23
общий
Цитата: 253005
аплодисменты, я тоже не люблю костыли... вот только для конкретно поставленной задачи конкретное решение, считаю, вполне приемлемо, иначе это начинает напоминать стрельбу из пушки по воробьям...

Я привел пример почему даже в рамках поставленной задачи оно будет работать не совсем так сказать верно)...
И кстати, если есть англ и рус версия, где гарантия что не появится завтра например украинская?
Кроме того предложенный Вами вариант - нельзя назвать более простым.
Неизвестный
05.05.2010, 15:41
общий
Цитата: 195376
И кстати, если есть англ и рус версия, где гарантия что не появится завтра например украинская?

Добавление других языков так же планируется.


Так все-таки хотелось бы конкретных примеров. Как реализовать.
Неизвестный
05.05.2010, 15:48
общий
Цитата: 246432
Добавление других языков так же планируется.

оть! а вот тут то и проявится истинная костыльность предложенных решений)
Цитата: 246432
Так все-таки хотелось бы конкретных примеров. Как реализовать.

к сожалению подробно расписывать сейчас времени нет. Если кратко то примерно так:

1) К форме которая отправляет введенную для поиска строку на сервер добавляем hidden-поле, значением которого является идентификатор текущей языковой версии портала/сайта.
2) Далее при получении данных для поиска смотрим на значение этого поля и сохраняем в базе введенное значение для поиска устанавливая специальное поле (которое вам придется добавить в таблицу) в соответствующее значение языковой версии в которой был произведен поиск.
3) При открытии индексной страницы или статистики поиска (ну не знаю что там у Вас) делаем выборку статистики поиска только для той языковой версии которую использует пользователь)
4) Радуемся жизни, пока авторы предложенных выше кастылей нервно курят в сторонке готовясь взяться за очередной рефакторинг проекта)

Что-то типа того)

Такой подход кстати дает возможность расширить функционал статистики поиска - например добавить в ночной крон скрип эвристики, который будет сравнивать запросы разных языковвых версий, находить общие и т.д.
Неизвестный
05.05.2010, 15:55
общий
hаcpaka:
Цитата: 195376
авторы предложенных выше кастылей нервно курят в сторонке


Снимаю шляпу, Вы победили в нашем "интеллектуальном противостоянии"
Неизвестный
05.05.2010, 16:13
общий
Волков Алексей aka Lupo:
Цитата: 253005
Снимаю шляпу, Вы победили в нашем "интеллектуальном противостоянии

Взаимно. Приятно иметь дело с "вменяемыми" людьми)

Форма ответа