史萊姆論壇

史萊姆論壇 (http://forum.slime.com.tw/)
-   論壇程式討論區 (http://forum.slime.com.tw/f79.html)
-   -   修正援VBB內建搜尋模組不支援中文 建議300000POSTS 以下論壇使用 (http://forum.slime.com.tw/thread151924.html)

貝斯特 2005-06-21 03:00 PM

修正援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

貝斯特 2005-06-21 03:01 PM

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))


---------------------------------------------------------------------------------------

貝斯特 2005-06-21 03:03 PM

| 搜尋
---------------------------------------------------------------------------------------
// 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"]);
}
}

貝斯特 2005-06-21 03:04 PM

| 後面加上
---------------------------------------------------------------------------------------
// #############################################################################
// 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";
}

貝斯特 2005-06-21 03:04 PM

| 取代為
---------------------------------------------------------------------------------------
// ###################### 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。然後清空索引。


所有時間均為台北時間。現在的時間是 03:44 AM

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

『服務條款』

* 有問題不知道該怎麼解決嗎?請聯絡本站的系統管理員 *


SEO by vBSEO 3.6.1