Airgun.Org.Ru

Всероссийское Общество любителей пневматического оружия
Текущее время: 23 апр 2024, 21:16

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: Быстрый поиск на форуме
СообщениеДобавлено: 06 сен 2005, 14:01 
Клуб ВОЛПО Клуб ВОЛПО
Аватара пользователя

Регистрация: 18.03.2005
Сообщений: 312
Откуда: Петербург, Парнас
Предлагаю ввести форму быстрого поиска прямо в шапку форума.

Это позволит работать с поиском гораздо быстрее и эффективнее.

Дело в том что обычно нужны простые запросы например " ИЖ + UP* " а в поисковой страничке нужно выставлять кучу дополнительных параметров.

в общем всё что требуется - это заверстать в "overall_header.tpl" (это вёрстка шапки форума) следующую табличку:
Код:
               <table border="0">
                       <form action="search.php?mode=results" method="post">
                       <tr>
                       <td><input type="text" name="search_keywords" value="Быстрый поиск (рус/лат слова; их сочетания через '+'; маска * )" size="70" style="border-color: black;" onFocus="this.value=''"></td>
                       <td><INPUT TYPE="submit" BORDER="0" value="Искать" ALT="Submit" accesskey="s"></td>
                       <input type="hidden" name="searchuser" value="">
                       <input type="hidden" name="search_forum" value="-1">
                       <input type="hidden" name="search_author" value="">
                       <input type="hidden" name="search_time" value="0">
                       <input type="hidden" name="search_cat" value="-1">
                       <input type="hidden" name="sort_by" value="0">
                       <input type="hidden" name="show_results" value="topics">
                       <input type="hidden" name="retrun_chars" value="-1">
                     </td>
                     </tr>
               </form>
               </table>


Как это работает можно посмотреть например на http://www.roboforum.ru
или http://www.3nity.ru

Из практики знаю что это уменьшитт количество вторичных всплесков обсуждения уже давно обмусоленной темы в 2-3 раза!

_________________

Edgun 5.5 + Nikko Stirling 10x42


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: 06 сен 2005, 14:24 
Клуб ВОЛПО Клуб ВОЛПО
Аватара пользователя

Регистрация: 18.03.2005
Сообщений: 312
Откуда: Петербург, Парнас
Кстати не работает выборка по всем сообщениям автора при запросе из профиля. нужно подставлять имя автора ручками, а в случае рускоязычного его написания это сделать весьма проблематично...

_________________

Edgun 5.5 + Nikko Stirling 10x42


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Быстрый поиск на форуме
СообщениеДобавлено: 06 сен 2005, 20:51 

Регистрация: 05.04.2004
Сообщений: 2858
setar писал(а):
Предлагаю ввести форму быстрого поиска прямо в шапку форума.

Угу, попробуем вставить :)

Насчет выборки - это я знаю. Только бы еще знать, как это чинить :)


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: 07 сен 2005, 17:15 
Клуб ВОЛПО Клуб ВОЛПО
Аватара пользователя

Регистрация: 18.03.2005
Сообщений: 312
Откуда: Петербург, Парнас
быстрый поиск работает , заценил.
вот только не все посты индексированны на поиск руского текста.

пример:
пост https://airgun.org.ru/forum/viewtopic.php?t=261 (древний)
ищем слово "Скороспороновоговорилки" - не находим.

проблемма в том что когда начинался форум движок не создавал списки индексных слов для русского языка.

лечится это однократным реиндексированием
вот код таблетки :

открываем файл include/functions_search.php
в нём ищим (в функции clean_words)
Код:
   static $drop_char_match =   array('^', '$', '&', '(', ')', '<', '>', '`', '\'', '"', '|', ',', '@', '_', '?', '%', '-', '~', '+', '.', '[', ']', '{', '}', ':', '\\', '/', '=', '#', '\'', ';', '!');
   static $drop_char_replace = array(' ', ' ', ' ', ' ', ' ', ' ', ' ', '',  '',   ' ', ' ', ' ', ' ', '',  ' ', ' ', '',  ' ',  ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' , ' ', ' ', ' ', ' ',  ' ', ' ');

   $entry = ' ' . strip_tags(strtolower($entry)) . ' ';


непосредственно за этим добавляем фикс русскоязычный:
Код:
# --- Setar mod ---
# конвертируем русские буквы в нижний регистр   
   $entry = strtr ($entry,"АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ","абвгдеёжзийклмнопрстуфхцчшщъыьэюя");
# --- end Setar mod ---



далее добавляем новую функцию - реиндексирования постов
Код:
# --- Setar mod ---
#############################################
function rescan_search_words ()
#############################################
{
   global $db, $phpbb_root_path, $board_config, $lang;
   
   $query = "DELETE FROM phpbb_search_wordlist";
   $result = mysql_query($query);
   $query = "DELETE FROM phpbb_search_wordmatch";
   $result = mysql_query($query);
   
   $query = "SELECT * from phpbb_posts_text";
   $result = mysql_query($query);
   while ( $scan = $db->sql_fetchrow($result) )
   {
      $post_id=$scan['post_id'];
      $post_text=$scan['post_text'];
      $post_title =$scan['post_subject'];
//print "Debug: $post_id<br>";

###########################################################################################
   $stopwords_array = @file($phpbb_root_path . 'language/lang_' . $board_config['default_lang'] . "/search_stopwords.txt");
   $synonym_array = @file($phpbb_root_path . 'language/lang_' . $board_config['default_lang'] . "/search_synonyms.txt");

/*
$a =  $synonym_array;
$i=0;         
while ($i<10){         
echo "debug: a[$i]=$a[$i]<br>";
$i++;
};
*/

   $search_raw_words = array();
   $search_raw_words['text'] = split_words(clean_words('post', $post_text, $stopword_array, $synonym_array));
   $search_raw_words['title'] = split_words(clean_words('post', $post_title, $stopword_array, $synonym_array));

   $word = array();
   $word_insert_sql = array();
   while ( list($word_in, $search_matches) = @each($search_raw_words) )
   {
      $word_insert_sql[$word_in] = '';
      if ( !empty($search_matches) )
      {
         for ($i = 0; $i < count($search_matches); $i++)
         {
            $search_matches[$i] = trim($search_matches[$i]);

            if( $search_matches[$i] != '' )
            {
               $word[] = $search_matches[$i];
               if ( !strstr($word_insert_sql[$word_in], "'" . $search_matches[$i] . "'") )
               {
                  $word_insert_sql[$word_in] .= ( $word_insert_sql[$word_in] != "" ) ? ", '" . $search_matches[$i] . "'" : "'" . $search_matches[$i] . "'";
               }
            }
         }
      }
   }

   if ( count($word) )
   {
      sort($word);

      $prev_word = '';
      $word_text_sql = '';
      $temp_word = array();
      for($i = 0; $i < count($word); $i++)
      {
         if ( $word[$i] != $prev_word )
         {
            $temp_word[] = $word[$i];
            $word_text_sql .= ( ( $word_text_sql != '' ) ? ', ' : '' ) . "'" . $word[$i] . "'";
         }
         $prev_word = $word[$i];
      }
      $word = $temp_word;

      $check_words = array();
      switch( SQL_LAYER )
      {
         case 'postgresql':
         case 'msaccess':
         case 'mssql-odbc':
         case 'oracle':
         case 'db2':
            $sql = "SELECT word_id, word_text     
               FROM " . SEARCH_WORD_TABLE . "
               WHERE word_text IN ($word_text_sql)";
            if ( !($result = $db->sql_query($sql)) )
            {
               message_die(GENERAL_ERROR, 'Could not select words', '', __LINE__, __FILE__, $sql);
            }

            while ( $row = $db->sql_fetchrow($result) )
            {
               $check_words[$row['word_text']] = $row['word_id'];
            }
            break;
      }

      $value_sql = '';
      $match_word = array();
      for ($i = 0; $i < count($word); $i++)
      {
         $new_match = true;
         if ( isset($check_words[$word[$i]]) )
         {
            $new_match = false;
         }

         if ( $new_match )
         {
            switch( SQL_LAYER )
            {
               case 'mysql':
               case 'mysql4':
                  $value_sql .= ( ( $value_sql != '' ) ? ', ' : '' ) . '(\'' . $word[$i] . '\', 0)';
                  break;
               case 'mssql':
                  $value_sql .= ( ( $value_sql != '' ) ? ' UNION ALL ' : '' ) . "SELECT '" . $word[$i] . "', 0";
                  break;
               default:
                  $sql = "INSERT INTO " . SEARCH_WORD_TABLE . " (word_text, word_common)
                     VALUES ('" . $word[$i] . "', 0)";
                  if( !$db->sql_query($sql) )
                  {
                     message_die(GENERAL_ERROR, 'Could not insert new word', '', __LINE__, __FILE__, $sql);
                  }
                  break;
            }
         }
      }

      if ( $value_sql != '' )
      {
         switch ( SQL_LAYER )
         {
            case 'mysql':
            case 'mysql4':
               $sql = "INSERT IGNORE INTO " . SEARCH_WORD_TABLE . " (word_text, word_common)
                  VALUES $value_sql";
               break;
            case 'mssql':
               $sql = "INSERT INTO " . SEARCH_WORD_TABLE . " (word_text, word_common)
                  $value_sql";
               break;
         }

         if ( !$db->sql_query($sql) )
         {
            message_die(GENERAL_ERROR, 'Could not insert new word', '', __LINE__, __FILE__, $sql);
         }
      }
   }


   while( list($word_in, $match_sql) = @each($word_insert_sql) )
   {
print "Debug: $word_in, $match_sql<br>";
      $title_match = ( $word_in == 'title' ) ? 1 : 0;

      if ( $match_sql != '' )
      {
         $sql = "INSERT INTO " . SEARCH_MATCH_TABLE . " (post_id, word_id, title_match)
            SELECT $post_id, word_id, $title_match 
               FROM " . SEARCH_WORD_TABLE . "
               WHERE word_text IN ($match_sql)";
         if ( !$db->sql_query($sql) )
         {
            message_die(GENERAL_ERROR, 'Could not insert new word matches', '', __LINE__, __FILE__, $sql);
         }
      }
   }

###########################################################################################


   };
};
# --- end Setar mod ---


Эта функчия добавляется в любом месте , только не внутри другой функции.
у меня она идёт после функции clean_words, вот код её конца
Код:
   return $entry;
}


на этом изменения в библиотеке поиска закончены.





функция рескана запускается таким файлом, выложеным в корне, например rescan_search.php затем файл можно удалить или периименовать. выполняется долго, может мин 30.

Код:
<?php
define('IN_PHPBB', true);
$phpbb_root_path = './';
include($phpbb_root_path . 'extension.inc');
include($phpbb_root_path . 'common.'.$phpEx);
include($phpbb_root_path . 'includes/bbcode.'.$phpEx);
include($phpbb_root_path . 'includes/functions_search.'.$phpEx);


rescan_search_words ();
exit(0);
?>

_________________

Edgun 5.5 + Nikko Stirling 10x42


Вернуться к началу
 Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
POWERED_BY
Русская поддержка phpBB