В ней реализовано определение раскладки совсем как у "взрослых" поисковиков.
Набираем в строке поиска "gfgf", а результаты получаем для "папа".
[spoiler]
Алгоритм основан на анализе частотности буквосочетаний конкретного языка.
Берем запрос, переводим буквы в номера клавиш и получаем язык на котором набрано слово или фраза.
$arLang = CSearchLanguage::GuessLanguage($q); if(is_array($arLang) && $arLang["from"] != $arLang["to"]) $query = CSearchLanguage::ConvertKeyboardLayout($query, $arLang["from"], $arLang["to"]); |
Несмотря на вероятностный характер алгоритм довольно точен.
На английском и русском словарях (30000 и 50000 слов) вероятность ошибки менее 1%.
Теперь о главном: поддержка автоопределения раскладки добавлена в компоненты search.title и search.page. Она включается и выключается параметром компонента.
Плохая новость заключается в том, что по умолчанию этот параметр включен. И кастомизированные шаблоны нуждаются в доработке. А именно:
<?if(isset($arResult["REQUEST"]["ORIGINAL_QUERY"])):?> <div class="search-language-guess"> В запросе "<a href="<?echo $arResult["ORIGINAL_QUERY_URL"]?>"><?echo $arResult["REQUEST"]["ORIGINAL_QUERY"]?></a>" восстановлена раскладка клавиатуры. </div><br /> <?endif;?> |
Эти строки надо добавить в шаблон сразу после </form><br />.
Вот только при клике по ссылке
будет искать так, как запросил пользователь, или опять сменит раскладку.
Вобщем, есть ли возможность искать по исходному запросу?
Для search.title в выпадающем меню добавляется еще один пункт с оригинальным запросом.
Максим, а как он понимает, что надо переключить? "baby" вот переключает к "ифин", к примеру
Чем короче слово, тем труднее с определением.
Я посмотрел процесс анализа приведенной вами фразы и внес соотв. исправление.
Если по исходному запросу ничего нет, то автоматически переводить.
Это увеличит нагрузку, но позволит избежать такого как сейчас:
Принтер HP -> Ghbynth HP
Принтер epson -> Ghbynth epson
HP -> РЗ
Мы перед реализацией функции думали пойти именно таким путем. И поняли, что это не решает одной из главных задач - меньше ошибочных поисков.
Вы можете кастомизировать компонент search.page с реализацией той логики которая вам нужна.
На это уйдет максимум полчаса:
1) комментируем строки 309-318
2) в строку 412 переносим закомментированные функции определения раскладки
Вариант второй. Вести индексированную базу авторитетных источников. В коменте ниже упоминается "SDRH-16M16". Так вот, если SDRH упоминается где-либо в title (ИБ, блоги, форумы, ...), то ставить галочку "такое слово существует" и скрипт ничего не меняет. В противном случае менять раскладку. Наверняка на спец.сайтах такие названия есть в заголовках (каталог товаров), так что процент точных попаданий вырастет.
Вариант третий. Смотреть сколько результатов с измененной раскладкой. И если для ЫВКР-16Ь16 (тот же пример) ничего не нашлось, то наверняка менять раскладку не стоит.
Ну и комбинация 2 и 3 варианта думаю очень сильно уменьшит промахи.
Пока еще опыта не набралось достаточно.
И таких товаров с похожими названиями у меня на сайте - более 3000.
Вводить не работающий функционал вы, конечно, горазды. А ответить на такой элементарный вопрос по своему же функционалу не способны.
Похоже на боязнь почувствовать себя бесполезным.
Получаю GetDisplazValue
В запросе "GetDisplayValue" восстановлена раскладка клавиатуры.
Если результаты будут не удовлетворительные - отключайте.
но просто вот так добавлять такие новшества да еще сразу активировать это безобразие
жалобы ... люди не могут пользоваться поиском!
а я сейчас должен искать где оно отключается это счастье
в модуле Поиск никаких соотв. настроек не обнаружено ...
В запросе "" восстановлена раскладка клавиатуры vecek
В запросе "" восстановлена раскладка клавиатуры "vecek"
Поиск модуль 10.0.2
Вам задавали тут уже не первый раз вопросы, как эту фигню отключить, но видимо вы сами немного не в курсе, где же это гениальное чудо отключается!
Перец — переводит в абракадабру.
Почему
Предлагаю улучшить алгоритм - вместо автоопределения раскладки искать одновременно по обеим раскладкам и объединять условия операцией "ИЛИ".
Поддерживаю идею с поиском по обеим раскладкам. А лучше, с возможностью более тонкой настройки этого автоопределения раскладки в каждом компоненте.
Битрикс все еще сырое, недопиленное, кривое чудо-юдо.
А как вам такое? Сайт - интернет магазин товаров интерьера. Невозможно найти кувшин. Кувшин, Карл!
что получилось бы что-то стоящее. А так оставили в сыром виде и всё.
Например, словарей-исключений или дополнительных фраз, которые переводить обязательно.
А то сейчас "irfa" – это irfa, а не "шкаф"
1) Там где идут такие строки (206-231):
if(is_array($arLang) && $arLang["from"] != $arLang["to"])
....else
....
в "if..." изменил строки:
$arResult["REQUEST"]["~QUERY"] = ...
$arResult["REQUEST"]["QUERY"] = ...
на:
$arResult["REQUEST"]["~QUERY_LAND"] = ...
$arResult["REQUEST"]["QUERY_LAND"] = ...
а так же закоментировал само слово "else".
2) Далее спустился ниже к строке (288):
if(strlen($folderPath) > 0) {
...
}
Вырезал всё содержимое этого условия, кроме строки (396):
$this->ShowComponentTemplate();
И сделал 2 условия:
//первое условие
if (isset($arResult["REQUEST"]["~QUERY_LAND"])and(trim($arResult["REQUEST"]["~QUERY_LAND"])!='')) {
//сюда вставил содержимое вырезанного с одной поправкой:
$arFilter = array(
"SITE_ID" => SITE_ID,
"QUERY" => $arResult["REQUEST"]["~QUERY_LAND"],
"TAGS" => $arResult["REQUEST"]["~TAGS"],
);
}
//второе условие
if (empty($arResult['SEARCH'])) {//и сюда скопировал содержимое вырезанного
}
ВСЁ. Подключил этот кастомный компонент и всё заработало.
if(strlen($folderPath) > 0) {
//первое условие
if (isset($arResult["REQUEST"]["~QUERY_LAND"])and(trim($arResult["REQUEST"]["~QUERY_LAND"])!='')) {
//сюда вставил содержимое вырезанного с одной поправкой:
$arFilter = array(
"SITE_ID" => SITE_ID,
"QUERY" => $arResult["REQUEST"]["~QUERY_LAND"],
"TAGS" => $arResult["REQUEST"]["~TAGS"],
);
}
//второе условие
if (empty($arResult['SEARCH'])) {
//и сюда скопировал содержимое вырезанного
}
$this->ShowComponentTemplate();
}
Удалять ничего не надо, просто в папку custom копируем компонент search.page и там уже редактируем по инструкции выше.
Еще один вариант решения одной строчкой. Правда, не факт, что не затрется (пока не известно, но не факт!).
Идем в bitrix/modules/search/tools. Открываем language.php для редактирования.
Ищем функцию:
/This function converts text between layouts
static function ConvertKeyboardLayout($text, $from, $to)
{
static $keyboards = array();
$combo = $from."|".$to;
и прямо за ней дописываем
return $text;
Сохраняем. Всё... Т.е. тут мы прямо в классе возвращаем текст обратно.