直接觀看文章

JDOM XPath 的 Namespace 處理

4 三月, 2010

JDOM 的 XPath 並沒有辦法處理含有 Namespace 的 XML Document 物件,這使得在處理 XML 資料時往往沒辦法用 XPath 來快速抓取節點,因為 selectSingleNode()/selectNodes() 取回來的物件或集合都為空,昨天發狠決定要找出解決的方式,總算這問題有解了。

深入閱讀…

Lucene 後分類功能

15 二月, 2010

全文檢索在實務上有許多不同的應用,例如查詢的相關度分數處理、查詢詞的相關提示字元、查詢結果的自動分群與相關詞、查詢結果排名與分數回饋等等,但真正最具有價值的算是查詢結果後分類這個功能,也就是所謂的 Faceted Search

Lucene 上,若也想要有查詢結果能依指定索引欄位進行後分類,那麼 Solr 會是最佳選擇,不必去碰底層的 Lucene,所有的查詢動作都透過 XML/JSON 等 HTTP 方式向 Search Server 查詢,並取回查詢結果,也支援 Faceted Search 功能。當然,要刻程式去呼叫 Search Server 也成,用 Solrj 沒有什麼事是辦不到的。

如果一切都想自己來而不想用 Solr 的話,那麼底層放 Lucene,一般的建索引跟查詢動作都沒問題,要後分類功能時,再補上 bobo-browse 套件就萬事俱備,照著網站提供的範例,就輕鬆擁有後分類的功能了,不過事情如果那麼單純就不會有這篇文的出現了。

深入閱讀…

Sphinx 與中文檢索

14 二月, 2010

MySQL 雖然本身有提供 全文檢索 的功能 (MyISAM engine),但無奈的是對於中文字元的處理仍停滯不前,要讓 MySQL 上的資料能進行中文全文檢索功能,最快的方式是接 Sphinx,那麼只要經過簡易的設定,便可以達成我們所要的目標。

前提是資料庫的 charset 設定理所當然必須是 utf8,然後修改 sphinx.conf 設定檔,在索引的設定區塊中設定該索引的 charset_type 為 utf-8、ngram_len 值設為 1、最後也是最重要的是設定 ngram_chars 值為如下︰

U+4E00..U+9FBB, U+3400..U+4DB5, U+20000..U+2A6D6, U+FA0E, U+FA0F, \
U+FA11, U+FA13, U+FA14, U+FA1F, U+FA21, U+FA23, U+FA24, U+FA27, U+FA28, U+FA29, \
U+3105..U+312C, U+31A0..U+31B7, U+3041, U+3043, U+3045, U+3047, U+3049, U+304B, \
U+304D, U+304F, U+3051, U+3053, U+3055, U+3057, U+3059, U+305B, U+305D, U+305F, \
U+3061, U+3063, U+3066, U+3068, U+306A..U+306F, U+3072, U+3075, U+3078, U+307B, \
U+307E..U+3083, U+3085, U+3087, U+3089..U+308E, U+3090..U+3093, U+30A1, U+30A3, \
U+30A5, U+30A7, U+30A9, U+30AD, U+30AF, U+30B3, U+30B5, U+30BB, U+30BD, U+30BF, \
U+30C1, U+30C3, U+30C4, U+30C6, U+30CA, U+30CB, U+30CD, U+30CE, U+30DE, U+30DF, \
U+30E1, U+30E2, U+30E3, U+30E5, U+30E7, U+30EE, U+30F0..U+30F3, U+30F5, U+30F6, \
U+31F0, U+31F1, U+31F2, U+31F3, U+31F4, U+31F5, U+31F6, U+31F7, U+31F8, U+31F9, \
U+31FA, U+31FB, U+31FC, U+31FD, U+31FE, U+31FF, U+AC00..U+D7A3, U+1100..U+1159, \
U+1161..U+11A2, U+11A8..U+11F9, U+A000..U+A48C, U+A492..U+A4C6

於是最後的 index 設定區塊應該要長得像下面範例一樣,並且重建索引後,中文字元的查詢才能 work︰


index test1
{
source = src1
path = C:/sphinx-0.9.9-win32/data/test1
docinfo = extern
charset_type = utf-8
morphology = none
ngram_len = 1
ngram_chars = U+4E00..U+9FBB, U+3400..U+4DB5, U+20000..U+2A6D6, U+FA0E, U+FA0F, \
U+FA11, U+FA13, U+FA14, U+FA1F, U+FA21, U+FA23, U+FA24, U+FA27, U+FA28, U+FA29, \
U+3105..U+312C, U+31A0..U+31B7, U+3041, U+3043, U+3045, U+3047, U+3049, U+304B, \
U+304D, U+304F, U+3051, U+3053, U+3055, U+3057, U+3059, U+305B, U+305D, U+305F, \
U+3061, U+3063, U+3066, U+3068, U+306A..U+306F, U+3072, U+3075, U+3078, U+307B, \
U+307E..U+3083, U+3085, U+3087, U+3089..U+308E, U+3090..U+3093, U+30A1, U+30A3, \
U+30A5, U+30A7, U+30A9, U+30AD, U+30AF, U+30B3, U+30B5, U+30BB, U+30BD, U+30BF, \
U+30C1, U+30C3, U+30C4, U+30C6, U+30CA, U+30CB, U+30CD, U+30CE, U+30DE, U+30DF, \
U+30E1, U+30E2, U+30E3, U+30E5, U+30E7, U+30EE, U+30F0..U+30F3, U+30F5, U+30F6, \
U+31F0, U+31F1, U+31F2, U+31F3, U+31F4, U+31F5, U+31F6, U+31F7, U+31F8, U+31F9, \
U+31FA, U+31FB, U+31FC, U+31FD, U+31FE, U+31FF, U+AC00..U+D7A3, U+1100..U+1159, \
U+1161..U+11A2, U+11A8..U+11F9, U+A000..U+A48C, U+A492..U+A4C6
}

雖然也有人 提到 設定 charset_table 的值,不過在我自己 local 的測試上面的設定檔便夠用了。

在 IIS7 顯示 ASP 錯誤訊息

2 八月, 2009

在 IIS5/IIS6 時寫 classic asp code 如果發生錯誤 IIS 會直接將錯誤原因顯示出來,長久以來都習慣這樣的方式進行除錯;然而到了 Windows Server 2008 的時代,IIS7 預設就會做程式碼的安全保護,也就是程式發生錯誤時只會丟這樣的訊息︰

An error occurred on the server when processing the URL. Please contact the system administrator

不過還是得想辦法知道問題原因才能修正程式,可以透過在 cmd 執行如下的指令︰

%windir%\system32\inetsrv\appcmd set config -section:asp -scriptErrorSentToBrowser:true

設定 scriptErrorSentToBrowser 為 true 時,IIS7 的處理行為就會回到 5/6 時一樣錯在哪為什麼錯統統都會告訴你。這次的狀況因為系統已經裝在正式環境上,所以修正完程式後便馬上改回 false 避免有安全性的問題。

相關文章︰Classic ASP: Security is Painful

結束的時候總要來一下的曲: Appalachian Springs

11 七月, 2009