史萊姆論壇

返回   史萊姆論壇 > 專業主討論區 > 論壇程式討論區
忘記密碼?
論壇說明

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


發文 回覆
 
主題工具 顯示模式
舊 2005-06-21, 03:00 PM   #1
貝斯特 帥哥
長老會員
 
貝斯特 的頭像
榮譽勳章
UID - 90669
在線等級: 級別:1 | 在線時長:11小時 | 升級還需:1小時
註冊日期: 2003-08-06
住址: The Gates of Hell
文章: 1758
現金: 15064 金幣
資產: 5185909 金幣
Cool 修正援VBB內建搜尋模組不支援中文 建議300000POSTS 以下論壇使用

1.執行SQL:
---------------------------------------------------------------------------------------
| 執行
---------------------------------------------------------------------------------------
ALTER TABLE 'word' CHANGE 'title' 'title' VARCHAR( 50 ) NOT NULL

(如果有表前綴請使用 ALTER TABLE '前綴word' CHANGE 'title' 'title' VARCHAR( 50 ) NOT NULL )


2.新增設定
開啟 http://www.你的論壇網址.com/admincp/options.php?do=addsetting&grouptitle=search
---------------------------------------------------------------------------------------
| 依序填入空格
---------------------------------------------------------------------------------------
變數名:searchposttable
設置組:搜索選項
標題:啟用POST表單搜尋模式
描述:此模式將不透過索引表,直接搜尋POST資料表,效果比VBB內建模式精確且不製作索引檔以減少資料庫使用量,但對於大型資料庫會造成非常大負載。<BR>注意!若轉變為此搜尋模式,請務必手動刪除索引以釋放空間<BR>若更改為內建模式,請重新建立索引。
選項代碼:yesno
默認(預設):0
顯示順序 15
__________________

給自己看也給所有需要這些話鼓勵的人看!

認真不一定會得到美好的結果,但是不認真就一定沒有

想要有什麼結果,就秉持你的雙手
放手去做
總比什麼都沒付出最後失敗了才嘆氣來的好吧
沒努力的人.沒有資格說放棄
努力過的人.更要有勇氣繼續努力下去
貝斯特 目前離線  
送花文章: 1, 收花文章: 38 篇, 收花: 123 次
回覆時引用此帖
舊 2005-06-21, 03:01 PM   #2 (permalink)
長老會員
 
貝斯特 的頭像
榮譽勳章
UID - 90669
在線等級: 級別:1 | 在線時長:11小時 | 升級還需:1小時
註冊日期: 2003-08-06
住址: The Gates of Hell
文章: 1758
現金: 15064 金幣
資產: 5185909 金幣
預設

3.文件修改
開啟search.php
---------------------------------------------------------------------------------------
| 搜尋
---------------------------------------------------------------------------------------
// #############################################################################
// if query string is specified, check syntax and replace common syntax errors
if ($query)
{


| 後面加上
---------------------------------------------------------------------------------------
// 007pig
$oriquery = $query;



---------------------------------------------------------------------------------------
| 搜尋
---------------------------------------------------------------------------------------
if (verify_word_allowed($word))
{
// word is okay - add it to the list of NOT words to be queried
$words['NOT']["$word"] = 'NOT';
$queryWords["$word"] = &$words['NOT']["$word"];
}

| 取代為
---------------------------------------------------------------------------------------
if (verify_word_allowed($word))
{
if ($vboptions['searchposttable']) {
$words['NOT']["$word"] = 'NOT';
$queryWords["$word"] = &$words['NOT']["$word"];
} else {
foreach (sp_str($word) as $word)
{
$words['NOT']["$word"] = 'NOT';
$queryWords["$word"] = &$words['NOT']["$word"];
}
}
}

---------------------------------------------------------------------------------------
| 搜尋
---------------------------------------------------------------------------------------
if (verify_word_allowed($orBit))
{
// word is okay - add it to the list of OR words for this clause
$checkwords[] = $orBit;
}

| 取代為
---------------------------------------------------------------------------------------
if (verify_word_allowed($orBit))
{
// word is okay - add it to the list of OR words for this clause
// 007pig
if ($vboptions['searchposttable']) {
$checkwords[] = $orBit;
} else {
foreach (sp_str($orBit) as $orBit)
{
$checkwords[] = $orBit;
}
}
}
---------------------------------------------------------------------------------------
| 搜尋
---------------------------------------------------------------------------------------
// #############################################################################
// other words must be required (AND)


| 後面加上
---------------------------------------------------------------------------------------

// 007pig
if (!$vboptions['searchposttable']) {
$querysplit = implode(" ", sp_str($querysplit));
}

---------------------------------------------------------------------------------------
| 搜尋
---------------------------------------------------------------------------------------
if ($phrasequery)
{
$words = array();
$display['words'] = array(htmlspecialchars_uni('"' . $phrasequery . '"'));
$display['common'] = array();
$display['highlight'] = array(htmlspecialchars_uni($phrasequery));
$query = '"' . $query . '"';
}
else
{
foreach ($words AS $wordtype => $searchwords)
{
switch($wordtype)
{
case 'AND':
// do AND words
foreach (array_keys($searchwords) AS $word)
{
$display['words'][] = $word;
}
break;
case 'NOT':
// do NOT words
foreach (array_keys($searchwords) AS $word)
{
$display['words'][] = "</u></b>-<b><u>$word";
}
break;

case 'OR':
// do OR clauses
foreach ($searchwords AS $orClause)
{
$or = array();
foreach (array_keys($orClause) AS $orWord)
{
$or[] = $orWord;
}
$display['words'][] = implode('</u> OR <u>', $or);
}
break;

default:
// ignore COMMON words
}
}
}


| 取代為
---------------------------------------------------------------------------------------
if ($phrasequery)
{
$words = array();
$display['words'] = array(htmlspecialchars_uni('"' . $phrasequery . '"'));
$display['common'] = array();
$display['highlight'] = array(htmlspecialchars_uni($phrasequery));
$query = '"' . $query . '"';
}
else
{
// 007pig
$patterns[0] = "/\sOR\s/";
$patterns[1] = "/\s-/";
$patterns[2] = "/ /";
$replacements[0] = "|||</u>OR<u>";
$replacements[1] = "|||</u></b>-<b><u>";
$replacements[2] = "|||";

if($oriquery) $replacedwords = preg_replace($patterns, $replacements, sanitize_search_query($oriquery));
$display['words'] = explode("|||", str_replace("</u>OR<u>", "</u> OR <u>", $replacedwords));
}

---------------------------------------------------------------------------------------
| 搜尋
---------------------------------------------------------------------------------------
$getwords = $DB_site->query("
SELECT wordid, title FROM " . TABLE_PREFIX . "word
WHERE title LIKE('$queryword')
");



| 取代為
---------------------------------------------------------------------------------------

if (!$vboptions['searchposttable']) {
$getwords = $DB_site->query("
SELECT wordid, title FROM " . TABLE_PREFIX . "word
WHERE title LIKE('$queryword')
");
}

---------------------------------------------------------------------------------------
| 搜尋
---------------------------------------------------------------------------------------
if ($DB_site->num_rows($getwords))


| 取代為
---------------------------------------------------------------------------------------
if ($vboptions['searchposttable'] || $DB_site->num_rows($getwords))


---------------------------------------------------------------------------------------
貝斯特 目前離線  
送花文章: 1, 收花文章: 38 篇, 收花: 123 次
回覆時引用此帖
舊 2005-06-21, 03:03 PM   #3 (permalink)
長老會員
 
貝斯特 的頭像
榮譽勳章
UID - 90669
在線等級: 級別:1 | 在線時長:11小時 | 升級還需:1小時
註冊日期: 2003-08-06
住址: The Gates of Hell
文章: 1758
現金: 15064 金幣
資產: 5185909 金幣
預設

| 搜尋
---------------------------------------------------------------------------------------
// found some results for current word
$wordids = array();
while ($getword = $DB_site->fetch_array($getwords))
{
$wordids[] = $getword['wordid'];
}
// query post ids for current word...
// if $titleonly is specified, also get the value of postindex.intitle
$postmatches = $DB_site->query("
SELECT postid" . iif($titleonly, ', intitle') . iif($sortby == 'rank', ", score AS origscore,
CASE intitle
WHEN 1 THEN score + $vboptions[posttitlescore]
WHEN 2 THEN score + $vboptions[posttitlescore] + $vboptions[threadtitlescore]
ELSE score
END AS score") . "
FROM " . TABLE_PREFIX . "postindex
WHERE wordid IN(" . implode(',', $wordids) . ")
");


| 取代為
---------------------------------------------------------------------------------------
// query post ids for current word...
// if $titleonly is specified, also get the value of postindex.intitle
if (!$vboptions['searchposttable']) {
// found some results for current word
$wordids = array();
while ($getword = $DB_site->fetch_array($getwords))
{
$wordids[] = $getword['wordid'];
}
$postmatches = $DB_site->query("
SELECT postid" . iif($titleonly, ', intitle') . iif($sortby == 'rank', ", score AS origscore,
CASE intitle
WHEN 1 THEN score + $vboptions[posttitlescore]
WHEN 2 THEN score + $vboptions[posttitlescore] + $vboptions[threadtitlescore]
ELSE score
END AS score") . "
FROM " . TABLE_PREFIX . "postindex
WHERE wordid IN(" . implode(',', $wordids) . ")
");
} else {
$postmatches = $DB_site->query("
SELECT postid
FROM " . TABLE_PREFIX . "post
WHERE title LIKE '%$word%'" . iif($titleonly == 0, " OR pagetext LIKE '%$word%'")
);
}

---------------------------------------------------------------------------------------
| 搜尋
---------------------------------------------------------------------------------------
// #############################################################################
// get highlight words (part 2);
foreach ($display['highlight'] AS $key => $word)
{
if (!isset($queryWords["$word"]))
{
unset($display['highlight']["$key"]);
}
}
貝斯特 目前離線  
送花文章: 1, 收花文章: 38 篇, 收花: 123 次
回覆時引用此帖
舊 2005-06-21, 03:04 PM   #4 (permalink)
長老會員
 
貝斯特 的頭像
榮譽勳章
UID - 90669
在線等級: 級別:1 | 在線時長:11小時 | 升級還需:1小時
註冊日期: 2003-08-06
住址: The Gates of Hell
文章: 1758
現金: 15064 金幣
資產: 5185909 金幣
預設

| 後面加上
---------------------------------------------------------------------------------------
// #############################################################################
// get highlight words (part3);
if (!$vboptions['searchposttable'] && count($display['highlight']) % 2 == 0)
{
if (!preg_match("/^[[:alpha:]]+$/", end($display['highlight']))) {
$display['highlight']['temp'] = substr(end($display['highlight']), -2);
}
}

---------------------------------------------------------------------------------------
| 搜尋
---------------------------------------------------------------------------------------

// check that word exists in the title
if ($titleonly)

| 取代為
---------------------------------------------------------------------------------------
// check that word exists in the title
if ($titleonly && !$vboptions['searchposttable'])

儲存檔案!



開啟includes/functions_databuild.php
---------------------------------------------------------------------------------------
| 搜尋
---------------------------------------------------------------------------------------
// ###################### Start indexpost #######################
function build_post_index($postid, $foruminfo, $firstpost = -1, $post = false)
{
global $vboptions;

if ($vboptions['fulltextsearch'])
{
return;
}

| 取代為
---------------------------------------------------------------------------------------
// ###################### Start indexpost #######################
function build_post_index($postid, $foruminfo, $firstpost = -1, $post = false)
{
global $vboptions;

if ($vboptions['fulltextsearch'] || $vboptions['searchposttable'])
{
return;
}


---------------------------------------------------------------------------------------
| 搜尋
---------------------------------------------------------------------------------------
$words = fetch_postindex_text($threadinfo['title']);
$allwords .= $words;
$wordarray = explode(' ', $words);


| 取代為
---------------------------------------------------------------------------------------
$words = fetch_postindex_text($threadinfo['title']);
// 007pig
$wordarray = sp_str($words);
$allwords .= implode(" ", $wordarray);
---------------------------------------------------------------------------------------
| 搜尋
---------------------------------------------------------------------------------------
$words = fetch_postindex_text($post['title']);
$allwords .= ' ' . $words;
$wordarray = explode(' ', $words);


| 取代為
---------------------------------------------------------------------------------------
$words = fetch_postindex_text($post['title']);
// 007pig
$wordarray = sp_str($words);
$allwords .= implode(" ", $wordarray);

---------------------------------------------------------------------------------------
| 搜尋
---------------------------------------------------------------------------------------
$words = fetch_postindex_text($post['pagetext']);
$allwords .= ' ' . $words;
$wordarray = explode(' ', $words);


| 取代為
---------------------------------------------------------------------------------------
$words = fetch_postindex_text($post['pagetext']);
// 007pig
$wordarray = sp_str($words);
$allwords .= implode(" ", $wordarray);

---------------------------------------------------------------------------------------
| 搜尋
---------------------------------------------------------------------------------------
$text = strip_tags($text); // clean out HTML as it's probably not going to be indexed well anyway


| 取代為
---------------------------------------------------------------------------------------
//$text = strip_tags($text); // clean out HTML as it's probably not going to be indexed well anyway

---------------------------------------------------------------------------------------
| 搜尋
---------------------------------------------------------------------------------------
// ###################### Start unindexpost #######################
function delete_post_index($postid, $title = '', $pagetext = '')
{
global $DB_site, $vboptions;

if ($vboptions['fulltextsearch'])
{
return;
}


| 取代為
---------------------------------------------------------------------------------------
// ###################### Start unindexpost #######################
function delete_post_index($postid, $title = '', $pagetext = '')
{
global $DB_site, $vboptions;

if ($vboptions['fulltextsearch'] || $vboptions['searchposttable'])
{
return;
}

儲存檔案!

開啟includes/functions.php
---------------------------------------------------------------------------------------
| 在檔案末端
---------------------------------------------------------------------------------------
/*======================================================================*\
|| ####################################################################
|| # *
|| # CVS: $RCSfile: functions.php,v $ - $Revision: 1.944 $
|| ####################################################################
\*======================================================================*/
?>

之前


| 增加
---------------------------------------------------------------------------------------
// ###################### 中文二元語法(bigram)切分詞 #######################
// 007pig
function sp_str($str)
{
// 如果只是單字,則直接返回
if (strlen($str) <= 3) {
$ahz[] = $str;
return $ahz;
}

$ahz = array();
$search = array(",", "/", "\\", ".", ";", ":", "\"", "!", "~", "`", "^", "(", ")", "?", "-", "\t", "\n", "'", "<", ">", "\r", "\r\n", "$", "&", "%", "#", "@", "+", "=", "{", "}", "[", "]", ":", ")", "(", ".", "。", ",", "!", ";", "「", "」", "『", "』", "〔", "〕", "、", "—", " ", "《", "》", "-", "…", "【", "】",);
$str = str_replace($search," ",$str);
$strarr = explode(" ", $str);

foreach ($strarr as $str)
{
if (preg_match("/^[[:alpha:]]+$/", $str)) {
array_push($ahz, $str);
} else {
$n = strlen($str);
$m = 0;
$j = 0;
$en = '';
for($i=0;$i<$n;$i++)
{
if(ord($str[$i]) > 128)
{
$hz[$m] = $str[$i].$str[$i+1];
if($m > 0)
{
array_push($ahz, $hz[$m-1].$hz[$m]);
$j++;
}
$m++;
$i++;
if (!empty($en)) {
array_push($ahz, $en);
$en='';
}
}
else
{
$en .= $str[$i];
}

}

$a_e = preg_split("/[\s,]+/",$en);
$n_e = count($a_e);
for($u = 0;$u < $n_e;$u++)
{
if(strlen($a_e[$u]) < 4 || strlen($a_e[$u]) > 50)
continue;
array_push($ahz, strtolower($a_e[$u]));
$n_a++;
}
$en='';
}
}

return $ahz;
}
儲存檔案!
開啟includes/functions_showthread.php
---------------------------------------------------------------------------------------
| 搜尋
---------------------------------------------------------------------------------------
// ###################### Start process_highlight_postbit #######################
function process_highlight_postbit($text, $words, $prepend)
{
$text = str_replace('\"', '"', $text);
foreach ($words AS $replaceword)
{
$text = preg_replace('#(?<=[\s"\]>()]|^)(' . $replaceword . ')(([.,:;-?!()\s"<\[]|$))#siU', '<span class="highlight">\\1</span>\\2', $text);
//$text = preg_replace('#(?<=[^\w=])(' . $replaceword . ')(?=[^\w=])#siU', '<span class="highlight">\\1</span>', $text);
}

return "$prepend$text";
}
貝斯特 目前離線  
送花文章: 1, 收花文章: 38 篇, 收花: 123 次
回覆時引用此帖
舊 2005-06-21, 03:04 PM   #5 (permalink)
長老會員
 
貝斯特 的頭像
榮譽勳章
UID - 90669
在線等級: 級別:1 | 在線時長:11小時 | 升級還需:1小時
註冊日期: 2003-08-06
住址: The Gates of Hell
文章: 1758
現金: 15064 金幣
資產: 5185909 金幣
預設

| 取代為
---------------------------------------------------------------------------------------
// ###################### Start process_highlight_postbit #######################
function process_highlight_postbit($text, $words, $prepend)
{
$text = str_replace('\"', '"', $text);
foreach ($words AS $replaceword)
{
$text = str_replace($replaceword, '<span class="highlight">'. $replaceword .'</span>', $text);
}

return "$prepend$text";
}



3.重建/清除索引檔
若您資料庫中已經有文章,請到管理面板->引入 & 維護->更新計數器->重建搜索索引:
首先請點擊「點這裡清空」清空索引,然後點擊「重建搜索索引」按鈕重建搜索索引。

原版本升級說明
如果您曾經安裝過中文搜索支持 2.x 版本,那麼請在原英文版這幾個文件的基礎上重新修改文件,替換 2.x 版本修改過的 search.php 和 functions_databuild.php。並修改functions.php和functions_showthread.php。然後清空索引。
貝斯特 目前離線  
送花文章: 1, 收花文章: 38 篇, 收花: 123 次
回覆時引用此帖
發文 回覆



發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用


所有時間均為台北時間。現在的時間是 02:11 PM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1