看板 Database 關於我們 聯絡資訊
※ 引述《statue (statue)》之銘言: : ※ 引述《zhman (閒閒的人)》之銘言: : : MySQL的全文檢索我想並不適合用,尤其是中文的資料,雖然網頁上是講得很好聽,不過試了就知道. : : 如果你的資料是有特別的結構或pattern,那也許有其他更好的方法. : : 我這裡提供一個簡單的一般化方法,就是自己實作index,透過cache的方式. : : 1.開一個新的table,包含2個欄位:(key,id),key就是會被查詢的keyword,id則是對應record的primary key. : : 2.每次查詢就先查這個table,有資料,那很幸運,你很快就有結果了. : : 3.沒資料,就重做你原來的like查詢,再把結果insert到這個table中,下次就可以用. : 這個其實有做了, 不過大家亂打的機率很大, : 所以其實重複 match 查詢字串的機率小的可憐.. : : 基本假設是你只想知道某個keyword是存在某筆record.其他更詳細的查詢,則需再做其他的變化. : : 如果你有一些keywords,那可以預先insert一些資料,也可以增加效率. : : 一旦資料有做更新時,也需要一併keyword的table,如果更新頻繁的話,那你可要考量一下時間成本. : 這邊有點太高深了, 看不太懂.... : fulltext 其實我有試過, 但是我做了 FULLTEXT 後, 他顯示的組別只有一組... : 所以不管怎麼查的結果都是空的... : 而這個查詢在我的網站上平均會消耗 1-2 秒的時間, 其他的查詢都能利用 index .. : 對中文的查詢該怎麼做才能加速呢.. 我想先說的是,要時間就要用空間來換. 而你的查詢平均只用了1-2秒,我以為以一般使用來說不算長了. 在資料庫版,所以只探討資料庫能做的事. 以你的實例,命中率過低,以這個方法來說,你能做的就是我所說的,預先insert一些keywords. 資料庫能加速,靠的就是預先準備好資料讓你讀,也就是index的功能. 如果都沒有準備好,是不會平白無故變快的.你準備的資料不夠,所以命中率會低. 而你的這種查詢,一般化的資料庫是沒辦法做index的. 就你前面的例子來說,"怒氣藥水",請問你的user有人會查"氣藥"嗎? 如果不會,那你可以分析一下,對你的資料內容來說, 怎樣的文字才會是一個keyword,怎樣的不會. 如果你可以掌握你的keyword是什麼樣子,就應該預先把符合pattern的keyword放進資料庫. 也許會耗費許多空間,但如果增加的效率你覺得值得,那就值得. (一般我們會把pattern弄得寬鬆一點, 使得不浪費太多空間,又能增加更多可能合理的關鍵字) 當然,你也可以把所有的文字組合都放進去XD. MySQL的fulltext,我沒看過原始碼,不過以我的經驗,它應該不是精確的搜尋方式, 所以你會有一些東西查不出來,感覺上有點半調子. 尤其對中文來說,根本搞不清楚它的索引邏輯,所以我不建議使用. 那就只能靠自己用其他方法來完成囉. 如果很計較速度,其實就不該依賴一般化的資料庫,而是自己規劃檔案結構,自己存取檔案. 資料庫只是易於使用,可沒說會比較快呀. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.60.106.5