Вывод результатов поиска с исходными заглавными буквами

+32
2.24K
При подсветке найденного в результатах поиска в Инстанте 1.10.х выдержки текста показываются полностью строчными (маленькими) буквами независимо от наличия заглавных букв в исходном тексте. Предлагаю вашему вниманию небольшой хак, который выводит текст в результатах поиска точно так же, как в оригинале, не меняя заглавных букв.

Я не знаю почему в версии 1.10.х подсветка в результатах поиска реализована через функции, убирающие заглавные буквы. И при этом на самом instantcms.ru там же заглавные буквы сохраняются. Как — тоже не знаю. На эти мои вопросы разработчики так и не дали мне ответа. Поэтому пришлось подправить кое-что в системе своим способом.

В файле \components\search\model.php заменяем функцию getHighlightedText на новую:

  1. protected function getHighlightedText($text) {
  2.  
  3. if (!cmsUser::sessionGet('searchquery')){ return $text; }
  4. $q = cmsUser::sessionGet('searchquery');
  5.  
  6. if ($this->look == 'phrase'){
  7. $text = preg_replace('/('.$q.')/iu','<span class="search_match">$1</span>', $text);
  8. } elseif($this->look == 'allwords') {
  9. $text = preg_replace('/('.$q.')/iu','<span class="search_match">$1</span>', $text);
  10. $words = explode(' ', cmsUser::sessionGet('searchquery'));
  11. foreach($words as $w){
  12. if (mb_strlen($w) > 0) $text = preg_replace('/('.$w.')/iu','<span class="search_match">$1</span>', $text);
  13. }
  14. } else { // 'anyword'
  15. $words = explode(' ', cmsUser::sessionGet('searchquery'));
  16. foreach($words as $w){
  17. if (mb_strlen($w) > 0) $text = preg_replace('/('.$w.')/iu','<span class="search_match">$1</span>', $text);
  18. }
  19. }
  20.  
  21. return $text;
  22.  
  23. }
На тех коротких текстах, которые выводятся в результатах поиска, использование preg_replace вместо оригинального str_replace если и увеличивает время работы скрипта, то на доли милисекунды, что в принципе незаметно. Так что тормозить не будет.

Функция проверена на английских и русских текстах — работает корректно. Если не понравится, вы всегда можете вернуть оригинальную функцию подсветки из инсталла CMS.

P.S. Оформление подсветки искомых слов в результатах поиска вынесено в стиль css "search_match". То есть, по умолчанию в отличие от стандартной подсветки найденные слова не выделяются жирным шрифтом. Если вам нужен жирный шрифт, замените <span class="search_match"> на <strong class="search_match"> (как в примере Fichter ниже) или на просто <strong>. Спасибо за подсказку, Fichter!
+2
Максим Шорин Максим Шорин 9 лет назад #
щас нахватаю минусов, но неимоверная хрень.. кому какая разница с большой буквы или с маленькой выводятся результаты ? был бы я разработчиком системы, я бы то же забил на подобный вопрос..
+12
WebMan WebMan 9 лет назад #
Как оказалось, разница есть. Поиск Инстанта в результатах вывода показывает куски текста в пределах некоторого количества слов вперёд и назад вокруг найденных слов. И частенько это получается "полтора землекопа". То есть, первое предложение с середины, потом целое предложение, потом ещё кусочек. Если весь текст написан только строчными буквами, то тяжелее улавливать правильный контекст найденного. Тем более, если в тексте часто встречаются аббревиатуры, имена, названия и сокращения. А если сохранить заглавные, то - легче. Например, на корпоративном портале некрасиво выводить название фирмы или продукции полностью маленькими буквами. А названия партнёров - тем более.

Я понимаю, что некоторым людям при общении в инете вообще ломы пользоваться заглавными буквами и даже знаками препинания. Может быть им и не важно как что-то написано. Но это исключительно личный выбор каждого. Кто-то выбирает путь лени и безграмотности, а кто-то хочет, чтобы его точнее понимали и с ним было проще/приятнее общаться. Для меня правильное пользование грамматикой и орфографией - это уважение к моим собеседникам. Я предпочту чуток потрудиться ради этого. Без обид, просто каждый выбирает своё. smile

И, кстати, все поисковики не ленятся оставлять найденный текст в том виде, в котором он был проиндексирован с сайта - с учётом заглавных букв. Видимо у них не дураки это делали. Хотя проще и экономнее сделать всё строчными буквами.

В любом случае, мне самому удобнее пользоваться таким поиском и, уверен, многим пользователям так же. И не в моих правилах "забивать" на подобные мелочи, касающиеся удобства, если я могу их реализовать. Хак выложен для тех, у кого такое же отношение к людям и к своему делу.
0
Максим Шорин Максим Шорин 9 лет назад #
к сожалению в данном случае молчание админов по этому вопросу превешивает твои доводы.. сори..
+6
Fuze Fuze 9 лет назад #
Будет внесено в дистрибутив.
По поводу "качества" поиска: поиск ищет стандартными средствами mysql (лучше не будет) и вполне прилично.
+1
letsgo letsgo 9 лет назад #
Ставьте поиск Гугла или Яндекса и все. Поиск в Инстанте нежизнеспособен. Будете в упор искать страницу и не найдете.
+2
Максим Шорин Максим Шорин 9 лет назад #
дело говорит чел
+1
Скела Скела 9 лет назад #
в iCMS ищется хорошо только те материалы где тэги стоят. Соглашусь в целом соглашусь со всеми про поиск.. но мелочи поправляются для каждого отдельно - кому как нравится. WebMan просто поделился - видно на его сайте это критично.
0
letsgo letsgo 9 лет назад #
Может просто недодумал про Гугл поиск? Там кстати и рекламу щелкают хорошо)
+5
WebMan WebMan 9 лет назад #
Согласен, letsgo, поиск в этой версии Инстанта, мягко говоря, не очень. Но на корпоративный сайт, например, ставить поиск от Гугла или Яндекса мне показалось не очень удачным. Тем более, что информации там мало и она достаточно хорошо структурирована, так что её и через меню можно легко найти. Поиск делался как дополнительная возможность. Когда в движке появится Sphinx или подобное, я подключу его, если такая необходимость возникнет.

На других типах сайтов поиск от поисковиков (простите за каламбур) может даже принести пользу. Теоретически. Поисковики могут как-то учитывать поисковые фразы, приходящие с сайта, для уточнения тематики сайта и своей выдачи по нему. Но это только мои предположения, конкретной инфы по этому вопросу у меня нет.
-2
letsgo letsgo 9 лет назад #
Зря показалось. Вы попробуйте найти несколько более менее точных запросов по сайту, ужаснуться можно тому, что будет выдано. Поставьте себя на место посетителя, пощелкайте поисков разных фраз и думаю понимание придет.

Берете поиск, настраиваете открывать в вкладке с лого сайта, оставляете поиск только на сайте и посетители вашего сайта получают качественный поиск, с релеватной выдачей либо по дате. Не упрекаю разработчиков, так как на самом деле поиск это весьма сложная задача, но факт есть факт. Кстати здесь тоже бы не помешал встроенный поиск яд или гугл.
+1
Anonim Anonim 9 лет назад #
Сортировка в поиске по дате, где искать: на форуме, в статьях, в блогах, в фото, несколько улучшила положение. Но в целом, поиском до версии 1.10.1 встроенным не пользовались вообще, сразу меняя его на яндекс.поиск.


Сейчас, с введенной это сортировкой, дело очень даже стало интересным, только если (как в Socium 3.0) Есть форма поиска помогающая сразу настроить его правильно

Даже на rutracker.org применяют встроенный поиск, потому что он прежде всего ищет всё! Поисковик не ищет не проиндексированное...

Но и в рутрекере есть опция - искать с помощью поисковых систем
+4
Fichter Fichter 9 лет назад #
Хорошая допилка! Спасибо! Меня как раз волновал этот вопрос ))
+5
Fichter Fichter 9 лет назад #
Единственное, что хочу добавить, в этой допилке не подсвечиваются в найденных текстах искомые слова (если конечно тег cgfy не прописать заранее в стилях). Поэтому я подправил этот код:

Код PHP:
  1. protected function getHighlightedText($text) {
  2. if (!cmsUser::sessionGet('searchquery')){ return $text; }
  3. $q = cmsUser::sessionGet('searchquery');
  4. if ($this->look == 'phrase'){
  5. $text = preg_replace('/('.$q.')/iu','<strong class="search_match">$1</strong>', $text);
  6. } elseif($this->look == 'allwords') {
  7. $text = preg_replace('/('.$q.')/iu','<strong class="search_match">$1</strong>', $text);
  8. $words = explode(' ', cmsUser::sessionGet('searchquery'));
  9. foreach($words as $w){
  10. if (mb_strlen($w) > 0) $text = preg_replace('/('.$w.')/iu','<strong class="search_match">$1</strong>', $text);
  11. }
  12. } else { // 'anyword'
  13. $words = explode(' ', cmsUser::sessionGet('searchquery'));
  14. foreach($words as $w){
  15. if (mb_strlen($w) > 0) $text = preg_replace('/('.$w.')/iu','<strong class="search_match">$1</strong>', $text);
  16. }
  17. }
  18. return $text;
  19. }
В данном случае все искомые слова будут выделяться жирным, как прежде.
+5
WebMan WebMan 9 лет назад #
Да, спасибо, Fichter! Я действительно забыл написать, что подсветка вынесена в стиль css "search_match". Просто не всем удобно выделение найденного именно жирным шрифтом. Некоторые предпочитают выделять цветом фона, например. Зависит от дизайна сайта.
0
Bubble Gumoff Bubble Gumoff 7 лет назад #
Блин обнаружил неимоверную хрень, переходя со страницы поиска на искомую страницу почему то в картинке в теге img <strong class="search_match - из за этого рушится галерея картинок на странице
<a href="#1"><img src="/images/photos/small/shop54.jpg" alt="Шаровый клапан <strong class=" search_match"="">HЕS8000 (Фото 1)" title="Шаровый клапан <strong class="search_match">HЕS8000 </strong>(Фото 1)" /&gt;</a>

Если обновить страницу все в порядке становится в коде, но вот такая хрень неуместна.

Что тут на что заменяется и как избежать поломки?
0
Bubble Gumoff Bubble Gumoff 7 лет назад #
То есть после замены так
<img src="/images/photos/small/shop54.jpg" alt="Шаровый клапан <strong class=" search_match"="">HЕS8000 (Фото 1)" title="Шаровый клапан <strong class="search_match">HЕS8000 </strong>(Фото 1)" />

а Должно быть так
<img src="/images/photos/small/shop54.jpg" alt="Шаровый клапан HЕS8000 (Фото 1)" title="Шаровый клапан HЕS8000 (Фото 1)" />


Причем как то криво заменилось на <strong class=" search_match"
0
WebMan WebMan 7 лет назад #
В данной ситуации могу предложить три решения:
1. Отключите поиск по картинкам.
2. Замените везде в коде поиска
Код PHP:
  1. <strong class="search_match">
на
Код PHP:
  1. <strong class=\'search_match\'>
Во втором варианте вместо двойных кавычек используются экранированные одинарные. При этом итоговый код будет выглядеть некрасиво, но, возможно, не будет ломать вёрстку:
Код PHP:
  1. <img src="/images/photos/small/shop54.jpg" alt="Шаровый клапан <strong class='search_match'>HЕS8000</strong> (Фото 1)" title="Шаровый клапан <strong class='search_match'>HЕS8000</strong> (Фото 1)" />
3. Самостоятельно допишите в поиске проверку, не находится ли искомая фраза внутри тега img, и тогда не нужно использовать оформление для искомой фразы strong-ом, а вместо этого каким-то образом можно подсвечивать (менять оформление дополнительным классом) всей картинки.
0
Bubble Gumoff Bubble Gumoff 7 лет назад #
Спасибо дружище, попробую пожалуй все три, посмотрим что получится dance
0
Bubble Gumoff Bubble Gumoff 7 лет назад #
1. разве поиск по картинкам где то отключается? не нашел такого
2. сделал
3. это вряд ли осилю
0
Bubble Gumoff Bubble Gumoff 7 лет назад #
2. не помогло, скорее всего цепляется за title в теге img
0
Bubble Gumoff Bubble Gumoff 7 лет назад #
Хм нормально все удалил доп код формировавший номер картинки в алт и титл и все нормально стало

Еще от автора

Хуки-хухуки: Исключаем неактивных пользователей из списков
Как иногда начинают свой монолог неопытные стендаперы: «У всех в жизни было такое …
«Расширенная отладка» для InstantCMS 2.14.1 (v.14.1.2) – большое обновление для разработчиков
Новые возможности и удобства, облегчающие разработчикам отладку компонентов и шаблонов.
Использование расширенной отладки. Часть 11. Анализ ошибок 403/404 и редиректов
Одной из неудобных задач при отладке для меня является поиск причины ошибки 403/404.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.