2010年11月15日 星期一

FreeBSD基本及重要指令集

FreeBSD基本及重要指令集





1.指令名稱:man
使用方法:man 預查詢的指令名
功能說明:查詢該指令的詳細用法,有時還可查詢一些非指令的東西

2. 指令名稱:ls (dir)
使用方法:ls 資料夾名
功能說明:觀看指定資料夾下檔案列表,如不加資料夾名則列出目前資料夾
參數說明:-l 功能等同ll 可看到檔案及權限相關資料
-a 列出範圍包含隱藏檔 (剩下的自己man)
補充說明: ls -l 的輸出結果:
drwxr-xr-x 1 oamite oamite 512 Dec 20 20:00 public_html
-rwxr--r-- 2 oamite oamite 12345 Dec 31 15:50 test
前面10個字元依序代表
第1個字元:檔案屬性(d是資料夾;l 是連結;- 一般檔案)
第2~4個字元:擁有者權限(r 讀取;w寫入;x 執行)
第5~7個字元:群組使用者權限
第8~10個字元:其他使用者權限
接著後面的英文字依序為 擁有者 擁有群組(例子裡都是oamite)
再來接的數字為檔案大小;其次為最後修改日期
最後面接的就是檔名了!(如果是捷徑還會所指向的目的)

3.指令名稱:cd (chdir)
使用方法:cd 欲前往的資料夾名
功能說明:前往指定資料夾,如不加資料夾名會到自己的家目錄下
補充說明:資料夾名的二三事
cd /usr/local
這種以 / 開頭的是指從跟目錄開始算的絕對路徑
cd ~oamite/public_html
這種以 ~ 開頭的是指從後接的使用者家目錄開始算的絕對路徑
cd ../
這種以 .. 開頭的是從目前資料夾的上層資料夾開始算的絕對路徑
cd ./public_html/
這種以 . 開頭的表示從目前資料夾開始算起的絕對路徑
cd test/lala/
像這種沒特殊開頭的就是相對於現在位置的相對路徑
4.指令名稱:pwd
使用方法:pwd
功能說明:顯示目前所在的資料夾目錄位置(以根目錄為基準)

5. 指令名稱:cp
使用方法:cp 檔案 目標資料夾
功能說明:複製指定檔案到目標資料夾
參數說明:如需複製資料夾請加參數-R (FreeBSD 5版以後可用 –r )

6. 指令名稱:mv
使用方法:mv 檔案名 目標資料夾 (搬移檔案)
mv 檔案 新檔案名 或 mv 資料夾 新資料夾名 (更名檔案)
功能說明:移動指定檔案到目標資料夾或重新命名檔案或資料夾

7. 指令名稱:rm
使用方法:rm 檔案名
功能說明:刪除指定檔案(永遠都救不回)
參數說明:刪除資料夾 –R (FreeBSD 5版以後可用 –r)

8. 指令名稱:mkdir
使用方法:mkdir 新資料夾名
功能說明:建立指定名稱的資料夾

9. 指令名稱:rmdir
使用方法:rmdir 資料夾名
功能說明:刪除指定名稱的空資料夾(一定要是空資料夾)

10. 指令名稱:cat
使用方法:cat 檔案名
功能說明:將檔案內容直接輸出在標準輸出裝置(就是螢幕)上

11. 指令名稱:ln
使用方法:ln –s 檔案 目標資料夾
功能說明:建立檔案捷徑在目標資料夾,請一律加參數 -s

12. 指令名稱:chown
使用方法:chown 新擁有者:群組名 檔案名(或資料夾名)
功能說明:變更指定檔案或資料夾擁有者和工作群組(必須擁有足夠權限)

13. 指令名稱:chmod
使用方法:chmod 權限設定 檔案名(或資料夾名)
功能說明:改變檔案的相關存取權限
補充說明:權限設定
權限設定的方法約可分為3種
第一.數字 eg.644
第二.加減某個權限 eg.+X
第三.設定某個範圍的權限 eg. u=rwx,go=rx

14. 指令名稱:more
使用方法:more 檔案名
功能說明:純文字分頁瀏覽器,當捲軸捲到最下方時自動跳出

15. 指令名稱:less
使用方法:less 檔案名
功能說明:純文字分頁瀏覽器,只有按q才能跳出

16. 指令名稱:ee
使用方法:ee 檔名
功能說明:文字編輯器,如檔名不建立新檔,如新檔內無任何文字則放棄檔案

17. 指令名稱:su
使用方法:su 使用者
功能說明:變更目前使用者(必須知道欲變成的使用者密碼)
如沒有加欲變成的使用者則視為su root (su root 須在wheel群組)

18. 指令名稱:exit logout
使用方法:直接使用
功能說明:登出(上述兩個指令擇一即可)

19指令名稱:make
使用方法:make 檔名
功能說明:用c語言的編譯器編譯c原始碼

20. 指令名稱:make
使用方法:make 參數
功能說明:在 /usr/ports/ 裡安裝軟體的指令
補充說明:參數
install 安裝目前資料夾的軟體
deinstall 解除安裝目前資料夾的軟體
clean 清除因為安裝此軟體的暫存檔案
其他參數 直接影響Makefile內的參數值並安裝軟體

21. 指令名稱:df
使用方法:df
功能說明:列出磁區的使用狀況

22. 指令名稱:ps
使用方法:ps -aux
功能說明:列出所有使用中的access,不加參數(-aux)則指列出由自己所使用的

23. 指令名稱:top
使用方法:top
功能說明:列出使用中的access並動態更新,要跳出請按 ^C

24. 指令名稱:du
使用方法:du
功能說明:列出所有樹狀子資料夾

25. 指令名稱:kill
使用方法:kill PID
功能說明:砍除該PID的access

26. 指令名稱:chflags
使用方法:chflags 參數 旗標 檔案
功能說明:開啟或關閉檔案的保護旗標,僅能由root使用,詳情自己man
開啟保護後root 也不能更動該檔,除非先關閉保護

27. 指令名稱:ping
使用方法:ping ip (or domain)
功能說明:丟出ICMP封包並等待回覆,以測試網路是否順暢

28. 指令名稱:ifconfig
使用方法:ifconfig
功能說明:列出網路的相關軟硬體狀態 (加參數可修改開啟關閉網路)

29. 指令名稱:shutdown
使用方法:shutdown 參數 時間 (警告訊息)
功能說明:依照參數執行關機的相關事宜,只有root才能用
關閉系統:shutdown –p 0602280000 System will be closed
重開機 :shutdown –r now
踢除除了自己以外的所有使用者:shutdown –k now

30. 指令名稱:reboot
使用方法:reboot
功能說明:立即重開機,只有root能使用

31. 指令名稱:tar
使用方法:tar 參數 完成後的檔名 目標檔名
功能說明:壓縮或解壓縮檔案 參數v可看見過程
壓縮參數 cfz
解壓縮參數 xfz

32. 指令名稱:passwd
使用方法:passwd
功能說明:更改密碼,系統會先要求一次舊密碼,然後兩次新密碼

33. 指令名稱:sockstat
使用方法:sockstat
功能說明:列出開啟中的socket

34. 指令名稱:zcat
使用方法:zcat 由排程壓縮的檔名
功能說明:觀看由排程所壓縮的檔案內容

35. 指令名稱:touch
使用方法:touch 檔名
功能說明:開啟新檔,加參數-t可更改檔案建立日期

36. 指令名稱:adduser rmuser
使用方法:直接使用
功能說明:新增或刪除使用者,會有一步步的說明


37. 指令名稱:date
使用方法:date (yyyyMMddhhmm)
功能說明:列出系統目前時間及時區,加上時間可修改時間

38. 指令名稱:cal
使用方法:cal
功能說明:列出月曆

39. 指令名稱:echo
使用方法:echo string
功能說明:輸出字串至標準輸出

40. 指令名稱:clear
使用方法:clear
功能說明:清除螢幕

41. 指令名稱:systat
使用方法:systat -vm
功能說明:顯示並動態更新所有系統資訊

42. 指令名稱:bg
使用方法:將某指令下達後,按^Z暫停程式,然後再按bg即可丟到背景執行
功能說明:將被暫停的程序丟到背景繼續執行

43. 指令名稱:jobs
使用方法:jobs
功能說明:顯示被丟入在背景執行的所有程序

44. 指令名稱:fg
使用方法:fg %number
功能說明:叫回第number個程序至前景執行

45. 指令名稱:last
使用方法:last
功能說明:列出最近一星期使用者登入狀況


46. 指令名稱:uptime
使用方法:uptime
功能說明:顯示系統開機主機狀況

47. 指令名稱:id
使用方法:id 使用者
功能說明:顯示該使用者的uid gid 和群組,如沒家使用者則列出自己

48. 指令名稱:whereis
使用方法:whereis string
功能說明:用來搜尋檔名符合string的原始碼檔二進位檔或說明檔

49. 指令名稱:find
使用方法:find 資料夾 –name 檔名
功能說明:在資料夾及其子資料夾下搜尋 (還有其他好用參數,詳情請man find)

50. 指令名稱:grep
使用方法:grep 搜尋字串 檔名
功能說明:在檔案內搜尋字串

51. 指令名稱:fsck
使用方法:fsck 磁區名
功能說明:檢查並修復磁區

52. 指令名稱:mount
使用方法:mount磁區名
功能說明:掛載磁區

53. 指令名稱:umount
使用方法:umount磁區名
功能說明:卸載磁區

54. 指令名稱:netstat
使用方法:netstat
功能說明:顯示網路連線狀況

 


FreeBSD基本及重要指令集

FreeBSD基本及重要指令集





1.指令名稱:man
使用方法:man 預查詢的指令名
功能說明:查詢該指令的詳細用法,有時還可查詢一些非指令的東西

2. 指令名稱:ls (dir)
使用方法:ls 資料夾名
功能說明:觀看指定資料夾下檔案列表,如不加資料夾名則列出目前資料夾
參數說明:-l 功能等同ll 可看到檔案及權限相關資料
-a 列出範圍包含隱藏檔 (剩下的自己man)
補充說明: ls -l 的輸出結果:
drwxr-xr-x 1 oamite oamite 512 Dec 20 20:00 public_html
-rwxr--r-- 2 oamite oamite 12345 Dec 31 15:50 test
前面10個字元依序代表
第1個字元:檔案屬性(d是資料夾;l 是連結;- 一般檔案)
第2~4個字元:擁有者權限(r 讀取;w寫入;x 執行)
第5~7個字元:群組使用者權限
第8~10個字元:其他使用者權限
接著後面的英文字依序為 擁有者 擁有群組(例子裡都是oamite)
再來接的數字為檔案大小;其次為最後修改日期
最後面接的就是檔名了!(如果是捷徑還會所指向的目的)

3.指令名稱:cd (chdir)
使用方法:cd 欲前往的資料夾名
功能說明:前往指定資料夾,如不加資料夾名會到自己的家目錄下
補充說明:資料夾名的二三事
cd /usr/local
這種以 / 開頭的是指從跟目錄開始算的絕對路徑
cd ~oamite/public_html
這種以 ~ 開頭的是指從後接的使用者家目錄開始算的絕對路徑
cd ../
這種以 .. 開頭的是從目前資料夾的上層資料夾開始算的絕對路徑
cd ./public_html/
這種以 . 開頭的表示從目前資料夾開始算起的絕對路徑
cd test/lala/
像這種沒特殊開頭的就是相對於現在位置的相對路徑
4.指令名稱:pwd
使用方法:pwd
功能說明:顯示目前所在的資料夾目錄位置(以根目錄為基準)

5. 指令名稱:cp
使用方法:cp 檔案 目標資料夾
功能說明:複製指定檔案到目標資料夾
參數說明:如需複製資料夾請加參數-R (FreeBSD 5版以後可用 –r )

6. 指令名稱:mv
使用方法:mv 檔案名 目標資料夾 (搬移檔案)
mv 檔案 新檔案名 或 mv 資料夾 新資料夾名 (更名檔案)
功能說明:移動指定檔案到目標資料夾或重新命名檔案或資料夾

7. 指令名稱:rm
使用方法:rm 檔案名
功能說明:刪除指定檔案(永遠都救不回)
參數說明:刪除資料夾 –R (FreeBSD 5版以後可用 –r)

8. 指令名稱:mkdir
使用方法:mkdir 新資料夾名
功能說明:建立指定名稱的資料夾

9. 指令名稱:rmdir
使用方法:rmdir 資料夾名
功能說明:刪除指定名稱的空資料夾(一定要是空資料夾)

10. 指令名稱:cat
使用方法:cat 檔案名
功能說明:將檔案內容直接輸出在標準輸出裝置(就是螢幕)上

11. 指令名稱:ln
使用方法:ln –s 檔案 目標資料夾
功能說明:建立檔案捷徑在目標資料夾,請一律加參數 -s

12. 指令名稱:chown
使用方法:chown 新擁有者:群組名 檔案名(或資料夾名)
功能說明:變更指定檔案或資料夾擁有者和工作群組(必須擁有足夠權限)

13. 指令名稱:chmod
使用方法:chmod 權限設定 檔案名(或資料夾名)
功能說明:改變檔案的相關存取權限
補充說明:權限設定
權限設定的方法約可分為3種
第一.數字 eg.644
第二.加減某個權限 eg.+X
第三.設定某個範圍的權限 eg. u=rwx,go=rx

14. 指令名稱:more
使用方法:more 檔案名
功能說明:純文字分頁瀏覽器,當捲軸捲到最下方時自動跳出

15. 指令名稱:less
使用方法:less 檔案名
功能說明:純文字分頁瀏覽器,只有按q才能跳出

16. 指令名稱:ee
使用方法:ee 檔名
功能說明:文字編輯器,如檔名不建立新檔,如新檔內無任何文字則放棄檔案

17. 指令名稱:su
使用方法:su 使用者
功能說明:變更目前使用者(必須知道欲變成的使用者密碼)
如沒有加欲變成的使用者則視為su root (su root 須在wheel群組)

18. 指令名稱:exit logout
使用方法:直接使用
功能說明:登出(上述兩個指令擇一即可)

19指令名稱:make
使用方法:make 檔名
功能說明:用c語言的編譯器編譯c原始碼

20. 指令名稱:make
使用方法:make 參數
功能說明:在 /usr/ports/ 裡安裝軟體的指令
補充說明:參數
install 安裝目前資料夾的軟體
deinstall 解除安裝目前資料夾的軟體
clean 清除因為安裝此軟體的暫存檔案
其他參數 直接影響Makefile內的參數值並安裝軟體

21. 指令名稱:df
使用方法:df
功能說明:列出磁區的使用狀況

22. 指令名稱:ps
使用方法:ps -aux
功能說明:列出所有使用中的access,不加參數(-aux)則指列出由自己所使用的

23. 指令名稱:top
使用方法:top
功能說明:列出使用中的access並動態更新,要跳出請按 ^C

24. 指令名稱:du
使用方法:du
功能說明:列出所有樹狀子資料夾

25. 指令名稱:kill
使用方法:kill PID
功能說明:砍除該PID的access

26. 指令名稱:chflags
使用方法:chflags 參數 旗標 檔案
功能說明:開啟或關閉檔案的保護旗標,僅能由root使用,詳情自己man
開啟保護後root 也不能更動該檔,除非先關閉保護

27. 指令名稱:ping
使用方法:ping ip (or domain)
功能說明:丟出ICMP封包並等待回覆,以測試網路是否順暢

28. 指令名稱:ifconfig
使用方法:ifconfig
功能說明:列出網路的相關軟硬體狀態 (加參數可修改開啟關閉網路)

29. 指令名稱:shutdown
使用方法:shutdown 參數 時間 (警告訊息)
功能說明:依照參數執行關機的相關事宜,只有root才能用
關閉系統:shutdown –p 0602280000 System will be closed
重開機 :shutdown –r now
踢除除了自己以外的所有使用者:shutdown –k now

30. 指令名稱:reboot
使用方法:reboot
功能說明:立即重開機,只有root能使用

31. 指令名稱:tar
使用方法:tar 參數 完成後的檔名 目標檔名
功能說明:壓縮或解壓縮檔案 參數v可看見過程
壓縮參數 cfz
解壓縮參數 xfz

32. 指令名稱:passwd
使用方法:passwd
功能說明:更改密碼,系統會先要求一次舊密碼,然後兩次新密碼

33. 指令名稱:sockstat
使用方法:sockstat
功能說明:列出開啟中的socket

34. 指令名稱:zcat
使用方法:zcat 由排程壓縮的檔名
功能說明:觀看由排程所壓縮的檔案內容

35. 指令名稱:touch
使用方法:touch 檔名
功能說明:開啟新檔,加參數-t可更改檔案建立日期

36. 指令名稱:adduser rmuser
使用方法:直接使用
功能說明:新增或刪除使用者,會有一步步的說明


37. 指令名稱:date
使用方法:date (yyyyMMddhhmm)
功能說明:列出系統目前時間及時區,加上時間可修改時間

38. 指令名稱:cal
使用方法:cal
功能說明:列出月曆

39. 指令名稱:echo
使用方法:echo string
功能說明:輸出字串至標準輸出

40. 指令名稱:clear
使用方法:clear
功能說明:清除螢幕

41. 指令名稱:systat
使用方法:systat -vm
功能說明:顯示並動態更新所有系統資訊

42. 指令名稱:bg
使用方法:將某指令下達後,按^Z暫停程式,然後再按bg即可丟到背景執行
功能說明:將被暫停的程序丟到背景繼續執行

43. 指令名稱:jobs
使用方法:jobs
功能說明:顯示被丟入在背景執行的所有程序

44. 指令名稱:fg
使用方法:fg %number
功能說明:叫回第number個程序至前景執行

45. 指令名稱:last
使用方法:last
功能說明:列出最近一星期使用者登入狀況


46. 指令名稱:uptime
使用方法:uptime
功能說明:顯示系統開機主機狀況

47. 指令名稱:id
使用方法:id 使用者
功能說明:顯示該使用者的uid gid 和群組,如沒家使用者則列出自己

48. 指令名稱:whereis
使用方法:whereis string
功能說明:用來搜尋檔名符合string的原始碼檔二進位檔或說明檔

49. 指令名稱:find
使用方法:find 資料夾 –name 檔名
功能說明:在資料夾及其子資料夾下搜尋 (還有其他好用參數,詳情請man find)

50. 指令名稱:grep
使用方法:grep 搜尋字串 檔名
功能說明:在檔案內搜尋字串

51. 指令名稱:fsck
使用方法:fsck 磁區名
功能說明:檢查並修復磁區

52. 指令名稱:mount
使用方法:mount磁區名
功能說明:掛載磁區

53. 指令名稱:umount
使用方法:umount磁區名
功能說明:卸載磁區

54. 指令名稱:netstat
使用方法:netstat
功能說明:顯示網路連線狀況

 


2010年11月14日 星期日

MySQL JOIN

对于不支持全连接full join 的数据库,可以使用,

select a.col1,a.col2,b.col3 from tab1 a left [outer] join tab2 b on a.pk_tab1 = b.pk_tab1

union all

select a.col1,a.col2,b.col3 from tab1 a right [outer] join tab2 b on a.pk_tab1 = b.pk_tab1

 


MySQL JOIN

对于不支持全连接full join 的数据库,可以使用,

select a.col1,a.col2,b.col3 from tab1 a left [outer] join tab2 b on a.pk_tab1 = b.pk_tab1

union all

select a.col1,a.col2,b.col3 from tab1 a right [outer] join tab2 b on a.pk_tab1 = b.pk_tab1

 


MySQL 全文索引搜尋 Fulltext Index Search

http://www.sosauce.com/entry/6444/mysql%E5%85%A8%E6%96%87%E7%B4%A2%E5%BC%95%E8%88%87%E6%90%9C%E5%B0%8B/


http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html


http://onlamp.com/onlamp/2003/06/26/fulltext.html


http://hi.baidu.com/gazi/blog/item/ebbd2e73f29fb2198701b0c5.html


 



  • (玩半天,結果不支援中文!)

  • MySQL從3.23.23開始就逐漸支援全文索引和搜尋。

    • 全文索引就是建index,全文搜尋就是去查index。

    • LIKE是用Regular Expression去做查詢。



  • MySQL全文索引是一種index type:FULLTEXT。

  • 全文索引的index只能用在MyISAM表格的char、varchar和text的欄位上。 

  • 全文索引的index可以在create table、alter table和create index時產生。

    • create table...





CREATE TABLE article (
   id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
    title VARCHAR(200),
    body TEXT,
    FULLTEXT(title, body)
) TYPE=MYISAM;



  •  

    • alter table...

    • create index...



  • 要倒大量的資料到有全文索引index的table速度會很慢,建議先拿掉全文索引index再倒資料,倒完後再加上全文索引index。

  • 全文搜尋的語法:


MATCH (col1, col2,...) AGAINST (expr [search_modifier])


  • 三種搜尋方式:

    • IN BOOLEAN MODE

    • IN NATURAL LANGUAGE MODE

    • IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION / WITH QUERY EXPANSION



  • IN NATURAL LANGUAGE MODE

    • expr就是要搜尋的字串。

    • 沒有特殊字元。

    • 套用Stopwords。


    • 除一半row以上都有的字,譬如說,每個row都有mysql這個字的話,那用mysql去查時,會找不到任何row,這在row的數量無敵多時很有用,
      因為把所有row都找出來是沒有意義的,這時,mysql幾乎被當作是stopword;但是當row只有兩筆時,是啥鬼也查不出來的,因為每個字都出現
      50%以上,要避免這種狀況,請用IN BOOLEAN MODE。

    • 預設的搜尋方式。





SELECT *
FROM article
WHERE MATCH(title, body)
AGAINST ('xxx' IN NATURAL LANGUAGE MODE);



  •  

    • 預設搜尋是不分大小寫,若要分大小寫,columne的character set要從utf8改成utf8_bin。

    • 預設MATCH...AGAINST是以相關性排序,由高到低。

    • MATCH...AGAINST可以跟所有MySQL語法搭配使用,像是JOIN或是加上其他過濾條件。





-- 第一種count
SELECT COUNT(*)
FROM article
WHERE MATCH(title, body)
AGAINST ('xxx' IN NATURAL LANGUAGE MODE);

-- 第二種count
SELECT COUNT(IF(MATCH(title, body) AGAINST ('xxx' IN NATURAL LANGUAGE MODE), 1, NULL)) AS count
FROM article



  •  

    • 當符合的筆數較多時,第一種count比較慢,因為MATCH...AGAINST會先依相關性排序。

    • 當符合的筆數較少時,第二種count比較慢,因為第二種count會掃過所有資料。

    • MATCH(title,
      body)裡的欄位必須和FULLTEXT(title,
      body)裡的欄位一模一樣,如果只要單查title或body一個欄位,那得另外再建一個FULLTEXT(title)或
      FULLTEXT(body),也因為如此,MATCH()的欄位一定不能跨table,但是另外兩種搜尋方式好像可以。





SELECT id, MATCH(title, body) AGAINST ('xxx' IN NATURAL LANGUAGE MODE) as score
FROM article;



  •  

    • 這樣可以取得相關值,而且也因為沒有WHERE和ORDER BY,所以不會排序。





SELECT id, MATCH(title, body) AGAINST ('xxx' IN NATURAL LANGUAGE MODE) as score
FROM article
WHERE MATCH(title, body)
AGAINST ('xxx' IN NATURAL LANGUAGE MODE);



  •  

    • 排序又取得相關性,雖然MATCH...AGAINST用了兩次,但是MySQL知道這兩個MATCH...AGAINST是一樣的,所以只會用一次。





SELECT id, MATCH(title, body) AGAINST ('xxx' IN NATURAL LANGUAGE MODE) as score
FROM article
ORDER BY score desc;



  •  

    • 為啥不這樣用就好?

    • MySQL的FULLTEXT怎麼斷字:

      • 字母、數字、底線的組合視為一個字,不會把底線斷字。

      • 會被斷字的字元:空白、逗號(,)與點(.),但不用這些斷字的語言,如中文,就得自行手動斷字。

      • 可以自行實做一個斷字的外掛來取代內建的斷字parser。

      • 接受一個單引號,如aaa'bbb視為一個字,但是aaa''bbb就是兩個字。

      • 字首或字尾的單引號會被去掉,如'aaa或aaa'。



    • 全文搜尋時,stopword與少於四個字元的字串會被忽略。

      • 可以覆寫內建的stopword清單。

      • 可以修改最少四個字元的設定。







  • IN BOOLEAN MODE

    • expr裡有特殊字元輔助特殊的搜尋語法。





SELECT *
FROM article
WHERE MATCH(title, body)
AGAINST ('+mysql -yoursql' IN BOOLEAN MODE);



  •  

    • 一定要有msysql,且不要有yoursql。

    • IN BOOLEAN MODE的特色:

      • 不剔除50%以上符合的row。

      • 不自動以相關性反向排序。

      • 可以對沒有FULLTEXT index的欄位進行搜尋,但會非常慢。

      • 限制最長與最短的字串。

      • 套用Stopwords。



    • 搜尋語法:

      • +:一定要有。

      • -:不可以有,但這個「不可以有」指的是在符合的row裡不可以有指定的字串,所以不能只下「-yoursql」這樣是查不到任何row的,必須搭配其他語法使用。

      • :(什麼都沒)預設用法,表示可有可無,有的話排比較前面,沒有的排後面。

      • >:提高該字的相關性。

      • <:降低相關性。

      • ( ):條件可以巢狀。








+aaa +(>bbb <ccc) // 找到有aaa和bbb,或者aaa和ccc,然後aaa&bbb排在aaa&ccc前面




  •  

    •  

      • ~:將其相關性由正轉負,表示擁有該字會降低相關性,但不像「-」將之排除,只是排在較後面。

      • *:萬用字,不像其他語法放在前面,這個要接在字串後面。

      • " ":用雙引號將一段句子包起來表示要完全相符,不可拆字。







  • IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION

    • 也可以用WITH QUERY EXPANSION。

    • IN NATURAL LANGUAGE MODE的衍生版。

    • 先用IN NATURAL LANGUAGE MODE做搜尋,得到最相關的欄位的字再加到原expr裡,再查一次。

    • 神奇功能之一:可以用database查出mysql或oracle,第一次查詢用databae得到一些結果,從這些結果裡抽取字串,此時得到mysql與oracle的機率相當高,最後用database和這些出取出來的字串做一次查詢。

    • 神奇功能之二:無法拼出正確字串時,第一次用「相似」的錯誤字串查詢,很有可以得到正確的字串,再用正確的字串急可以得到想要的結果。

    • 因為這種查詢方式會讓「雜訊」爆增,所以建議第一次的查詢字串盡量精簡。



  • Stopwords請參考http://dev.mysql.com/doc/refman/5.1/en/fulltext-stopwords.html

  • 全文搜尋的限制:

    • 只能用在MyISAM表格上。

    • 支援UTF-8。

    • 中文支援問題:

      • MySQL不會斷中文字:MySQL內建的字依據是空白、逗號和點,對此內建機制的白痴解法是,存中文字時自行塞入空白斷字,但是還是有下面的限制。

      • 查詢字串最少四個字元的限制:所以一二三個中文字都不能查,必須將ft_min_word_len從預設的4改成1。



    • 雖然同一個表格可以有不同字元集的欄位,但是同一個FULLTEXT index裡的欄位必須是同一個字元集與collation。

    • MATCH裡的欄位必須和FULLTEXT裡的一模一樣,IN BOOLEAN MODE允許不一樣,甚至使用未FULLTEXT index的欄位,但速度很慢。

    • AGAINST裡必須是字串,不可以是變數或欄位名稱。

    • 全文搜尋使index hint受限。



  • MySQL全文搜尋設定:

    • 大部分的參數都是啟動參數,也就是修改後必須重新啟動MySQL。

    • 有些參數修改必須重新產生索引檔。





mysql> SHOW VARIABLES LIKE 'ft%';

ft_boolean_syntax    + -><()~*:""&|
ft_min_word_len    4
ft_max_word_len    84
ft_query_expansion_limit   20 ft_stopword_file    (built-in)




  •  

    • ft_min_word_len:最短的索引字串,預設值為4,修改後必須重建索引檔。

    • ft_max_word_len:最長的索引字串,預設值因版本而不同,餘同上一點。





[mysqld]
ft_min_word_len=1



  •  

    • ft_stopword_file:stopword檔案路徑,若留空白不設定表示要停用stopword過濾,修改後必須重新啟動MySQL和重建索引;stopword檔案內容可以用分行空白與逗號區隔stopword,但底線和單引號視為合法的字串字元。

    • 50%
      的門檻限制:設定檔在storage/myisam/ftdefs.h,將 #define GWS_IN_USE GWS_PROB 改為
      #define GWS_IN_USE GWS_FREQ,然後重新編譯MySQL,因為近低門檻會影響資料的精準度,所以不建議如此,可用IN
      BOOLEAN MODE即可以避開50%的限制。

    • ft_boolean_syntax:改變IN BOOLEAN MODE的查詢字元,不用重新啟動MySQL也不用重建索引。

    • 修改字串字元的認定,譬如說將「-」認定為字串的合法字元:

      • 方法一:修改storage/myisam/ftdefs.h的true_word_char()與misc_word_char(),然後重新編譯MySQL,最後重建索引。

      • 方法二:修改字元集檔,然後在FULLTEXT index的欄位使用該字元集,最後重建索引。



    • 重建索引:

      • 每個有FULLTEXT index的表格都要這麼做。






mysql> REPAIR TABLE tbl_name QUICK;


  •  

    •  

      • 要注意如果用過myisamchk,會導致上述的設定值回覆成預設值,因為myisamchk不是用MySQL的設定值。

      • 解法一:將修改過得設定值加到myisamchk的參數裡。






shell> myisamchk --recover --ft_min_word_len=1 tbl_name.MYI


  •  

    •  

      • 解法二:兩邊都要設定。






[mysqld]
ft_min_word_len=1
[myisamchk]
ft_min_word_len=1


  •  

    •  

      • 解法三:用REPAIR TABLE、ANALYZE TABLE、OPTIMIZE TABLE與ALTER TABLE取代myisamchk語法,因為這些語法是由MySQL執行的。






 


MySQL 全文索引搜尋 Fulltext Index Search

http://www.sosauce.com/entry/6444/mysql%E5%85%A8%E6%96%87%E7%B4%A2%E5%BC%95%E8%88%87%E6%90%9C%E5%B0%8B/


http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html


http://onlamp.com/onlamp/2003/06/26/fulltext.html


http://hi.baidu.com/gazi/blog/item/ebbd2e73f29fb2198701b0c5.html


 



  • (玩半天,結果不支援中文!)

  • MySQL從3.23.23開始就逐漸支援全文索引和搜尋。

    • 全文索引就是建index,全文搜尋就是去查index。

    • LIKE是用Regular Expression去做查詢。



  • MySQL全文索引是一種index type:FULLTEXT。

  • 全文索引的index只能用在MyISAM表格的char、varchar和text的欄位上。 

  • 全文索引的index可以在create table、alter table和create index時產生。

    • create table...





CREATE TABLE article (
   id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
    title VARCHAR(200),
    body TEXT,
    FULLTEXT(title, body)
) TYPE=MYISAM;



  •  

    • alter table...

    • create index...



  • 要倒大量的資料到有全文索引index的table速度會很慢,建議先拿掉全文索引index再倒資料,倒完後再加上全文索引index。

  • 全文搜尋的語法:


MATCH (col1, col2,...) AGAINST (expr [search_modifier])


  • 三種搜尋方式:

    • IN BOOLEAN MODE

    • IN NATURAL LANGUAGE MODE

    • IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION / WITH QUERY EXPANSION



  • IN NATURAL LANGUAGE MODE

    • expr就是要搜尋的字串。

    • 沒有特殊字元。

    • 套用Stopwords。


    • 除一半row以上都有的字,譬如說,每個row都有mysql這個字的話,那用mysql去查時,會找不到任何row,這在row的數量無敵多時很有用,
      因為把所有row都找出來是沒有意義的,這時,mysql幾乎被當作是stopword;但是當row只有兩筆時,是啥鬼也查不出來的,因為每個字都出現
      50%以上,要避免這種狀況,請用IN BOOLEAN MODE。

    • 預設的搜尋方式。





SELECT *
FROM article
WHERE MATCH(title, body)
AGAINST ('xxx' IN NATURAL LANGUAGE MODE);



  •  

    • 預設搜尋是不分大小寫,若要分大小寫,columne的character set要從utf8改成utf8_bin。

    • 預設MATCH...AGAINST是以相關性排序,由高到低。

    • MATCH...AGAINST可以跟所有MySQL語法搭配使用,像是JOIN或是加上其他過濾條件。





-- 第一種count
SELECT COUNT(*)
FROM article
WHERE MATCH(title, body)
AGAINST ('xxx' IN NATURAL LANGUAGE MODE);

-- 第二種count
SELECT COUNT(IF(MATCH(title, body) AGAINST ('xxx' IN NATURAL LANGUAGE MODE), 1, NULL)) AS count
FROM article



  •  

    • 當符合的筆數較多時,第一種count比較慢,因為MATCH...AGAINST會先依相關性排序。

    • 當符合的筆數較少時,第二種count比較慢,因為第二種count會掃過所有資料。

    • MATCH(title,
      body)裡的欄位必須和FULLTEXT(title,
      body)裡的欄位一模一樣,如果只要單查title或body一個欄位,那得另外再建一個FULLTEXT(title)或
      FULLTEXT(body),也因為如此,MATCH()的欄位一定不能跨table,但是另外兩種搜尋方式好像可以。





SELECT id, MATCH(title, body) AGAINST ('xxx' IN NATURAL LANGUAGE MODE) as score
FROM article;



  •  

    • 這樣可以取得相關值,而且也因為沒有WHERE和ORDER BY,所以不會排序。





SELECT id, MATCH(title, body) AGAINST ('xxx' IN NATURAL LANGUAGE MODE) as score
FROM article
WHERE MATCH(title, body)
AGAINST ('xxx' IN NATURAL LANGUAGE MODE);



  •  

    • 排序又取得相關性,雖然MATCH...AGAINST用了兩次,但是MySQL知道這兩個MATCH...AGAINST是一樣的,所以只會用一次。





SELECT id, MATCH(title, body) AGAINST ('xxx' IN NATURAL LANGUAGE MODE) as score
FROM article
ORDER BY score desc;



  •  

    • 為啥不這樣用就好?

    • MySQL的FULLTEXT怎麼斷字:

      • 字母、數字、底線的組合視為一個字,不會把底線斷字。

      • 會被斷字的字元:空白、逗號(,)與點(.),但不用這些斷字的語言,如中文,就得自行手動斷字。

      • 可以自行實做一個斷字的外掛來取代內建的斷字parser。

      • 接受一個單引號,如aaa'bbb視為一個字,但是aaa''bbb就是兩個字。

      • 字首或字尾的單引號會被去掉,如'aaa或aaa'。



    • 全文搜尋時,stopword與少於四個字元的字串會被忽略。

      • 可以覆寫內建的stopword清單。

      • 可以修改最少四個字元的設定。







  • IN BOOLEAN MODE

    • expr裡有特殊字元輔助特殊的搜尋語法。





SELECT *
FROM article
WHERE MATCH(title, body)
AGAINST ('+mysql -yoursql' IN BOOLEAN MODE);



  •  

    • 一定要有msysql,且不要有yoursql。

    • IN BOOLEAN MODE的特色:

      • 不剔除50%以上符合的row。

      • 不自動以相關性反向排序。

      • 可以對沒有FULLTEXT index的欄位進行搜尋,但會非常慢。

      • 限制最長與最短的字串。

      • 套用Stopwords。



    • 搜尋語法:

      • +:一定要有。

      • -:不可以有,但這個「不可以有」指的是在符合的row裡不可以有指定的字串,所以不能只下「-yoursql」這樣是查不到任何row的,必須搭配其他語法使用。

      • :(什麼都沒)預設用法,表示可有可無,有的話排比較前面,沒有的排後面。

      • >:提高該字的相關性。

      • <:降低相關性。

      • ( ):條件可以巢狀。








+aaa +(>bbb <ccc) // 找到有aaa和bbb,或者aaa和ccc,然後aaa&bbb排在aaa&ccc前面




  •  

    •  

      • ~:將其相關性由正轉負,表示擁有該字會降低相關性,但不像「-」將之排除,只是排在較後面。

      • *:萬用字,不像其他語法放在前面,這個要接在字串後面。

      • " ":用雙引號將一段句子包起來表示要完全相符,不可拆字。







  • IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION

    • 也可以用WITH QUERY EXPANSION。

    • IN NATURAL LANGUAGE MODE的衍生版。

    • 先用IN NATURAL LANGUAGE MODE做搜尋,得到最相關的欄位的字再加到原expr裡,再查一次。

    • 神奇功能之一:可以用database查出mysql或oracle,第一次查詢用databae得到一些結果,從這些結果裡抽取字串,此時得到mysql與oracle的機率相當高,最後用database和這些出取出來的字串做一次查詢。

    • 神奇功能之二:無法拼出正確字串時,第一次用「相似」的錯誤字串查詢,很有可以得到正確的字串,再用正確的字串急可以得到想要的結果。

    • 因為這種查詢方式會讓「雜訊」爆增,所以建議第一次的查詢字串盡量精簡。



  • Stopwords請參考http://dev.mysql.com/doc/refman/5.1/en/fulltext-stopwords.html

  • 全文搜尋的限制:

    • 只能用在MyISAM表格上。

    • 支援UTF-8。

    • 中文支援問題:

      • MySQL不會斷中文字:MySQL內建的字依據是空白、逗號和點,對此內建機制的白痴解法是,存中文字時自行塞入空白斷字,但是還是有下面的限制。

      • 查詢字串最少四個字元的限制:所以一二三個中文字都不能查,必須將ft_min_word_len從預設的4改成1。



    • 雖然同一個表格可以有不同字元集的欄位,但是同一個FULLTEXT index裡的欄位必須是同一個字元集與collation。

    • MATCH裡的欄位必須和FULLTEXT裡的一模一樣,IN BOOLEAN MODE允許不一樣,甚至使用未FULLTEXT index的欄位,但速度很慢。

    • AGAINST裡必須是字串,不可以是變數或欄位名稱。

    • 全文搜尋使index hint受限。



  • MySQL全文搜尋設定:

    • 大部分的參數都是啟動參數,也就是修改後必須重新啟動MySQL。

    • 有些參數修改必須重新產生索引檔。





mysql> SHOW VARIABLES LIKE 'ft%';

ft_boolean_syntax    + -><()~*:""&|
ft_min_word_len    4
ft_max_word_len    84
ft_query_expansion_limit   20 ft_stopword_file    (built-in)




  •  

    • ft_min_word_len:最短的索引字串,預設值為4,修改後必須重建索引檔。

    • ft_max_word_len:最長的索引字串,預設值因版本而不同,餘同上一點。





[mysqld]
ft_min_word_len=1



  •  

    • ft_stopword_file:stopword檔案路徑,若留空白不設定表示要停用stopword過濾,修改後必須重新啟動MySQL和重建索引;stopword檔案內容可以用分行空白與逗號區隔stopword,但底線和單引號視為合法的字串字元。

    • 50%
      的門檻限制:設定檔在storage/myisam/ftdefs.h,將 #define GWS_IN_USE GWS_PROB 改為
      #define GWS_IN_USE GWS_FREQ,然後重新編譯MySQL,因為近低門檻會影響資料的精準度,所以不建議如此,可用IN
      BOOLEAN MODE即可以避開50%的限制。

    • ft_boolean_syntax:改變IN BOOLEAN MODE的查詢字元,不用重新啟動MySQL也不用重建索引。

    • 修改字串字元的認定,譬如說將「-」認定為字串的合法字元:

      • 方法一:修改storage/myisam/ftdefs.h的true_word_char()與misc_word_char(),然後重新編譯MySQL,最後重建索引。

      • 方法二:修改字元集檔,然後在FULLTEXT index的欄位使用該字元集,最後重建索引。



    • 重建索引:

      • 每個有FULLTEXT index的表格都要這麼做。






mysql> REPAIR TABLE tbl_name QUICK;


  •  

    •  

      • 要注意如果用過myisamchk,會導致上述的設定值回覆成預設值,因為myisamchk不是用MySQL的設定值。

      • 解法一:將修改過得設定值加到myisamchk的參數裡。






shell> myisamchk --recover --ft_min_word_len=1 tbl_name.MYI


  •  

    •  

      • 解法二:兩邊都要設定。






[mysqld]
ft_min_word_len=1
[myisamchk]
ft_min_word_len=1


  •  

    •  

      • 解法三:用REPAIR TABLE、ANALYZE TABLE、OPTIMIZE TABLE與ALTER TABLE取代myisamchk語法,因為這些語法是由MySQL執行的。






 


2010年11月10日 星期三

2010年11月7日 星期日