Похожие темы / Similar Topics

L

ler

Гость
Очень неточно выдает похожие релизы. Есть такие, у которых отличие в названии в одну цифру, но он вместо них выдает черт знает что. Надо прикрутить алгоритм шинглов
 

Wertos

Пользователь
А если немного затюнить...
PHP:
$title = (strlen($topic_title) > 10) ? (substr($topic_title, 0, 10) . '') : $topic_title;
$sgl_search = "t.topic_title LIKE '%" . addslashes($title) . "%'";
это удаляем и вместо этих строк
PHP:
$search_bool_mode = ($bb_cfg['allow_search_in_bool_mode']) ? ' IN BOOLEAN MODE' : '';
$title = preg_replace("#([^-A-Za-zА-Яа-яёЁ_!'&\$@%\s\*\.]*)#i", '', $topic_title); // оставляем то что нужно в титле
$title = smart_cut($title, 2); // режем титл до 2х слов
$sgl_search = "MATCH (t.topic_title) AGAINST ('". addslashes($title) ."'$search_bool_mode)";
 
$porno_forum    = ($bb_cfg['porno_forums']) ? $bb_cfg['porno_forums'] : '0';
$trash_forum    = ($bb_cfg['trash_forum_id']) ? $bb_cfg['trash_forum_id'] : '0';
//
$search_in = (isset($porno_forums[$forum_id])) ? 'AND f.forum_id IN ('.$porno_forum.') AND f.forum_id NOT IN ('.$trash_forum.') ' : 'AND f.forum_id NOT IN ('.$porno_forum.') AND f.forum_id NOT IN ('.$trash_forum.') '; // ищем порнуху в порнухе и наоборот
ищем
PHP:
AND f.forum_id NOT IN ('.$porno_forum.')
заменяем на
PHP:
$search_in

сама функция умного обрезания строки по словам
PHP:
function smart_cut($text, $words = 3) {
  $match = array();
  $r = preg_match("/^[^\s]+([\s]+[^\s]+){0,".($words-1)."}/", $text, $match);
  if ($r)
  return $match[0];
  return '';
}

Жду более приятных реализаций, особенно интересует со словами !
 

JDVU

Пользователь
чтобы искало к более подходящим темам по названию достаточно
Код:
$sgl_search = "t.topic_title LIKE '" . addslashes($title) . "%'";
 

Dr_Brown

Пользователь
Мужики стока напостили, что теперь не понятно что изменять, что добавлять и куда вставлять, прочитал этот пост и опупел, может кто выложит мануал нормальный со всеми изменениями:)
 
L

ler

Гость
Все делай как в первой инструкции. Только в viewtopic.php замени на это
PHP:
$topic_url = '<a title="'.$similar[$i]['topic_title'].'" href="viewtopic.php?'. POST_TOPIC_URL .'='. $similar[$i]['topic_id'].'">'. $title . '</a>';
$poster_url = "profile.php?mode=viewprofile&amp;". POST_USERS_URL .'='. $similar[$i]['user_id'];
$similar[$i]['username'] = wbr($similar[$i]['username']);
$poster_username = '<a class="genmed" href="'. $poster_url .'">'. $similar[$i]['username'] .'</a>';
$forum_url = "viewforum.php?f=". $similar[$i]['forum_id'];
 
L

ler

Гость
Я немного вот так допилил для себя

PHP:
// Похожие темы НАЧАЛО
if ($t_data['allow_reg_tracker'])
{
      //$title = (strlen($topic_title) > 10) ? (substr($topic_title, 0, 10) . '') : $topic_title;
 
 
$title = preg_replace("#([^-A-Za-zйцукенгшщзхъфывапролджэячсмитьбюйЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮёЁ\s]*)#i", '', $topic_title); // оставляем то что нужно в титле
 
$title = preg_replace('|-+|', ' ', $title);
$title = smart_cut($title, 4); // режем титл до 4х слов
$title = preg_replace('| +|', '%', $title);    // заменяем все повторяющиеся и одиночные пробелы на знак %
 
 
$sgl_search = "t.topic_title LIKE '%" . addslashes($title) . "%'";
//$sgl_search = "t.topic_title LIKE '" . addslashes($title) . "%'";
$title=str_replace('&','',$title);
 
//$porno_forums = $bb_cfg['porno_forums'] ? $bb_cfg['porno_forums'] : '1';
//  $trash_forums = $bb_cfg['trash_forum_id'] ? $bb_cfg['trash_forum_id'] : '0';
 
      $sql = "SELECT t.*, u.user_id, u.username, f.forum_id, f.forum_name, tor.size
            FROM ". BB_TOPICS ." t, ". BB_USERS ." u, ". BB_FORUMS ." f, ". BB_BT_TORRENTS ." tor
          WHERE t.topic_id != $topic_id
          AND tor.topic_id = t.topic_id
            AND $sgl_search
            AND f.allow_reg_tracker = 1
            AND t.forum_id = f.forum_id
            AND t.topic_poster = u.user_id
                    GROUP BY t.topic_title LIMIT 10";
             
//echo "<div style='display:none'>";
//var_dump($sql);
//echo "</div>";

Да кстати preg_replace не работает с кириллицей а-яА-Я в кодировке UTF-8, но если перечислить все символы по одиночке, то всё норм. Чисто моя наработка. Нигде больше не встречал простого решения

А это результат var_dump
Код:
string(545) "SELECT t.*, u.user_id, u.username, f.forum_id, f.forum_name, tor.size
            FROM bb_topics t, bb_users u, bb_forums f, bb_bt_torrents tor
          WHERE t.topic_id != 1616
          AND tor.topic_id = t.topic_id
            AND t.topic_title LIKE '%Предложение%которое%нам%нужно%найти%'
            AND f.allow_reg_tracker = 1
            AND t.forum_id = f.forum_id
            AND t.topic_poster = u.user_id
                    GROUP BY t.topic_title LIMIT 10"
 
Сверху