[釋出]phpBB 2.0.0 中文搜尋檔 2.1

與 phpBB 2.0.x 相關主題。

版主: 版主管理群

Scorpion
竹貓好朋友
竹貓好朋友
文章: 104
註冊時間: 2001-11-23 18:17
聯繫:

文章 Scorpion »

經由勃士的講解,phpBB 的搜尋問題似乎和 vBB 一樣,將關鍵字存入 table,但是\r
中文不像英文 26 個字母那麼簡單還包含一堆 hight bytes ASCII 碼,所以無法正確
搜尋,只能直接搜尋文章內容,這樣或許速度會慢一點但還解決問題!
oO]-[Oo
南宮博士
南宮博士
文章: 512
註冊時間: 2001-11-11 18:09
來自: TAIWAN
聯繫:

文章 oO]-[Oo »

othree 寫: 恩恩\r
我想請問一下
他的 sql 語法的TABLE的名稱的對應在哪裡啊
像是這樣 [" . POSTS_TEXT_TABLE . "]
POSTS_TEXT_TABLE 是代表哪一個TABLE呢??

所以我找不到你所說的索引的 TABLE
不過確實感覺到有這東西(只找的到新 post 的文張)
我是 snitz 轉過來的
所以搜尋全滅
看來這個搞定還要去研究 post 了
不然這樣我可無法承受啊...
那些變數都在 includes/constant.php裡定義了
[php]<?php
// Table names
define('AUTH_ACCESS_TABLE', $table_prefix.'auth_access');
define('BANLIST_TABLE', $table_prefix.'banlist');
define('CATEGORIES_TABLE', $table_prefix.'categories');
define('CONFIG_TABLE', $table_prefix.'config');
define('DISALLOW_TABLE', $table_prefix.'disallow');
define('FORUMS_TABLE', $table_prefix.'forums');
define('GROUPS_TABLE', $table_prefix.'groups');
define('POSTS_TABLE', $table_prefix.'posts');
define('POSTS_TEXT_TABLE', $table_prefix.'posts_text');
define('PRIVMSGS_TABLE', $table_prefix.'privmsgs');
define('PRIVMSGS_TEXT_TABLE', $table_prefix.'privmsgs_text');
define('PRIVMSGS_IGNORE_TABLE', $table_prefix.'privmsgs_ignore');
define('PRUNE_TABLE', $table_prefix.'forum_prune');
define('RANKS_TABLE', $table_prefix.'ranks');
define('SEARCH_TABLE', $table_prefix.'search_results');
define('SEARCH_WORD_TABLE', $table_prefix.'search_wordlist');
define('SEARCH_MATCH_TABLE', $table_prefix.'search_wordmatch');
define('SESSIONS_TABLE', $table_prefix.'sessions');
define('SMILIES_TABLE', $table_prefix.'smilies');
define('THEMES_TABLE', $table_prefix.'themes');
define('THEMES_NAME_TABLE', $table_prefix.'themes_name');
define('TOPICS_TABLE', $table_prefix.'topics');
define('TOPICS_WATCH_TABLE', $table_prefix.'topics_watch');
define('USER_GROUP_TABLE', $table_prefix.'user_group');
define('USERS_TABLE', $table_prefix.'users');
define('WORDS_TABLE', $table_prefix.'words');
define('VOTE_DESC_TABLE', $table_prefix.'vote_desc');
define('VOTE_RESULTS_TABLE', $table_prefix.'vote_results');
define('VOTE_USERS_TABLE', $table_prefix.'vote_voters');
?>[/php]

他那個檔真的太長了.. 看的頭會昏, 不過你抓到重點了, 我當時可能是誤判\r
他所有INSERT的東作都是塞垃圾.. 所以把那些INSERT SEARCH... 的全刪\r
了^^".. 後來我又想過一次, 如果把所有 "," "." " "當作斷句的關鍵(可能再加一
些甚麼"的", "是")來切, 照著他們原本的邏輯, 中文應該也可以硬塞進去.. 不過
這又有另一個問題, 就是DB會爆增.. 真的是兩難@@".. 而且還要回過頭來處理
之前沒有index的文章... :-|
OOHOO said:
有事Mail給我, 不要P我, 因為根本沒辦法P.
oO]-[Oo
南宮博士
南宮博士
文章: 512
註冊時間: 2001-11-11 18:09
來自: TAIWAN
聯繫:

文章 oO]-[Oo »

我找到了我誤砍的那段了... 換頁問題修復

打開修改過的search.php
找\r

代碼: 選擇全部

		unset($store_search_data);

	}


	//
	// Look up data ...
	//
換成

代碼: 選擇全部

		unset($store_search_data);

		mt_srand ((double) microtime() * 1000000);
		$search_id = mt_rand();

		$sql = "UPDATE " . SEARCH_TABLE . " 
			SET search_id = $search_id, search_array = '$result_array'
			WHERE session_id = '" . $userdata['session_id'] . "'";
		if ( !($result = $db->sql_query($sql)) || !$db->sql_affectedrows() )
		{
			$sql = "INSERT INTO " . SEARCH_TABLE . " (search_id, session_id, search_array) 
				VALUES($search_id, '" . $userdata['session_id'] . "', '" . str_replace("\'", "''", $result_array) . "')";
			if ( !($result = $db->sql_query($sql)) )
			{
				message_die(GENERAL_ERROR, 'Could not insert search results', '', __LINE__, __FILE__, $sql);
			}
		}
	}
	else
	{
		if ( intval($search_id) )
		{
			$sql = "SELECT search_array 
				FROM " . SEARCH_TABLE . " 
				WHERE search_id = $search_id  
					AND session_id = '". $userdata['session_id'] . "'";
			if ( !($result = $db->sql_query($sql)) )
			{
				message_die(GENERAL_ERROR, 'Could not obtain search results', '', __LINE__, __FILE__, $sql);
			}

			if ( $row = $db->sql_fetchrow($result) )
			{
				$search_data = unserialize($row['search_array']);
				for($i = 0; $i < count($store_vars); $i++)
				{
					$$store_vars[$i] = $search_data[$store_vars[$i]];
				}
			}
		}
	}

	//
	// Look up data ...
	//
存檔搞定
OOHOO said:
有事Mail給我, 不要P我, 因為根本沒辦法P.
chihsun
星球普通子民
星球普通子民
文章: 6
註冊時間: 2002-03-23 00:18
來自: 高雄
聯繫:

文章 chihsun »

南宮博士將所有search的內容都砍了!連search_session也沒insert進去…\r
我想可能是這裡造成搜尋的東西沒有正確存在DB,因此沒辦法跳頁吧!
小弟自己將南宮博士目前直接搜尋post_text table的方法將原來的檔案修改了一點點東西
用最原始的方法去找!不過這樣子如果資料庫一大這樣漠無index的方法找真是會很慢且會耗主機的資源!
但是至少可以簡單地搜尋"許功"這類的字且不用加上"\"就可以搜尋到!
不過會連一些可能沒有相關的東也會列出來!
不過不去動search.php其他的部分!因此也搜尋完也可以跳頁!
ps.剛剛試了試這裡的搜尋,也已經可以跳頁了耶!
OOO
星球公民
星球公民
文章: 39
註冊時間: 2002-04-16 18:49

文章 OOO »

OOHOO 寫: 那些變數都在 includes/constant.php裡定義了
[php]<?php
// Table names
define('AUTH_ACCESS_TABLE', $table_prefix.'auth_access');
define('BANLIST_TABLE', $table_prefix.'banlist');
define('CATEGORIES_TABLE', $table_prefix.'categories');
define('CONFIG_TABLE', $table_prefix.'config');
define('DISALLOW_TABLE', $table_prefix.'disallow');
define('FORUMS_TABLE', $table_prefix.'forums');
define('GROUPS_TABLE', $table_prefix.'groups');
define('POSTS_TABLE', $table_prefix.'posts');
define('POSTS_TEXT_TABLE', $table_prefix.'posts_text');
define('PRIVMSGS_TABLE', $table_prefix.'privmsgs');
define('PRIVMSGS_TEXT_TABLE', $table_prefix.'privmsgs_text');
define('PRIVMSGS_IGNORE_TABLE', $table_prefix.'privmsgs_ignore');
define('PRUNE_TABLE', $table_prefix.'forum_prune');
define('RANKS_TABLE', $table_prefix.'ranks');
define('SEARCH_TABLE', $table_prefix.'search_results');
define('SEARCH_WORD_TABLE', $table_prefix.'search_wordlist');
define('SEARCH_MATCH_TABLE', $table_prefix.'search_wordmatch');
define('SESSIONS_TABLE', $table_prefix.'sessions');
define('SMILIES_TABLE', $table_prefix.'smilies');
define('THEMES_TABLE', $table_prefix.'themes');
define('THEMES_NAME_TABLE', $table_prefix.'themes_name');
define('TOPICS_TABLE', $table_prefix.'topics');
define('TOPICS_WATCH_TABLE', $table_prefix.'topics_watch');
define('USER_GROUP_TABLE', $table_prefix.'user_group');
define('USERS_TABLE', $table_prefix.'users');
define('WORDS_TABLE', $table_prefix.'words');
define('VOTE_DESC_TABLE', $table_prefix.'vote_desc');
define('VOTE_RESULTS_TABLE', $table_prefix.'vote_results');
define('VOTE_USERS_TABLE', $table_prefix.'vote_voters');
?>[/php]

他那個檔真的太長了.. 看的頭會昏, 不過你抓到重點了, 我當時可能是誤判\r
他所有INSERT的東作都是塞垃圾.. 所以把那些INSERT SEARCH... 的全刪\r
了^^".. 後來我又想過一次, 如果把所有 "," "." " "當作斷句的關鍵(可能再加一
些甚麼"的", "是")來切, 照著他們原本的邏輯, 中文應該也可以硬塞進去.. 不過
這又有另一個問題, 就是DB會爆增.. 真的是兩難@@".. 而且還要回過頭來處理
之前沒有index的文章... :-|
感謝
照這樣看來
[phpbb_search_wordlist],[phpbb_search_wordmatch]
這兩個TABLE就是索引
不過很奇怪的是\r

我先新增一篇標題和內文都是 DVD 的文章
在用原本的 search.php 來搜尋 DVD 這個關鍵字
結果只出現我新增的這篇
看起來很合理
可是我在[phpbb_search_wordlist]裡卻找不到DVD這個字...
讓我百思不解啊.....
OOO
星球公民
星球公民
文章: 39
註冊時間: 2002-04-16 18:49

文章 OOO »

OOHOO 寫:我找到了我誤砍的那段了... 換頁問題修復
打開修改過的search.php
找\r

代碼: 選擇全部

		unset($store_search_data);

	}


	//
	// Look up data ...
	//

難怪我昨天還原會失敗
原來就是沒注意到\r

代碼: 選擇全部

		unset($store_search_data);

	}
暫時先這樣用吧\r

至少他把結果存成一個 index 已經省很多資源了
總比我最早的寫法是換一頁又重新搜尋一次好>_<
oO]-[Oo
南宮博士
南宮博士
文章: 512
註冊時間: 2001-11-11 18:09
來自: TAIWAN
聯繫:

文章 oO]-[Oo »

嗯我剛改的檔案只有用到 'phpbb_search_results', 因為其他兩個table裡面有word_id.
中文笨笨搜尋用不到word_id
OOHOO said:
有事Mail給我, 不要P我, 因為根本沒辦法P.
oO]-[Oo
南宮博士
南宮博士
文章: 512
註冊時間: 2001-11-11 18:09
來自: TAIWAN
聯繫:

文章 oO]-[Oo »

我又烏龍了=_=, 還有一段更重要的沒加回去.. 刪無用資料的那段

找\r

代碼: 選擇全部

		//
		// Store new result data
		//
在上面插入\r

代碼: 選擇全部

		//
		// Finish building query (for all combinations)
		// and run it ...
		//
		$sql = "SELECT session_id 
			FROM " . SESSIONS_TABLE;
		if ( $result = $db->sql_query($sql) )
		{
			$delete_search_ids = array();
			while( $row = $db->sql_fetchrow($result) )
			{
				$delete_search_ids[] = "'" . $row['session_id'] . "'";
			}

			if ( count($delete_search_ids) )
			{
				$sql = "DELETE FROM " . SEARCH_TABLE . " 
					WHERE session_id NOT IN (" . implode(", ", $delete_search_ids) . ")";
				if ( !$result = $db->sql_query($sql) )
				{
					message_die(GENERAL_ERROR, 'Could not delete old search id sessions', '', __LINE__, __FILE__, $sql);
				}
			}
		}
歹勢歹勢...^^"
OOHOO said:
有事Mail給我, 不要P我, 因為根本沒辦法P.
oO]-[Oo
南宮博士
南宮博士
文章: 512
註冊時間: 2001-11-11 18:09
來自: TAIWAN
聯繫:

文章 oO]-[Oo »

kt 寫:有完整修訂的版本可以下載嗎?
降就不用改了 :-D
更新了 連結位置一樣

下個目標, 修復"許功加"爛字搜尋.. 剛試了一下.. =_= 改天了
OOHOO said:
有事Mail給我, 不要P我, 因為根本沒辦法P.
oO]-[Oo
南宮博士
南宮博士
文章: 512
註冊時間: 2001-11-11 18:09
來自: TAIWAN
聯繫:

文章 oO]-[Oo »

othree葛葛, 那個"屁股會長尾巴的字", 交給你了.. 我...@@"
OOHOO said:
有事Mail給我, 不要P我, 因為根本沒辦法P.
oO]-[Oo
南宮博士
南宮博士
文章: 512
註冊時間: 2001-11-11 18:09
來自: TAIWAN
聯繫:

文章 oO]-[Oo »

chihsun 寫:試試小弟的方法!
Line 276
[php]<?php
$match_word = ( !is_integer(strpos($split_search[$i], '*')) ? '%' . $split_search[$i] . '%' : str_replace("*", "%", $split_search[$i]) );

?>[/php]
改成
[php]<?php
$match_word = "%" . str_replace("*", "", $split_search[$i]) . "%";
$match_word = addslashes($match_word);
?>[/php]

這樣子就可以直接做"屁股會長尾巴的字"的搜尋了!
嗯.. 搞定.. 好爽 :mrgreen:
我把那兩句合在一起\r

代碼: 選擇全部

$match_word = addslashes("%" . str_replace("*", "", $split_search[$i]) . "%"); 
降子中文搜尋應該好很多了吧^^

(:Y) 給你加500 :mrgreen:

^^".. 今天下載過的人又要再抓一次了^^"... soli
OOHOO said:
有事Mail給我, 不要P我, 因為根本沒辦法P.
Scorpion
竹貓好朋友
竹貓好朋友
文章: 104
註冊時間: 2001-11-23 18:17
聯繫:

文章 Scorpion »

我昨天原本打了一些關於搜尋許功閱的修改方向,但是竹貓又讓我的瀏覽器當掉了,所以\r
就不想重想的!

我的想法是,既然「許功閱」這類字要加 \ 才能搜尋的到,表示這些字的斜線內碼被跳脫\r
了,必須使用 addslashes() 來補上斜線!

我也曾經看過 search.php,但是看不懂,無法確定加在哪一個搜尋的字串變數上,修改\r
好幾次都不成功,真是感謝 chihsun 提供的方法,原來是 $match_word 這個變數!

本來想偷偷解決掉,再來受萬民景仰,想不到這幾天竹貓來了幾位高手,風采被搶光了...
嗚嗚嗚 :D :D :D
chihsun
星球普通子民
星球普通子民
文章: 6
註冊時間: 2002-03-23 00:18
來自: 高雄
聯繫:

文章 chihsun »

只不過這個解決搜尋的辦法還是只能"全文搜索"
如果你的論壇太大!那就期望您的主機夠力…\r
不然如果很多人同時搜尋就累了 :)
至於為什麼要把"*"都弄掉並且前後都加上"%"
個人的想法是因為中文字根本沒有用空白字元做分隔
也就是每個字都是連在一起的!所以系統可能會將這樣的"中文"都當成一個字來看
所以只加一邊%還是沒辦法正確搜尋到!那就乾脆給他兩邊都來吧 :)
此外,那個加上反斜線的問題可能還是正體中文的弱點…有時只能強迫加上或去掉才能成功:)
上面這個版本是小弟在第一次收到這裡釋出的中文搜尋檔時,加上站長提供的訊息"要加上\才能搜尋許"所以參考站長釋出的版本modify了一下…\r
當時看站長的搜尋檔還一直覺得為什麼要把session處的那兩段給砍掉@_@
後來我自己的測試站上就試試不要砍(理由是那時沒時間去看那一段,只看了一下發覺根本沒有關於處理搜尋字串的部分!想說應該不砍應該沒有影響!
後來就看到有人回覆說沒辦法跳頁!再看了一下就覺得應該是這兩段的問題了!
接下來把中文字串放入index的工作就讓其他高人來努力了@_@
oO]-[Oo
南宮博士
南宮博士
文章: 512
註冊時間: 2001-11-11 18:09
來自: TAIWAN
聯繫:

文章 oO]-[Oo »

唉~ 又抓到一個BUG.. 就是 highlight 在遇到"許功加..等長尾巴的東西"會出現錯誤...
試驗方式, 尋找"許功加", 點進搜尋結果.. 錯誤訊息就會出現了
OOHOO said:
有事Mail給我, 不要P我, 因為根本沒辦法P.
頭像
andy
星球普通子民
星球普通子民
文章: 5
註冊時間: 2002-04-08 15:39
來自: 台東
聯繫:

文章 andy »

請問大大一下,我用新的search.php蓋過去舊的search.php後,中文搜尋是可以用了,可是搜尋出來的文章,最前面不是有一個folder的圖案,卻變成templates/subSilver/images/folder.gif文字了
請看此
請問為何會如此呢?
回覆文章

回到「2.0」