Компонент Поиск

3 символа - нет результатов

#1 18 июля 2016 в 06:41
Здравствуйте!

Имеется движок ICMS версии 2.5.1.

Заведен контент, необходимые типы контента добавлены в настройках Компонента Поиск.

Имеется страница с описанием подготовки к ЕГЭ по английскому языку. По слову "ЕГЭ" поиск выдает: "Ничего не найдено", хотя страница кишит этим словом в тексте, а также имеется в заголовке страницы. Другие слова с этой же страницы, длина которых начинается от 4 символов и более — ищутся и эта же самая страница (которую по запросу "ЕГЭ" сайт не может найти) преспокойно отображается в результатах поиска.

Как заставить компонент Поиск в InstantCMS 2.5.1 производить поиск страниц по трехсимвольным запросам?
#2 18 июля 2016 в 17:53

Как заставить компонент Поиск в InstantCMS 2.5.1 производить поиск страниц по трехсимвольным запросам?

Alexey Zagrebelniy
точно вопрос поднимался. Надо поменять настройки в базе данных какие-то. Поищите по сайту расширенным поиском яндекса фразу "Полнотекстовый индекс Fuze".
#3 18 июля 2016 в 20:03


Как заставить компонент Поиск в InstantCMS 2.5.1 производить поиск страниц по трехсимвольным запросам?

Alexey Zagrebelniy
точно вопрос поднимался. Надо поменять настройки в базе данных какие-то. Поищите по сайту расширенным поиском яндекса фразу "Полнотекстовый индекс Fuze".

Zau4man

Это не то. Данные поля типа "Текст HTML" у меня уже включены опции "Участвовать в полнотекстовом поиске", типы контента добавлены в настройках компонента Поиск для поиска, но .....
— для поиска по 1-2 символам — выдается ошибка "Слишком короткие слова в запросе";
— для поиска по запросу длиной в 3 символа — ничего не находится нигде;
— для поиска по запросу длиной 4 и более символов — производится поиск, причем те страницы выдает, где и искомое слово ЕГЭ.
Для примера: на странице с искомым словом "ЕГЭ" присутствует слово "IELTS" (это такой экзамен). Если я задаю в поиске запрос "IELTS" — он мне находит эту страницу без проблем, т.е. по 5 символам ищет. Если я задаю запрос "IELT" (т.е. 4 символа) — сайт тоже находит эту же страницу. Если я сокращу запрос до 3 символов и запрошу "IEL" — пишет "Ничего не найдено". Ну, а если я попытаюсь искать по "IE" — выдает ошибку "Слишком короткие слова в запросе".
Проблема в том, что на сайте много наименований содержащих 3 символа в названии и сайт их не находит.

В компоненте контроллера поиска в файле /system/controllers/search/model.php есть проверка длины слов:
  1.  
  2. public function setQuery($query){
  3.  
  4. $this->original_query = $query;
  5.  
  6. $this->query = array();
  7.  
  8. $stopwords = string_get_stopwords(cmsConfig::get('language'));
  9.  
  10. $words = explode(' ', $query);
  11.  
  12. foreach($words as $word){
  13.  
  14.  
  15. if (mb_strlen($word)<3 || is_numeric($word)) { continue; }
  16. if($stopwords && in_array($word, $stopwords)){ continue; }
  17. if (mb_strlen($word)==3) { $this->query[] = $this->db->escape($word); continue; }
  18.  
  19. if (mb_strlen($word) >= 12) {
  20. $word = mb_substr($word, 0, mb_strlen($word) - 4);
  21. } else if (mb_strlen($word) >= 10) {
  22. $word = mb_substr($word, 0, mb_strlen($word) - 3);
  23. } else if (mb_strlen($word) >= 6) {
  24. $word = mb_substr($word, 0, mb_strlen($word) - 2);
  25. } else {
  26. $word = mb_substr($word, 0, mb_strlen($word) - 1);
  27. }
  28.  
  29. $this->query[] = $this->db->escape($word) . '*';
  30.  
  31. }
  32.  
  33. if (empty($this->query)) { return false; }
  34.  
  35. return true;
  36.  
  37. }
  38.  
Но мне не понятно, что у длине равной 3 происходит там. Может быть где загвоздка в последующих обработчиках, но факт остается фактом: система не ищет запросы длиной ровно в 3 символа не зависимо от того, что и тип контента добавлен в поиск и для искомого поля включено "Участвовать в полнотекстовом поиске".

Так кто подскажет решение?
#4 18 июля 2016 в 20:46
Это не

система не ищет запросы длиной ровно в 3 символа

Это такое минимальное значение полнотекстового поиска MySQL по умолчанию — четыре символа.
Вам нужен доступ к изменению системной переменной MySQL ft_min_word_len,
#5 18 июля 2016 в 20:59

Вам нужен доступ к изменению системной переменной MySQL ft_min_word_len,

Геннадий Иванович

А если просто пририсовывать принудительно пробел к трёхбуквенному значению поиска?

  1. else if (mb_strlen($word) == 3) {
  2. $word = $word. ' ';}
Так прокатит?
-------------------------------------------------------

Увы, не прокатывает.

Впрочем попытка изменения ft_min_word_len тоже не слишком удачна...

Изменение переменной прямо в OpenServer\userdata\config\MySQL-5.5_my.ini тоже не решает вопрос.
--------------------------------------------------------------

Народ рекомендует преобразовывать все трехбуквенные слова в базу с дублированием, а при выводе — преобразовывать обратно:

xodos.ru/polnotekstoviy-poisk-mysql-po-3-simvolam/
#6 18 июля 2016 в 23:26
Достаточно сделать, чтобы если поисковая фраза имеет ровно три символа, SQL запрос выполнять через LIKE '%{$query}%'. Сделаю коммит на досуге.
#7 18 июля 2016 в 23:41


Достаточно сделать, чтобы если поисковая фраза имеет ровно три символа, SQL запрос выполнять через LIKE '%{$query}%'. Сделаю коммит на досуге.

Fuze

Спасибо, Fuze!

А я пока ради интереса отправил хостеру запрос может ли он изменить настройку серверной переменной для MySQL или нет.
#8 21 июля 2016 в 03:48
Ну как и предполагалось: хостер отказал изменить настройку серверной переменной. :(
#9 2 марта 2017 в 21:10


Достаточно сделать, чтобы если поисковая фраза имеет ровно три символа, SQL запрос выполнять через LIKE '%{$query}%'. Сделаю коммит на досуге.

Fuze

Здравствуйте! Удалась это как-то сделать, а то в 2.7.1 по трем буквам все равно не ищется.?
#10 18 марта 2017 в 17:31
Здравствуйте! Для меня это тоже актуальный вопрос
#11 18 марта 2017 в 17:40

Здравствуйте! Удалась это как-то сделать, а то в 2.7.1 по трем буквам все равно не ищется.?

@parunov
Поиск в Инстанте всегда был нечто из ряда… в общем очень сложно им пользоваться и выдача не корректная. Аякс бы поиск к нему…
#12 18 марта 2017 в 17:51

Аякс бы поиск к нему...

vikont
Вы считаете если прикрутить аякс все изменится? =)
#13 28 марта 2017 в 13:17
Люди! У меня проблемка такая. Не отображаются результаты поиска?! Похоже после обновления 2.7.1. Выводит меню, что найдено: Статьи-2, Новости-6 и т.п. А самого тела с результатами — нет?!!!
#14 28 марта 2017 в 15:05

Вы считаете если прикрутить аякс все изменится? =)

Val
Как то пробовал Поиск от Дениса Васильевича. У него аякс и как то работает иначе. Главное, что очень быстрая выдача сразу во время набора. то позволяет быстро определиться с корректностью ввода и даже не делать ввод полностью, если получен нужный результат.

Что имеем сейчас!? Надо ввести выражение поиска, нажать на Ввод и потом долго рыться в результатах, которые выдаются без какой либо фильтрации. Не редки случаи, когда вообще ничего не находится, хотя точно известно, что такое слово есть. Не поиск, а сплошная проблема.
#15 28 марта 2017 в 16:09
vikont, я говорил о том, что добавление технологии AJAX никаким образом не повлияет на качество поиска.
AJAX, Ajax (ˈeɪdʒæks, от англ. Asynchronous Javascript and XML — «асинхронный JavaScript и XML») — подход к построению интерактивных пользовательских интерфейсов веб-приложений, заключающийся в «фоновом» обмене данными браузера с веб-сервером. В результате, при обновлении данных веб-страница не перезагружается полностью, и веб-приложения становятся быстрее и удобнее.
Это совершенно из разных областей))
Да, с помощью аякс вам, как конечному пользователю, можно показать выпадающий список с какими либо строками, но формирование содержимого этого списка от аякс никак не зависит, от слова совсем. Более того, уверен что Денис Васильевич чего-то экстра неординарного в своем поиске не делал — я о том что выборка по БД происходит одинаково в обоих случаях. Хотя, признаюсь, я не видел дополнения о котором вы говорите, но предполагаю что поисковых движков оно не использует и систем ранжирования не применяет.
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.