Здравствуйте, уважаемые!
Вторая ветка. Проблема наблюдается на разных ветках (на 2.11 и 2.12.2 — точно).
Столкнулся со странной проблемой в поиске: не ищется определённая комбинация символов: "111-11" (три символа тире два символа).
Если ввести в поле поиска именно "111-11", результат — "Ничего не найдено".
В заголовках записей такая комбинация, естественно, присутствует, какие именно цифры или буквы в запросе значения не имеет.
Второй день мучаю модель, найти разгадку не могу.
Помогите, кто чем может!
Заранее благодарен!
Вторая ветка. Проблема наблюдается на разных ветках (на 2.11 и 2.12.2 — точно).
Столкнулся со странной проблемой в поиске: не ищется определённая комбинация символов: "111-11" (три символа тире два символа).
Если ввести в поле поиска именно "111-11", результат — "Ничего не найдено".
В заголовках записей такая комбинация, естественно, присутствует, какие именно цифры или буквы в запросе значения не имеет.
Второй день мучаю модель, найти разгадку не могу.
Помогите, кто чем может!
Заранее благодарен!
#2
25 сентября 2019 в 12:25
Олег Васильевич я,
В каком поле ищем? Проставлено ли для этого поля "Участвует в полнотекстовом поиске"?
В каком поле ищем? Проставлено ли для этого поля "Участвует в полнотекстовом поиске"?
Такое давно наблюдается. Например на демо сайте если искать фразу «все больше россиян», то всё хорошо ищет, а если фразу «все больше» или «все хорошо», то выдает ошибку "Слишком короткие слова в запросе".
А вот, например, если ввести фразу «все норма», то правильно пишет "ничего не найдено"
А вот, например, если ввести фразу «все норма», то правильно пишет "ничего не найдено"
Сегодня в 15:48
#4
25 сентября 2019 в 14:28
Оно не пропускает к участию в поиске стоп-слова, которые как правило, не несут смысловой нагрузки.если фразу «все больше» или «все хорошо», то выдает ошибку "Слишком короткие слова в запросе".
Смотрите файл \system\languages\ru\stopwords\stopwords.php
#5
25 сентября 2019 в 18:24
Демо-сайт системы, тип контента "Новости", поля:В каком поле ищем? Проставлено ли для этого поля "Участвует в полнотекстовом поиске"?
Тип поля "Заголовок" участвует в поиске по умолчанию (если тип контента активирован в опциях компонента "Поиск" ("птичка" в опциях присутствует));
в поле "Текст новости" (тип поля "Текст HTML") опция активирована:
Новость с искомым значением: joxi.ru/krD7Y31sK3NYeA
Ищем значенние: joxi.ru/DrlEZq7UVJaoam
Как писал выше, проверял на разных версиях системы (в т.ч. на текущей), добавлю: на разных версиях РНР, на разных хостах, в разных браузерах
#6
25 сентября 2019 в 20:09
Олег Васильевич я,
У меня ищет нормально.
У меня ищет нормально.
Может дело не в бобине, а где-то в версии mysql?
#7
25 сентября 2019 в 20:52
У меня на локальном: MySQL — 5.5, двиг — InnoDB. Похоже, от двига не зависит (менял на MyISAM)), от РНР тоже (юзал 5.6.3, 5.6.4 и 7.2.22-he.0)Может дело не в бобине, а где-то в версии mysql ?
Да и тестировалось и на разных сайтах, и серверах, и версиях РНР
#8
25 сентября 2019 в 21:05
Кстати, в фильтре записи по такому запросу фильтруются без проблем.
#9
25 сентября 2019 в 21:24
Олег Васильевич я,
Проверил на тестовом сайте и на локальном.
На локальном всё работает при любых версиях мускула и пыхапе, на тестовом не работает ни при каких условиях.
Проверил на тестовом сайте и на локальном.
На локальном всё работает при любых версиях мускула и пыхапе, на тестовом не работает ни при каких условиях.
#10
25 сентября 2019 в 21:49
Беда бедовая
Ris, спасибо!
Ris, спасибо!
Олег Васильевич я,
Проверил print_r($word); слово, которое отправляется в поиск.
И на локальном и на тестовом результат один: 111-
На локальном находит всё. Запрос mysql:
находит одну строку
111-
Находит 0 строк.
Проверил print_r($word); слово, которое отправляется в поиск.
И на локальном и на тестовом результат один: 111-
На локальном находит всё. Запрос mysql:
SELECT `id`, `slug`, `date_pub`, `title`, `photo`, MATCH(`title`) AGAINST ('>\"111-11\" <(+111-*)' IN BOOLEAN MODE) AS fsort FROM cms_con_news WHERE `is_pub` = '1' AND `is_approved` = '1' AND `is_deleted` IS NULL AND `is_parent_hidden` IS NULL AND MATCH(`title`) AGAINST ('>\"111-11\" <(+111-*)' IN BOOLEAN MODE) ORDER BY fsort DESC LIMIT 0, 15
На тестовом сайте на реальном VPS на весте:
111-
SELECT `id`, `slug`, `date_pub`, `title`, `photo`, MATCH(`title`) AGAINST ('>\"111-11\" <(+111-*)' IN BOOLEAN MODE) AS fsort FROM cms_con_news WHERE `is_pub` = '1' AND `is_approved` = '1' AND `is_deleted` IS NULL AND `is_parent_hidden` IS NULL AND MATCH(`title`) AGAINST ('>\"111-11\" <(+111-*)' IN BOOLEAN MODE) ORDER BY fsort DESC LIMIT 0, 15
#12
25 сентября 2019 в 23:07
В поиск отправляется 111- вместо 111-11 потому что в модели компонента строка укорачивается на 2 символа:Проверил print_r($word); слово, которое отправляется в поиск.
И на локальном и на тестовом результат один: 111-
Убирал, толку ноль.
#13
28 сентября 2019 в 01:18
Похоже, сразу несколько недочётов в классе modelSearch.
Первый — свойство $three_symbol_search. Если значение по умолчанию выставить в true, начинает искаться. Правда, возникают иные проблемы, но разберёмся…
Первый — свойство $three_symbol_search. Если значение по умолчанию выставить в true, начинает искаться. Правда, возникают иные проблемы, но разберёмся…
Как оказалось, проблема несколько шире:
1. также не ищутся последовательности содержащие апостроф и двоеточие (дальше этих знаков экспериментировать не стал)
2. возникает в достаточно коротких запросах (одно слово, количество знаков до 6 включительно)
3. проблемный символ может быть в любой позиции строки до 3 включительно (от ноля считаем)
Ламерское решение под спойлером. Изменён 1 файл: system\controllers\search\model.php (код актуален для текущей версии из github).
Там всё откомментировано. Уважаемые гуру, помогите дожать "до коробки"!
1. также не ищутся последовательности содержащие апостроф и двоеточие (дальше этих знаков экспериментировать не стал)
2. возникает в достаточно коротких запросах (одно слово, количество знаков до 6 включительно)
3. проблемный символ может быть в любой позиции строки до 3 включительно (от ноля считаем)
Ламерское решение под спойлером. Изменён 1 файл: system\controllers\search\model.php (код актуален для текущей версии из github).
Там всё откомментировано. Уважаемые гуру, помогите дожать "до коробки"!
<?php class modelSearch extends cmsModel{ protected $query; protected $original_query; protected $type; protected $date_interval; protected $three_symbol_search = false; protected $punctuation_mark = false;//OV:: не будем лезть куда не следует public function setQuery($query){ $this->original_query = $query; $stopwords = string_get_stopwords(cmsCore::getLanguageName()); $this->three_symbol_search = true; $this->query[] = $query; return true; } return false; } $punctuation_in_word = preg_match('(^A-Za-z0-9)', $words[0]);//OV:: ищем в запросе "не буквы и не цифры" //OV:: запрос должен быть коротким и содержать "не буквы и не цифры" $this->punctuation_mark = true; } } foreach($words as $word){ if($this->punctuation_mark) {//OV:: запрос, попадающий под условие, не укорачиваем (хотя работает) } else { } } $this->query[] = $this->db->escape($word) . '*'; } return true; } public function setSearchType($type){ $this->type = $type; } public function setDateInterval($date){ $this->date_interval = $date; } public function getFullTextQuery(){ $ft_query = ''; switch ($this->type){ case 'words': if ($this->three_symbol_search || $this->punctuation_mark) {//OV:: $ft_query .= '%'.$this->db->escape($this->original_query).'%'; } else { $ft_query .= '>\"' . $this->db->escape($this->original_query).'\" <('; } break; case 'exact': if ($this->three_symbol_search) { $ft_query .= $this->db->escape($this->original_query); //OV:: } elseif($this->punctuation_mark) { $ft_query .= '%'.$this->db->escape($this->original_query).'%';//OV:: а здесь не верный запрос, но без '%' ничего не находит //OV:: end } else { $ft_query .= '\"' . $this->db->escape($this->original_query) . '\"'; } break; } return $ft_query; } public function getSearchSQL($table_name, $match_fields, $select_fields, $filters){ return $v; } return '`'.$v.'`'; }, $select_fields); $query = $this->getFullTextQuery(); $filter_sql = ''; if ($this->date_interval != 'all'){ switch ($this->date_interval){ case 'w': $filter_sql .= "DATEDIFF(NOW(), date_pub) <= 7 AND "; break; case 'm': $filter_sql .= "DATE_SUB(NOW(), INTERVAL 1 MONTH) < date_pub AND "; break; case 'y': $filter_sql .= "DATE_SUB(NOW(), INTERVAL 1 YEAR) < date_pub AND "; break; } } if($filters){ foreach (
#15
28 сентября 2019 в 21:09
Олег Васильевич я,
Повторюсь, у меня на локальном опенсервере всё нормально ищет, а на тестовом VPS под управлением весты не искало.
Решил проанализировать. Нашел отличие в конфиге mysql.
Переменная ft min word len на опенсервере — 3, а на тестовом — 4.
Изменил переменную (прописал в my.cnf ft_min_word_len=3 ). Теперь всё нормально ищет.
Выслал в личку доступ к тестовому сайту для экспериментов.
Повторюсь, у меня на локальном опенсервере всё нормально ищет, а на тестовом VPS под управлением весты не искало.
Решил проанализировать. Нашел отличие в конфиге mysql.
Переменная ft min word len на опенсервере — 3, а на тестовом — 4.
Изменил переменную (прописал в my.cnf ft_min_word_len=3 ). Теперь всё нормально ищет.
Выслал в личку доступ к тестовому сайту для экспериментов.