posts - 40,  comments - 7,  trackbacks - 0
            2006年9月21日
          關(guān)于inode;


          inode 譯成中文就是索引節(jié)點。每個存儲設(shè)備或存儲設(shè)備的分區(qū)(存儲設(shè)備是硬盤、軟盤、U盤 ... ... )被格式化為文件系統(tǒng)后,應(yīng)該有兩部份,一部份是inode,另一部份是Block,Block是用來存儲數(shù)據(jù)用的。而inode呢,就是用來存儲這些數(shù)據(jù)的信息,這些信息包括文件大小、屬主、歸屬的用戶組、讀寫權(quán)限等。inode為每個文件進行信息索引,所以就有了inode的數(shù)值。操作系統(tǒng)根據(jù)指令,能通過inode值最快的找到相對應(yīng)的文件。

          做個比喻,比如一本書,存儲設(shè)備或分區(qū)就相當(dāng)于這本書,Block相當(dāng)于書中的每一頁,inode 就相當(dāng)于這本書前面的目錄,一本書有很多的內(nèi)容,如果想查找某部份的內(nèi)容,我們可以先查目錄,通過目錄能最快的找到我們想要看的內(nèi)容。雖然不太恰當(dāng),但還是比較形象。

          當(dāng)我們用ls 查看某個目錄或文件時,如果加上-i 參數(shù),就可以看到inode節(jié)點了;比如我們前面所說的例子;



          [root@localhost ~]# ls -li lsfile.sh
          2408949 -rwxr-xr-x 1 root root 7 04-21 12:47 lsfile.sh

          lsfile.sh 的inode值是 2408949 ; 查看一個文件或目錄的inode,要通過ls 命令的的 -i參數(shù)。


          2.10 inode 相同的文件是硬鏈接文件;


          在Linux 文件系統(tǒng)中,inode值相同的文件是硬鏈接文件,也就是說,不同的文件名,inode可能是相同的,一個inode值可以對應(yīng)多個文件。理解鏈接文件并不難,看看例子就會了。在Linux中,鏈接文件是通過ln工具來創(chuàng)建的。


          2.11 創(chuàng)建硬鏈接,硬鏈接和源文件關(guān)系;


          用ln 創(chuàng)建文件硬鏈接的語法:



          # ln 源文件 目標(biāo)文件

          下面我們舉一個例子,在這個例子中,我們要為sun.txt 創(chuàng)建其硬鏈接sun002.txt。然后看一下sun.txt和sun002.txt的屬性的變化;


          [root@localhost ~]# ls -li sun.txt 注:查看sun.txt的屬性;
          2408263 -rw-r--r-- 1 root root 29 04-22 21:02 sun.txt 注:這是sun.txt的屬性;
          [root@localhost ~]# ln sun.txt sun002.txt 注:我們通過ln 來創(chuàng)建sun.txt的硬鏈接文件sun002.txt
          [root@localhost ~]# ls -li sun* 注:我們列一下sun.txt 和sun002.txt
          2408263 -rw-r--r-- 2 root root 29 04-22 21:02 sun002.txt
          2408263 -rw-r--r-- 2 root root 29 04-22 21:02 sun.txt

          我們可以看到sun.txt在沒有創(chuàng)建硬鏈接文件sun002.txt的時候,其鏈接個數(shù)是1(也就是-rw-r--r--后的那個數(shù)值),創(chuàng)建了硬鏈接sun002.txt創(chuàng)建后,這個值變成了2。也就是說,我們每次為sun.txt創(chuàng)建一個新的硬鏈接文件后,其硬鏈接個數(shù)都會增加1。

          inode值相同的文件,他們的關(guān)系是互為硬鏈接的關(guān)系。當(dāng)我們修改其中一個文件的內(nèi)容時,互為硬鏈接的文件的內(nèi)容也會跟著變化。如果我們刪除互為硬鏈接關(guān)系的某個文件時,其它的文件并不受影響。比如我們把sun.txt刪除后,我們還是一樣能看到sun002.txt的內(nèi)容,并且sun02.txt仍是存在的。

          可以這么理解,互為硬鏈接關(guān)系的文件,他們好象是克隆體,他們的屬性幾乎是完全一樣;

          下面的例子,我們把sun.txt刪除,然后我們看一下sun002.txt 是不是能看到其內(nèi)容。



          [root@localhost ~]# rm -rf sun.txt
          [root@localhost ~]# more sun002.txt

          注意:硬鏈接不能為目錄創(chuàng)建,只有文件才能創(chuàng)建硬鏈接。


          2.12 軟鏈接的創(chuàng)建,及軟接與源文件的關(guān)系;


          創(chuàng)建軟鏈接(也被稱為符號鏈接)的語法;



          # ln -s 源文文件或目錄 目標(biāo)文件或目錄

          軟鏈接也叫符號鏈接,他和硬鏈接有所不同,軟鏈接文件只是其源文件的一個標(biāo)記。當(dāng)我們刪除了源文件后,鏈接文件不能獨立存在,雖然仍保留文件名,但我們卻不能查看軟鏈接文件的內(nèi)容了。



          [root@localhost ~]# ls -li linuxsir001.txt
          2408274 -rw-r--r-- 1 root root 29 04-22 21:53 linuxsir001.txt
          [root@localhost ~]# ln -s linuxsir001.txt linuxsir002.txt
          [root@localhost ~]# ls -li linuxsir001.txt linuxsir002.txt
          2408274 -rw-r--r-- 1 root root 29 04-22 21:53 linuxsir001.txt
          2408795 lrwxrwxrwx 1 root root 15 04-22 21:54 linuxsir002.txt -> linuxsir001.txt

          解釋

          上面的例子,首先我們查看 linuxsir001.txt 的屬性,比如inode 、所屬文件種類、創(chuàng)建或修改時間等... ...我們來對比一下:

          首先 對比一下節(jié)點:兩個文件的節(jié)點不同;
          其次 兩個文件的歸屬的種類不同 linuxsir001.txt是-,也就是普通文件,而linuxsir002.txt 是l,它是一個鏈接文件;
          第三 兩個文件的讀寫權(quán)限不同 linuxsir001.txt 是rw-r--r-- ,而linuxsir002.txt的讀寫權(quán)限是 rwxrwxrwx
          第三 兩者的硬鏈接個數(shù)相同;都是1
          第四 兩文件的屬主和所歸屬的用戶組相同;
          第五 修改(或訪問、創(chuàng)建)時間不同;

          我們還注意到了linuxsir002.txt 后面有一個標(biāo)記 ->,這表示linuxsir002.txt 是linuxsir001.txt的軟鏈接文件。

          值得我們注意的是:當(dāng)我們修改鏈接文件的內(nèi)容時,就意味著我們在修改源文件的內(nèi)容。當(dāng)然源文件的屬性也會發(fā)生改變,鏈接文件的屬性并不會發(fā)生變化。當(dāng)我們把源文件刪除后,鏈接文件只存在一個文件名,因為失去了源文件,所以軟鏈接文件也就不存在了。這一點和硬鏈接是不同的;



          [root@localhost ~]# rm -rf linuxsir001.txt 注:刪除linuxsir001.txt
          [root@localhost ~]# ls -li linuxsir002.txt 注:查看linuxsir002 的屬性;
          2408795 lrwxrwxrwx 1 root root 15 04-22 21:54 linuxsir002.txt -> linuxsir001.txt
          [root@localhost ~]# more linuxsir002.txt 注:查看linuxsir002.txt的內(nèi)容;
          linuxsir002.txt: 沒有那個文件或目錄 注:得到提示,linuxsir002.txt不存在。

          上面的例子告訴我們,如果一個鏈接文件失去了源,就意味著他已經(jīng)不存在了;

          我們可以看到軟鏈接文件,其實只是源文件的一個標(biāo)記,當(dāng)源文件失去時,他也就是存在了。軟鏈接文件只是占用了inode來存儲軟鏈接文件屬性等信息,但文件存儲是指向源文件的。

          軟件鏈接,可以為文件或目錄都適用。無論是軟鏈接還是硬鏈接,都可以用rm來刪除。rm工具是通用的。
          參考資料:http://techcenter.dicder.com/2006/0908/content_185.htm
          posted @ 2007-07-13 09:54 Lansing 閱讀(750) | 評論 (0)編輯 收藏
          寫一些關(guān)于PL/SQL的語法,免得等到用到的時候還要去亂翻。
          1。控制流程(if,while)
          2。循環(huán)(for)
          3。游標(biāo)(cursor)
          4。異常處理(exception)

          1。控制流程()


          A.條件語句
          IF <statement> THEN
          ?? PL/SQL
          END IF;

          IF <statement> THEN
          ?? PL/SQL
          ELSE
          ?? PL/SQL
          END IF;

          IF
          <statement> THEN
          ?? PL/SQL
          ELSIF <statement> THEN
          ?? PL/SQL
          END IF;


          2。循環(huán)

          A.simple loop
          LOOP
          ?? SQL
          ?? EXIT WHEN <statement>;
          END LOOP;

          LOOP
          ?? SQL
          ?? IF
          <statement> THEN
          ?? EXIT;
          ?? END IF;
          END LOOP;

          B.While loop
          WHILE <statement> LOOP
          ?? SQL
          END LOOP;

          C.For loop
          FOR $counter in $low .. $high LOOP
          ?? SQL
          END LOOP


          3。游標(biāo)

          在PL/SQL程序中定義的游標(biāo)叫做顯式游標(biāo)。

          A.顯式游標(biāo)的處理由四個部分組成:
          cursor $cursorname is $Query;   --定義游標(biāo)
          open $cursorname;         --打開游標(biāo)
          fetch $cursorname into $othervariable  --把游標(biāo)中的東西取出
          close $cursorname??? --關(guān)閉游標(biāo)

          B.游標(biāo)屬性
          %found?? ?? ?? 布爾型屬性,當(dāng)最近一次讀紀(jì)錄成功
          ,為true.
          %nofound                失敗時,為false.
          %isopen
          %rowcount?? ?? 返回已從游標(biāo)中讀取的記錄數(shù)。

          C.參數(shù)化游標(biāo)

          所有的SQL語句在上下文區(qū)內(nèi)部都是可執(zhí)行的,因此都有一個游標(biāo)指向上下文區(qū),此游標(biāo)就是所謂的SQL游標(biāo)。
          與顯式游標(biāo)不同,SQL游標(biāo)不被程序打開和關(guān)閉。


          4.異常處理概念

          異常處理是用來處理正常執(zhí)行過程中未預(yù)料的事件。如果PL/SQL程序塊一旦產(chǎn)生異常而又沒有指出如何處理時,程序會自動終止。
          異常處理部分放在PL/SQL的后半部分,結(jié)構(gòu)為:

          EXCEPTION
          ?????? WHEN first_exception THEN <code to handle first exception>
          ?????? WHEN second_exception THEN <code to handle second exception>
          ?????? WHEN OTHERS THEN <
          code to handle second exception >? --OTHERS必須放在最后

          異常分為預(yù)定義和用戶定義兩種。
          用戶定義的異常是通過顯式使用RAISE語句來引發(fā)。如

          DECLARE
          ? e_TooManyStudents EXCEPTION;? -- 類型為Exception,用于指示錯誤條件
          ? v_CurrentStudents NUMBER(3);? -- HIS-101學(xué)生注冊當(dāng)前號
          ? v_MaxStudents NUMBER(3);????? -- HIS-101學(xué)生注冊允許的最大號

          BEGIN
           /* 找出注冊學(xué)生當(dāng)前號和允許的最大號 */

          ? SELECT current_students, max_students

          ??? INTO v_CurrentStudents, v_MaxStudents

          ??? FROM classes

          ??? WHERE department = 'HIS' AND course = 101;

          ? /* 檢查學(xué)生的號 */

          ? IF v_CurrentStudents > v_MaxStudents THEN

          /* 太多的學(xué)生注冊,則觸發(fā)例外處理 */

          ? RAISE e_TooManyStudents;

          ? END IF;

          EXCEPTION

          ? WHEN e_TooManyStudents THEN

          ??? /* 當(dāng)太多的學(xué)生注冊,就插入信息解釋發(fā)生過錯誤 */

          ??? INSERT INTO log_table (info) VALUES ('History 101 has ' || v_CurrentStudents ||

          ????? 'students: max allowed is ' || v_MaxStudents);

          END;


          END;

          用戶定義的的異常處理
          可以使用RAISE_APPLICATION_ERROR來創(chuàng)建自己的錯誤處理:
          RAISE_APPLICATION_ERROR(error_number,error_message,[keep_errors]);
          其中
          error_number是從-20000到-20999之間的參數(shù); error_message是相應(yīng)的提示信息,小于512字節(jié)。如:

          CREATE OR REPLACE PROCEDURE Register (
          p_StudentID IN students.id%TYPE,
          p_Department IN classes.department%TYPE,
          p_Course IN classes.course%TYPE) AS
          v_CurrentStudents NUMBER;? -- 班上學(xué)生的當(dāng)前號
          v_MaxStudents NUMBER;????? -- 班上學(xué)生的最大號

          BEGIN
          /* 找出學(xué)生的當(dāng)前號和最大號 */
          SELECT current_students, max_students
          ?INTO v_CurrentStudents, v_MaxStudents
          FROM classes
          WHERE course = p_Course
          AND department = p_Department;

          /* 確認(rèn)另外的學(xué)生是否有足夠的教室 */
          IF v_CurrentStudents + 1 > v_MaxStudents THEN
          RAISE_APPLICATION_ERROR(-20000, 'Can''t add more students to ' ||
          p_Department || ' ' || p_Course);
          END IF;

          /* 加一個學(xué)生在本班 */
          ClassPackage.AddStudent(p_StudentID, p_Department, p_Course);

          EXCEPTION
          WHEN NO_DATA_FOUND THEN
             
          RAISE_APPLICATION_ERROR(-20001, p_Department || ' ' || p_Course ||
          ??? ?? ??
          ' doesn''t exist!');
          END Register;

          posted @ 2007-01-23 10:10 Lansing 閱讀(373) | 評論 (0)編輯 收藏
          關(guān)于ODBC數(shù)據(jù)源連接文本?

          ????????????  在《外部數(shù)據(jù)庫的連接原理》一講中我們說過,ODBC提供對多種數(shù)據(jù)庫的支持,如dBase、Access、MS?SQL?
          ????????????Server及Oracle,也就是說運用ODBC數(shù)據(jù)源中所提供的連接代碼,我們可以實現(xiàn)對多種數(shù)據(jù)庫的連接。以連接Access數(shù)據(jù)庫為例,ODBC數(shù)據(jù)源連接文本的格式是:
          ????????????  “Driver={數(shù)據(jù)庫驅(qū)動程序};Dbq=數(shù)據(jù)庫文件;”
          ????????????  在以上連接文本中,如果數(shù)據(jù)庫跟程序在同一目錄下,或者用變量DefaultDir指定了數(shù)據(jù)庫所在目錄,則數(shù)據(jù)庫文件可以不用全路徑名,如下即可:
          ????????????  “ODBC;DBQ=MSAccess.mdb;Driver={Microsoft?Access?Driver?(*.mdb)};”
          ????????????  如下也可:
          ????????????  “ODBC;DBQ=MSAccess.mdb;DefaultDir=d:\Downloads\e21;Driver={Microsoft?
          ????????????Access?Driver?(*.mdb)};”
          ????????????  如果數(shù)據(jù)庫跟程序不在同一目錄下,或者沒有用變量DefaultDir指定數(shù)據(jù)庫所在目錄,則數(shù)據(jù)庫文件需要用全路徑名,如下:
          ????????????  “ODBC;DBQ=E:\Quake?III?Arena\MSAccess.mdb;Driver={Microsoft?Access?
          ????????????Driver?(*.mdb)};”
          ????????????  以上所說的是連接Access數(shù)據(jù)庫的格式,那么連接其他數(shù)據(jù)庫的ODBC數(shù)據(jù)源連接文本又是怎樣的?連接不同類型的數(shù)據(jù)庫要使用不同的對應(yīng)驅(qū)動程序,沒忘記吧!不同的驅(qū)動程序當(dāng)然它們的參數(shù)組合也就不同了,每一種不同驅(qū)動程序都有其特定的的參數(shù)形式:?

          ????????????  ⑴、MS?Access?ODBC?DSNless?連接:
          ????????????  ☆、參數(shù):Driver?設(shè)置值:{Microsoft?Access?Driver?(*.mdb)}
          ????????????  ☆、參數(shù):Dbq?設(shè)置值:實際路徑文件名稱
          ????????????  ☆、例句:
          ????????????  “Driver={Microsoft?Access?Driver?
          ????????????(*.mdb)};Dbq=c:\somepath\dbname.mdb;Uid=Admin;Pwd=pass;?”
          ????????????  ⑵、dBase?ODBC?DSNless?連接:?
          ????????????  ☆、參數(shù):Driver?設(shè)置值:{Microsoft?dBASE?Driver?(*.dbf)}
          ????????????  ☆、參數(shù):Dbq?設(shè)置值:實際路徑文件名稱
          ????????????  ☆、例句:
          ????????????  “Driver={Microsoft?dBASE?Driver?
          ????????????(*.dbf)};DriverID=277;Dbq=c:\somepath\dbname.dbf;?”
          ????????????  ⑶、Oracle?ODBC?DSNless?連接:
          ????????????  ☆、參數(shù):Driver?設(shè)置值:{Microsoft?ODBC?for?Oracle}
          ????????????  ☆、參數(shù):Dbq?設(shè)置值:實際路徑文件名稱
          ????????????  ☆、例句:
          ????????????  “Driver={Microsoft?ODBC?for?
          ????????????Oracle};Server=OracleServer.world;Uid=admin;Pwd=pass;?”
          ????????????  ⑷、MS?SQL?Server?DSNless?連接:?
          ????????????  ☆、參數(shù):Driver?設(shè)置值:{SQL?Server};
          ????????????  ☆、參數(shù):Server?設(shè)置值:服務(wù)器名稱
          ????????????  ☆、參數(shù):Database?設(shè)置值:數(shù)據(jù)表名稱
          ????????????  ☆、參數(shù):Uid?設(shè)置值:用戶名稱
          ????????????  ☆、參數(shù):Pwd?設(shè)置值:密碼
          ????????????  ☆、例句:
          ????????????  “Driver={SQL?
          ????????????Server};Server=servername;Database=dbname;Uid=sa;Pwd=pass;?”
          ????????????  ⑸、MS?Text?Driver?DSNless?連接:?
          ????????????  ☆、參數(shù):Driver?設(shè)置值:{Microsoft?Text?Driver?(*.txt;?*.csv)}
          ????????????  ☆、參數(shù):Dbq?設(shè)置值:實際路徑文件名稱
          ????????????  ☆、例句:
          ????????????  “Driver={Microsoft?Text?Driver?(*.txt;?
          ????????????*.csv)};Dbq=c:\somepath\;Extensions=asc,csv,tab,txt;Persist?Security?
          ????????????Info=False;?”
          ????????????  ⑹、Visual?Foxpro?DSNless?連接:
          ????????????  ☆、參數(shù):Driver?設(shè)置值:{Microsoft?Visual?FoxPro?Driver}
          ????????????  ☆、參數(shù):SourceType?設(shè)置值:DBC
          ????????????  ☆、參數(shù):SourceDB?設(shè)置值:實際路徑文件名稱?
          ????????????  ☆、例句:
          ????????????  “Driver={Microsoft?Visual?FoxPro?
          ????????????Driver};SourceType=DBC;SourceDB=c:\somepath\dbname.dbc;Exclusive=No;”?

          ????????????  ⑺、MySQL?DSNless?連接:
          ????????????  ☆、參數(shù):Driver?設(shè)置值:{mysql}
          ????????????  ☆、參數(shù):database?設(shè)置值:數(shù)據(jù)表名稱
          ????????????  ☆、參數(shù):uid?設(shè)置值:用戶名稱
          ????????????  ☆、參數(shù):pwd?設(shè)置值:密碼
          ????????????  ☆、例句:?
          ????????????  “driver={mysql};?
          ????????????database=yourdatabase;uid=username;pwd=password;option=16386”
          ????????????*******************************************************************
          ????????????SQL語言簡介?

          ????????????  在上一講中我們介紹了連接外部數(shù)據(jù)庫的方法,那么連接之后怎樣對外部數(shù)據(jù)庫進行讀取、顯示、增刪、更新、查詢等操作呢?這些操作需要通過外部數(shù)據(jù)庫等對象調(diào)用SQL指令才能完成。
          ????????????  ㈠、什么是SQL語言
          ????????????  SQL(Structure?Query?Languge,結(jié)構(gòu)化查詢語言)是一種數(shù)據(jù)庫專用的計算機語言,不管是Oracle、MS?
          ????????????SQL?
          ????????????、Access、MySQL或其他公司的數(shù)據(jù)庫,也不管數(shù)據(jù)庫建立在大型主機或個人計算機上,都可以使用SQL語言來訪問和修改數(shù)據(jù)庫的內(nèi)容。雖然不同公司的數(shù)據(jù)庫軟件多多少少會增加一些專屬的SQL語法,但大體上,它們還是遵循ASNI(美國國家標(biāo)準(zhǔn)協(xié)會)制定的SQL標(biāo)準(zhǔn)。因為SQL語言具有易學(xué)習(xí)及閱讀等特性,所以SQL逐漸被各種數(shù)據(jù)庫廠商采用,而成為一種共通的標(biāo)準(zhǔn)查詢語言。只要你學(xué)會SQL,即可操作各種數(shù)據(jù)庫如Visual?
          ????????????Foxpro、Access、dBase等等。總之,SQL語言是各種數(shù)據(jù)庫都可以使用的數(shù)據(jù)庫查詢語言。
          ????????????  SQL語言不僅僅具有查詢數(shù)據(jù)庫的功能,而且可以對數(shù)據(jù)庫完成選取、增刪、更新與跳轉(zhuǎn)等各種操作。
          ????????????  ㈡、SQL語言的組成
          ????????????  SQL語言是由命令(函數(shù))、子句、運算符、加總函數(shù)及通配符等組成,分述如下:
          ????????????  1、命令
          ????????????  SQL的命令可分成數(shù)據(jù)定義語言與數(shù)據(jù)操作語言,數(shù)據(jù)定義語言可用來建立新的數(shù)據(jù)庫、數(shù)據(jù)表、字段及索引等,本教程不予介紹;另一為數(shù)據(jù)操作語言,可用來建立查詢表、排序、篩選數(shù)據(jù)、修改、增刪等動作。數(shù)據(jù)定義語言命令常用的有選擇、添加、刪除和修改這四種:
          ????????????  ⑴、命令:SELECT
          ????????????  中文意思:選擇
          ????????????  說明:用于找出合乎條件的記錄
          ????????????  ⑵、命令:INSERT
          ????????????  中文意思:插入
          ????????????  說明:用于增加一筆記錄或合并兩個數(shù)據(jù)表
          ????????????  ⑶、命令:UPDATE
          ????????????  中文意思:更新
          ????????????  說明:用于更正合乎條件的記錄
          ????????????  ⑷、命令:DELETE
          ????????????  中文意思:刪除
          ????????????  說明:用于刪除合乎條件的記錄
          ????????????  2、子句
          ????????????  子句是用于設(shè)定命令要操作的對象(即參數(shù)),SQL所用的子句如下:
          ????????????  ⑴、子句:FROM?
          ????????????  中文意思:數(shù)據(jù)表
          ????????????  說明:用于指定數(shù)據(jù)表
          ????????????  ⑵、子句:WHERE
          ????????????  中文意思:條件
          ????????????  說明:用于設(shè)定條件
          ????????????  ⑶、GROUP?BY
          ????????????  中文意思:分組(合并)
          ????????????  說明:用于設(shè)定分組
          ????????????  ⑷、ORDER?BY
          ????????????  中文意思:排序
          ????????????  說明:用于設(shè)定輸出的順序及字段
          ????????????  3、運算符
          ????????????  子句參數(shù)中的運算符使子句構(gòu)成不同的語法格式,如“字段1='100'”、“字段1>'100'”等。運算符又分邏輯運算符與比較運算符。
          ????????????  ◇邏輯運算符如下:
          ????????????  ⑴、運算符:AND
          ????????????  中文意思:并且
          ????????????  說明:邏輯且
          ????????????  ⑵、運算符:OR?
          ????????????  中文意思:或者
          ????????????  說明:邏輯非
          ????????????  ⑶、運算符:NOT
          ????????????  中文意思:取反
          ????????????  說明:邏輯非或邏輯反
          ????????????  ◇比較運算符如下:
          ????????????  ⑴、運算符:<?說明:小于
          ????????????  ⑵、運算符:≤?說明:小于等于
          ????????????  ⑶、運算符:≥?說明:大于等于
          ????????????  ⑷、運算符:>?說明:大于
          ????????????  ⑸、運算符:=?說明:等于
          ????????????  ⑹、運算符:<>?說明:不等于
          ????????????  ⑺、運算符:BETWEEN?說明:用于設(shè)定范圍?中文意思:在...之間
          ????????????  ⑻、運算符:LIKE?說明:用于通配設(shè)定?中文意思:如同
          ????????????  ⑼、運算符:IN?說明:用于集合設(shè)定?中文意思:在...之內(nèi)
          ????????????  4、加總函數(shù)
          ????????????  加總函數(shù)常常運用在命令的參數(shù)中,如:“SELECT?SUM(數(shù)學(xué)),AVG(數(shù)學(xué))?FROM?成績單”。
          ????????????  ⑴、加總函數(shù):AVG?
          ????????????  中文意思:平均
          ????????????  說明:用于求指定條件的平均?
          ????????????  ⑵、加總函數(shù):COUNT
          ????????????  中文意思:數(shù)量
          ????????????  說明:用于求指定的數(shù)量
          ????????????  ⑶、加總函數(shù):SUM
          ????????????  中文意思:和
          ????????????  說明:用于求指定條件的和
          ????????????  ⑷、加總函數(shù):MAX
          ????????????  中文意思:最大值
          ????????????  說明:用于求指定條件的最大值
          ????????????  ⑸、加總函數(shù):MIN
          ????????????  中文意思:最小值
          ????????????  說明:用于求指定條件的最小值
          ????????????  5、通配符
          ????????????  ⑴、通配符:%?意義:任何長度的字符串(包括0)
          ????????????  ⑵、通配符:_?意義:下劃線表示任何一個字符
          ????????????  ⑶、通配符:[]?意義:中括號表示某個范圍內(nèi)的一個字符
          ????????????  在下一講將說明SQL語言是怎樣把命令(函數(shù))、子句、運算符、及加總函數(shù)等組合在一起的。

          ????????????*************************************************************************

          ????????????嵌入式SQL的應(yīng)用?

          ????????????  SQL語句可以單獨在數(shù)據(jù)庫系統(tǒng)本身中執(zhí)行,但如果運用在其他編程工具所編制的程序中,一般不能單獨執(zhí)行,而要把SQL語句嵌入到高級語言(如易語言)中使用,通過高級語言的命令和方法來調(diào)用之,此時SQL稱為嵌入式SQL。調(diào)用SQL語句的程序稱為宿主程序,在易語言中一般是把SQL語句作為宿主程序的唯一參數(shù)來直接處理。嵌入式SQL在使用上有一些規(guī)定,在易語言中目前的版本規(guī)定如下:
          ????????????  ⑴、在程序中要區(qū)分SQL語句和宿主語言的語句。在易語言中好區(qū)分,因為SQL語句形式是英文的,而易語言是中文的,但在實際應(yīng)用時仍然有可能會混亂,所以易語言要把SQL語句轉(zhuǎn)化為文本型才能調(diào)用,即嵌入式SQL語句兩邊要用雙引號來標(biāo)示。
          ????????????  ⑵、允許SQL語句使用宿主程序的變量,但使用時要將宿主程序的變量跟外部數(shù)據(jù)庫中表格的字段名區(qū)別開來,區(qū)別方法如下:
          ????????????  ①、在易語言中要將變量類型轉(zhuǎn)化為文本型變量才能被SQL文本相加使用,比如下面的例子中有一個叫“數(shù)字1”的整數(shù)類型變量,插入到SQL文本中是這樣表達:
          ????????????  外部數(shù)據(jù)庫1.查詢?(“select?*?from?chj?where?”?+?組合框1.內(nèi)容?+?“=”?+?到文本?(數(shù)字1))
          ????????????  ②、包含字段名的SQL文本兩邊加雙引號,變量名不能在雙引號內(nèi),如上例。
          ????????????  ⑶、要將字段名跟字段值區(qū)別開來,區(qū)別方法如下:
          ????????????  ①、對于文本類型的字段,在其字段值兩邊要加上“'”號標(biāo)示其文本值,代表語法是:字段名稱=‘文本值’。如下:
          ????????????  外部數(shù)據(jù)庫1.查詢?(“select?*?from?chj?where?姓名='山大王'”)
          ????????????  又如下面“查找編輯框.內(nèi)容”中的字段值是文本型,嵌入式SQL語句如下:
          ????????????  外部數(shù)據(jù)庫1.查詢?(“select?*?from?chj?where?姓名==”?+?“'”?+?查找編輯框.內(nèi)容?+?
          “'”)
          ????????????  ②、對于數(shù)字類型的字段,在SQL語句中表示其字段值,兩邊不加符號標(biāo)示,代表語法是:字段名稱=數(shù)字值。如下兩例:
          ????????????  外部數(shù)據(jù)庫1.查詢?(“select?*?from?chj?where?”?+?組合框1.內(nèi)容?+?“=”?+?查找編輯框.內(nèi)容)?
          ????????????  外部數(shù)據(jù)庫1.查詢?(“select?*?from?chj?where?學(xué)號=17”)
          ????????????  ③、對于日期時間類型的字段,在其字段值兩邊要加上“#”號標(biāo)示其時間值,代表語法是:字段名稱=#時間值#。如下兩例:
          ????????????  外部數(shù)據(jù)庫1.查詢?(“select?*?from?chj?where?入學(xué)時間?BETWEEN?#2001-01-01#?and?
          ????????????#2002-01-01#”)
          ????????????  外部數(shù)據(jù)庫1.查詢?(“select?*?from?chj?where?”?+?組合框1.內(nèi)容?+?“=”?+?“#”?+?
          ????????????查找編輯框.內(nèi)容?+?“#”)
          ????????????  ④、也可以將SQL語句中的字段名(尤其是中文名)可用中括號括住,如:[字段名]。
          ????????????  
          ????????????  ⑷、SQL語句要用半角輸入法輸入,否則可能會出錯。
          ????????????  那么在易語言中怎樣調(diào)用SQL語句呢?一般是在外部數(shù)據(jù)庫對象(控件)的方法中調(diào)用,試概括如下:
          ????????????  ⑴、對外部數(shù)據(jù)庫進行查詢的方法。
          ????????????  對外部數(shù)據(jù)庫的查詢就是在對外部數(shù)據(jù)庫不加編輯改動的前提下,只通過記錄集來對數(shù)據(jù)庫進行顯示、查詢、篩選、排序和記錄集的合并等操作。
          ????????????  所有查詢類的方法起源于下面這個語句,其他查詢類語句是對這個語句的調(diào)用(將此語句作為唯一的參數(shù)),該語句如下:
          ????????????  外部數(shù)據(jù)庫.查詢?(查詢類SQL語句)
          ????????????  也可這樣表達:
          ????????????  外部數(shù)據(jù)庫.查詢?(“SELECT...FROM...[WHERE]...[GROUP?BY]...[ORDER?BY]...?”)
          ????????????  該方法是對當(dāng)前被打開數(shù)據(jù)庫進行數(shù)據(jù)查詢,返回的結(jié)果稱為“記錄集句柄”(即記錄集的標(biāo)記)。注意當(dāng)不再使用此記錄集時,必須使用“關(guān)閉記錄集”將其關(guān)閉,如果失敗,返回0。在易語言中,將以上語句等同于記錄集句柄以作為其他查詢類語句的參數(shù)。為了使該參數(shù)在所有子程序中都能應(yīng)用,我們一般把它設(shè)置為整數(shù)型全局變量,并將其值設(shè)置如下:
          ????????????  記錄集句柄=外部數(shù)據(jù)庫.查詢?(查詢類SQL語句)
          ????????????  由于易語言要把SQL語句轉(zhuǎn)化為文本型才能調(diào)用,所以嵌入式SQL語句兩邊要有雙引號,例句:
          ????????????  記錄集句柄?=?外部數(shù)據(jù)庫1.查詢?(“select?*?from?chj?”)
          ????????????  ※?“chj”是外部數(shù)據(jù)庫中一個表的名稱
          ????????????  又如,欲得到排序的記錄集,應(yīng)象下面這樣賦值:
          ????????????  記錄集句柄?=?外部數(shù)據(jù)庫1.查詢?(“SELECT?*?FROM?chj?ORDER?BY?語文?DESC”)
          ????????????  現(xiàn)將外部數(shù)據(jù)庫控件中其他的查詢類方法列舉如下:
          ????????????  ①、外部數(shù)據(jù)庫.重新查詢?(記錄集句柄)?即:
          ????????????  外部數(shù)據(jù)庫.重新查詢?(外部數(shù)據(jù)庫.查詢?(查詢類SQL語句))
          ????????????  例句:外部數(shù)據(jù)庫1.重新查詢?(外部數(shù)據(jù)庫1.查詢?(“select?*?from?chj?”))?
          ????????????  ②、外部數(shù)據(jù)庫.首記錄前?(記錄集句柄)?即:
          ????????????  外部數(shù)據(jù)庫.首記錄前?(外部數(shù)據(jù)庫.查詢?(查詢類SQL語句))
          ????????????  例句:外部數(shù)據(jù)庫1.首記錄前?(記錄集句柄)
          ????????????  ③、外部數(shù)據(jù)庫.尾記錄后?(記錄集句柄)
          ????????????  ④、外部數(shù)據(jù)庫.到首記錄?(記錄集句柄)
          ????????????  ⑤、外部數(shù)據(jù)庫.到尾記錄?(記錄集句柄)
          ????????????  ⑥、外部數(shù)據(jù)庫.到前一記錄?(記錄集句柄)
          ????????????  ⑦、外部數(shù)據(jù)庫.到后一記錄?(記錄集句柄)
          ????????????  ⑧、外部數(shù)據(jù)庫.讀?(記錄集句柄,字段名稱或位置)
          ????????????  例句:語文編輯框.內(nèi)容?=?到文本?(外部數(shù)據(jù)庫1.讀?(記錄集句柄,?“語文”))
          ????????????  ⑵、對外部數(shù)據(jù)庫進行編輯的方法。
          ????????????  所謂對外部數(shù)據(jù)庫的編輯,就是變更改動外部數(shù)據(jù)庫本身,包括添加、更新、刪除等,對數(shù)據(jù)庫進行編輯不必通過記錄集。所有非查詢類SQL語句都嵌入下面這個語句來執(zhí)行:
          ????????????  外部數(shù)據(jù)庫.執(zhí)行?(非查詢類SQL語句)
          ????????????  ①、添加記錄,其語法如下:
          ????????????  外部數(shù)據(jù)庫.執(zhí)行?(“insert?into?表名稱(字段1,字段2...)?values?(字段值1,字段值2...)?”)
          ????????????  例句:
          ????????????  外部數(shù)據(jù)庫1.執(zhí)行?(“INSERT?INTO?chj?”?+?“(學(xué)號,姓名,語文,數(shù)學(xué),英語)”?+?“?valueS?”?+?
          ????????????“(”?+?學(xué)號編輯框.內(nèi)容?+?“,'”?+?姓名編輯框.內(nèi)容?+?“','”?+?語文編輯框.內(nèi)容?+?“','”?+?
          ????????????數(shù)學(xué)編輯框.內(nèi)容?+?“','”?+?英語編輯框.內(nèi)容?+?“')”)
          ????????????  ②、更新記錄,其語法如下:
          ????????????  外部數(shù)據(jù)庫.執(zhí)行?(“UPDATE?表名稱?SET?字段1=字段值1,字段2=字段值2...WHERE?條件式”)?
          ????????????  例句:
          ????????????  外部數(shù)據(jù)庫1.執(zhí)行?(“UPDATE?chj?SET?學(xué)號=”?+?“'”?+?學(xué)號編輯框.內(nèi)容?+?“',”?+?“姓名=”?
          ????????????+?“'”?+?姓名編輯框.內(nèi)容?+?“',”?+?“語文=”?+?“'”?+?語文編輯框.內(nèi)容?+?“',”?+?“數(shù)學(xué)=”?
          ????????????+?“'”?+?數(shù)學(xué)編輯框.內(nèi)容?+?“',”?+?“英語=”?+?“'”?+?英語編輯框.內(nèi)容?+?“'?”?+?“WHERE?
          ????????????姓名=”?+?“'”?+?姓名1?+?“'?”?+?“AND?語文=”?+?語文1?+?“AND?數(shù)學(xué)=”?+?數(shù)學(xué)1?+?“AND?
          ????????????英語=”?+?英語1?+?“AND?學(xué)號=”?+?學(xué)號1)
          ????????????  ③、刪除記錄,其語法如下:
          ????????????  外部數(shù)據(jù)庫.執(zhí)行?(“DELETE?*?FROM?表名稱?WHERE?條件式”)
          ????????????  例句:
          ????????????  外部數(shù)據(jù)庫.執(zhí)行?(“外部數(shù)據(jù)庫1.執(zhí)行?(“DELETE?*?FROM?chj?”?+?“WHERE?姓名=”?+?“'”?+?
          ????????????姓名1?+?“'?”?+?“AND?語文=”?+?語文1?+?“AND?數(shù)學(xué)=”?+?數(shù)學(xué)1?+?“AND?英語=”?+?英語1?+?
          ????????????“AND?學(xué)號=”?+?學(xué)號1)”)
          posted @ 2007-01-19 12:17 Lansing 閱讀(1625) | 評論 (3)編輯 收藏
          Java虛擬機

          一、什么是Java虛擬機


          Java虛擬機是一個想象中的機器,在實際的計算機上通過軟件模擬來實現(xiàn)。Java虛擬機有自己想象中的硬件,如處理器、堆棧、寄存器等,還具有相應(yīng)的指令系統(tǒng)。


          1.為什么要使用Java虛擬機


          Java語言的一個非常重要的特點就是與平臺的無關(guān)性。而使用Java虛擬機是實現(xiàn)這一特點的關(guān)鍵。一般的高級語言如果要在不同的平臺上運行,至少需要編譯成不同的目標(biāo)代碼。而引入Java語言虛擬機后,Java語言在不同平臺上運行時不需要重新編譯。Java語言使用模式Java虛擬機屏蔽了與具體平臺相關(guān)的信息,使得Java語言編譯程序只需生成在Java虛擬機上運行的目標(biāo)代碼(字節(jié)碼),就可以在多種平臺上不加修改地運行。Java虛擬機在執(zhí)行字節(jié)碼時,把字節(jié)碼解釋成具體平臺上的機器指令執(zhí)行。


          2.誰需要了解Java虛擬機


          Java虛擬機是Java語言底層實現(xiàn)的基礎(chǔ),對Java語言感興趣的人都應(yīng)對Java虛擬機有個大概的了解。這有助于理解Java語言的一些性質(zhì),也有助于使用Java語言。對于要在特定平臺上實現(xiàn)Java虛擬機的軟件人員,Java語言的編譯器作者以及要用硬件芯片實現(xiàn)Java虛擬機的人來說,則必須深刻理解Java虛擬機的規(guī)范。另外,如果你想擴展Java語言,或是把其它語言編譯成Java語言的字節(jié)碼,你也需要深入地了解Java虛擬機。


          3.Java虛擬機支持的數(shù)據(jù)類型


          Java虛擬機支持Java語言的基本數(shù)據(jù)類型如下:


          byte://1字節(jié)有符號整數(shù)的補碼
          short://2字節(jié)有符號整數(shù)的補碼
          int://4字節(jié)有符號整數(shù)的補碼
          long://8字節(jié)有符號整數(shù)的補碼
          float://4字節(jié)IEEE754單精度浮點數(shù)
          double://8字節(jié)IEEE754雙精度浮點數(shù)
          char://2字節(jié)無符號Unicode字符


          幾乎所有的Java類型檢查都是在編譯時完成的。上面列出的原始數(shù)據(jù)類型的數(shù)據(jù)在Java執(zhí)行時不需要用硬件標(biāo)記。操作這些原始數(shù)據(jù)類型數(shù)據(jù)的字節(jié)碼(指令)本身就已經(jīng)指出了操作數(shù)的數(shù)據(jù)類型,例如iadd、ladd、fadd和dadd指令都是把兩個數(shù)相加,其操作數(shù)類型別是int、long、float和double。虛擬機沒有給boolean(布爾)類型設(shè)置單獨的指令。boolean型的數(shù)據(jù)是由integer指令,包括integer返回來處理的。boolean型的數(shù)組則是用byte數(shù)組來處理的。虛擬機使用IEEE754格式的浮點數(shù)。不支持IEEE格式的較舊的計算機,在運行Java數(shù)值計算程序時,可能會非常慢。


          虛擬機支持的其它數(shù)據(jù)類型包括:
          object//對一個Javaobject(對象)的4字節(jié)引用
          returnAddress//4字節(jié),用于jsr/ret/jsr-w/ret-w指令
          注:Java數(shù)組被當(dāng)作object處理。


          虛擬機的規(guī)范對于object內(nèi)部的結(jié)構(gòu)沒有任何特殊的要求。在Sun公司的實現(xiàn)中,對object的引用是一個句柄,其中包含一對指針:一個指針指向該object的方法表,另一個指向該object的數(shù)據(jù)。用Java虛擬機的字節(jié)碼表示的程序應(yīng)該遵守類型規(guī)定。Java虛擬機的實現(xiàn)應(yīng)拒絕執(zhí)行違反了類型規(guī)定的字節(jié)碼程序。Java虛擬機由于字節(jié)碼定義的限制似乎只能運行于32位地址空間的機器上。但是可以創(chuàng)建一個Java虛擬機,它自動地把字節(jié)碼轉(zhuǎn)換成64位的形式。從Java虛擬機支持的數(shù)據(jù)類型可以看出,Java對數(shù)據(jù)類型的內(nèi)部格式進行了嚴(yán)格規(guī)定,這樣使得各種Java虛擬機的實現(xiàn)對數(shù)據(jù)的解釋是相同的,從而保證了Java的與平臺無關(guān)性和可
          移植性。


          二、Java虛擬機體系結(jié)構(gòu)


          Java虛擬機由五個部分組成:一組指令集、一組寄存器、一個棧、一個無用單元收集堆(Garbage-collected-heap)、一個方法區(qū)域。這五部分是Java虛擬機的邏輯成份,不依賴任何實現(xiàn)技術(shù)或組織方式,但它們的功能必須在真實機器上以某種方式實現(xiàn)。


          1.Java指令集


          Java虛擬機支持大約248個字節(jié)碼。每個字節(jié)碼執(zhí)行一種基本的CPU運算,例如,把一個整數(shù)加到寄存器,子程序轉(zhuǎn)移等。Java指令集相當(dāng)于Java程序的匯編語言。
          Java指令集中的指令包含一個單字節(jié)的操作符,用于指定要執(zhí)行的操作,還有0個或多個操作數(shù),提供操作所需的參數(shù)或數(shù)據(jù)。許多指令沒有操作數(shù),僅由一個單字節(jié)的操作符構(gòu)成。


          虛擬機的內(nèi)層循環(huán)的執(zhí)行過程如下:


          do{
          取一個操作符字節(jié);
          根據(jù)操作符的值執(zhí)行一個動作;
          }while(程序未結(jié)束)


          由于指令系統(tǒng)的簡單性,使得虛擬機執(zhí)行的過程十分簡單,從而有利于提高執(zhí)行的效率。指令中操作數(shù)的數(shù)量和大小是由操作符決定的。如果操作數(shù)比一個字節(jié)大,那么它存儲的順序是高位字節(jié)優(yōu)先。例如,一個16位的參數(shù)存放時占用兩個字節(jié),其值為:


          第一個字節(jié)*256+第二個字節(jié)字節(jié)碼指令流一般只是字節(jié)對齊的。指令tabltch和lookup是例外,在這兩條指令內(nèi)部要求強制的4字節(jié)邊界對齊。


          2.寄存器


          Java虛擬機的寄存器用于保存機器的運行狀態(tài),與微處理器中的某些專用寄存器類似。


          Java虛擬機的寄存器有四種:
          pc:Java程序計數(shù)器。
          optop:指向操作數(shù)棧頂端的指針。
          frame:指向當(dāng)前執(zhí)行方法的執(zhí)行環(huán)境的指針。
          vars:指向當(dāng)前執(zhí)行方法的局部變量區(qū)第一個變量的指針。


          Java虛擬機


          Java虛擬機是棧式的,它不定義或使用寄存器來傳遞或接受參數(shù),其目的是為了保證指令集的簡潔性和實現(xiàn)時的高效性(特別是對于寄存器數(shù)目不多的處理器)。
          所有寄存器都是32位的。


          3.棧


          Java虛擬機的棧有三個區(qū)域:局部變量區(qū)、運行環(huán)境區(qū)、操作數(shù)區(qū)。


          (1)局部變量區(qū) 每個Java方法使用一個固定大小的局部變量集。它們按照與vars寄存器的字偏移量來尋址。局部變量都是32位的。長整數(shù)和雙精度浮點數(shù)占據(jù)了兩個局部變量的空間,卻按照第一個局部變量的索引來尋址。(例如,一個具有索引n的局部變量,如果是一個雙精度浮點數(shù),那么它實際占據(jù)了索引n和n+1所代表的存儲空間。)虛擬機規(guī)范并不要求在局部變量中的64位的值是64位對齊的。虛擬機提供了把局部變量中的值裝載到操作數(shù)棧的指令,也提供了把操作數(shù)棧中的值寫入局部變量的指令。


          (2)運行環(huán)境區(qū) 在運行環(huán)境中包含的信息用于動態(tài)鏈接,正常的方法返回以及異常傳播。


          ·動態(tài)鏈接
          運行環(huán)境包括對指向當(dāng)前類和當(dāng)前方法的解釋器符號表的指針,用于支持方法代碼的動態(tài)鏈接。方法的class文件代碼在引用要調(diào)用的方法和要訪問的變量時使用符號。動態(tài)鏈接把符號形式的方法調(diào)用翻譯成實際方法調(diào)用,裝載必要的類以解釋還沒有定義的符號,并把變量訪問翻譯成與這些變量運行時的存儲結(jié)構(gòu)相應(yīng)的偏移地址。動態(tài)鏈接方法和變量使得方法中使用的其它類的變化不會影響到本程序的代碼。


          ·正常的方法返回
          如果當(dāng)前方法正常地結(jié)束了,在執(zhí)行了一條具有正確類型的返回指令時,調(diào)用的方法會得到一個返回值。執(zhí)行環(huán)境在正常返回的情況下用于恢復(fù)調(diào)用者的寄存器,并把調(diào)用者的程序計數(shù)器增加一個恰當(dāng)?shù)臄?shù)值,以跳過已執(zhí)行過的方法調(diào)用指令,然后在調(diào)用者的執(zhí)行環(huán)境中繼續(xù)執(zhí)行下去。


          ·異常和錯誤傳播
          異常情況在Java中被稱作Error(錯誤)或Exception(異常),是Throwable類的子類,在程序中的原因是:①動態(tài)鏈接錯,如無法找到所需的class文件。②運行時錯,如對一個空指針的引用


          ·程序使用了throw語句。
          當(dāng)異常發(fā)生時,Java虛擬機采取如下措施:
          ·檢查與當(dāng)前方法相聯(lián)系的catch子句表。每個catch子句包含其有效指令范圍,能夠處理的異常類型,以及處理異常的代碼塊地址。
          ·與異常相匹配的catch子句應(yīng)該符合下面的條件:造成異常的指令在其指令范圍之內(nèi),發(fā)生的異常類型是其能處理的異常類型的子類型。如果找到了匹配的catch子句,那么系統(tǒng)轉(zhuǎn)移到指定的異常處理塊處執(zhí)行;如果沒有找到異常處理塊,重復(fù)尋找匹配的catch子句的過程,直到當(dāng)前方法的所有嵌套的catch子句都被檢查過。
          ·由于虛擬機從第一個匹配的catch子句處繼續(xù)執(zhí)行,所以catch子句表中的順序是很重要的。因為Java代碼是結(jié)構(gòu)化的,因此總可以把某個方法的所有的異常處理器都按序排列到一個表中,對任意可能的程序計數(shù)器的值,都可以用線性的順序找到合適的異常處理塊,以處理在該程序計數(shù)器值下發(fā)生的異常情況。
          ·如果找不到匹配的catch子句,那么當(dāng)前方法得到一個"未截獲異常"的結(jié)果并返回到當(dāng)前方法的調(diào)用者,好像異常剛剛在其調(diào)用者中發(fā)生一樣。如果在調(diào)用者中仍然沒有找到相應(yīng)的異常處理塊,那么這種錯誤傳播將被繼續(xù)下去。如果錯誤被傳播到最頂層,那么系統(tǒng)將調(diào)用一個缺省的異常處理塊。
          (3)操作數(shù)棧區(qū) 機器指令只從操作數(shù)棧中取操作數(shù),對它們進行操作,并把結(jié)果返回到棧中。選擇棧結(jié)構(gòu)的原因是:在只有少量寄存器或非通用寄存器的機器(如Intel486)上,也能夠高效地模擬虛擬機的行為。操作數(shù)棧是32位的。它用于給方法傳遞參數(shù),并從方法接收結(jié)果,也用于支持操作的參數(shù),并保存操作的結(jié)果。例如,iadd指令將兩個整數(shù)相加。相加的兩個整數(shù)應(yīng)該是操作數(shù)棧頂?shù)膬蓚€字。這兩個字是由先前的指令壓進堆棧的。這兩個整數(shù)將從堆棧彈出、相加,并把結(jié)果壓回到操作數(shù)棧中。


          每個原始數(shù)據(jù)類型都有專門的指令對它們進行必須的操作。每個操作數(shù)在棧中需要一個存儲位置,除了long和double型,它們需要兩個位置。操作數(shù)只能被適用于其類型的操作符所操作。例如,壓入兩個int類型的數(shù),如果把它們當(dāng)作是一個long類型的數(shù)則是非法的。在Sun的虛擬機實現(xiàn)中,這個限制由字節(jié)碼驗證器強制實行。但是,有少數(shù)操作(操作符dupe和swap),用于對運行時數(shù)據(jù)區(qū)進行操作時是不考慮類型的。


          4.無用單元收集堆


          Java的堆是一個運行時數(shù)據(jù)區(qū),類的實例(對象)從中分配空間。Java語言具有無用單元收集能力:它不給程序員顯式釋放對象的能力。Java不規(guī)定具體使用的無用單元收集算法,可以根據(jù)系統(tǒng)的需求使用各種各樣的算法。


          5.方法區(qū)


          方法區(qū)與傳統(tǒng)語言中的編譯后代碼或是Unix進程中的正文段類似。它保存方法代碼(編譯后的java代碼)和符號表。在當(dāng)前的Java實現(xiàn)中,方法代碼不包括在無用單元收集堆中,但計劃在將來的版本中實現(xiàn)。每個類文件包含了一個Java類或一個Java界面的編譯后的代碼。可以說類文件是Java語言的執(zhí)行代碼文件。為了保證類文件的平臺無關(guān)性,Java虛擬機規(guī)范中對類文件的格式也作了詳細(xì)的說明。其具體細(xì)節(jié)請參考Sun公司的Java虛擬機規(guī)范。

          posted @ 2007-01-18 14:27 Lansing 閱讀(591) | 評論 (1)編輯 收藏
          Sun 提供的標(biāo)準(zhǔn) Java 開發(fā)包(JDK)沒有提供創(chuàng)建特定于平臺的可執(zhí)行文件的工具(一點都不吃驚,這是真的)。然而,其實有很多方法能夠幫助你實現(xiàn)這一想法。
            
            第三方工具
            一種方法是使用第三方商業(yè)工具或免費工具將 Java 應(yīng)用程序打包為一個可執(zhí)行文件。
            
            下面是價格和特性都不同的兩個工具,但是在 Web 上還有其它幾個第三方工具可以免費下載。
            
            http://www.bysoft.se/sureshot/exej/
            http://www.duckware.com/jexepack/
            使用商業(yè)安裝程序(installer)
            InstallAnywhere 是一個常用的安裝程序,它將管理應(yīng)用程序的安裝過程,并將應(yīng)用程序打包為可執(zhí)行程序。
            
            使用 .jar
            除了以上方法之外,還可以將應(yīng)用程序打包為一個可執(zhí)行的 .jar 文件,而不是一個 .exe 文件。在這篇文章中我將不詳細(xì)介紹這種方法,你可以在這里找到一個非常棒的在線教程
            
            你需要做的最重要的一件事是指定在 .jar 文件中哪個類是應(yīng)用程序的入口點。例如,對你的應(yīng)用程序來說就是具有一個 public static void main(String[] args) 方法的引導(dǎo)類。可以在 .jar 表示文件的 Main-Class 頭部信息中提供這些信息。這個頭部信息的通用形式為:Main-Class: classname,其中 classname 是應(yīng)用程序的入口點的類名稱。
            
            使用 Java Webstart
            Java Webstart 是標(biāo)準(zhǔn) Java 運行時環(huán)境(JRE)的隱藏的寶物,自從版本 1.3 開始,JRE 就包含了 Java Webstart。它是一個簡單但功能強大且靈活的將應(yīng)用程序部署到任何平臺的方法。
            
            Webstart 允許應(yīng)用程序的用戶從他們的瀏覽器、電子郵件或桌面啟動和管理應(yīng)用程序。Java Webstart 的一個主要優(yōu)點是一旦應(yīng)用程序被安裝,在每次啟動它時,它都將會檢查用戶是否在運行最新版本的應(yīng)用程序。如果不是,應(yīng)用程序?qū)⑼ㄟ^網(wǎng)絡(luò)裝載新版本到桌面然后執(zhí)行,因此解決了軟件傳播問題。
            
            如果你的應(yīng)用程序已經(jīng)有很多用戶的話,這一點就尤其重要。還有很重要的一點是,它能夠檢查用戶的本地桌面環(huán)境,并能保證他們安裝了正確的 JRE 版本來運行你的應(yīng)用程序。
            
            Java Webstart 本身有一系列文章,所以我建議你訪問 Java Webstart Web 站點查看更多文檔和教程。
            
            結(jié)束語
            前兩種方法可能會滿足你對這個問題的需要,但是我強烈建議你仔細(xì)看一下 Java Webstart。它是 Java 標(biāo)準(zhǔn)的一部分,并且能夠在所有平臺下一致工作。我比較喜歡這個應(yīng)用程序打包方法。
          posted @ 2007-01-18 14:21 Lansing 閱讀(703) | 評論 (0)編輯 收藏
               摘要: Lucene In Action ch 6(I) 筆記 --自定義排序 ----- 2006-2-16?????? 使用 Lucene 來搜索內(nèi)容,搜索結(jié)果的顯示順序當(dāng)然是比較重要的.Lucene中Build-in的幾個排序定義在大多數(shù)情況下是不適合我們使用的.要適合自己的應(yīng)用程序的場景,就只能自定義排序功能,本節(jié)...  閱讀全文
          posted @ 2007-01-05 10:27 Lansing 閱讀(728) | 評論 (0)編輯 收藏
               摘要: Lucene In Action ch 5 筆記 --高級搜索技術(shù) ----- 2006-2-15 該章介紹了Lucene的一些高級技術(shù),如 結(jié)果排序,搜索多個Index,過慮技術(shù)....下面就看看這些高級技巧吧. I.Sorting search results ...  閱讀全文
          posted @ 2007-01-05 10:25 Lansing 閱讀(613) | 評論 (0)編輯 收藏
               摘要: Lucene In Action ch 4 筆記(I) -- Analysis ----- 2006-2-12 本章詳細(xì)的討論了 Lucene的分析處理過程和幾個Analyzer. 在indexing過程中要把需要indexing的text分析處理一下, 經(jīng)過處理和切詞 然后建立index. 而不通的Ana...  閱讀全文
          posted @ 2007-01-05 10:14 Lansing 閱讀(1094) | 評論 (0)編輯 收藏
               摘要: 1. 實現(xiàn)一個簡單的search feature ?? 在本章中只限于討論簡單Lucene 搜索API, 有下面幾個相關(guān)的類: ?Lucene 基本搜索API: 類 ...  閱讀全文
          posted @ 2007-01-05 10:11 Lansing 閱讀(845) | 評論 (0)編輯 收藏
               摘要: Lucene In Action ch2 系統(tǒng)的講解了 indexing,下面就來看看吧. 1,indexing 的處理過程. ? 首先要把indexing的數(shù)據(jù)轉(zhuǎn)換為text,因為Lucene只能索引text,然后由Analysis來過慮text,把一些ch1中提到的所謂的stop words 過濾掉, 然后建...  閱讀全文
          posted @ 2007-01-05 10:10 Lansing 閱讀(841) | 評論 (0)編輯 收藏

          若人生是直線前進的,
          那么命中注定有若干的交點,
          認(rèn)識注定的人,
          欣賞注定的風(fēng)景...

          可人生還是有選擇的,
          那么道路也就多了些分叉口,
          錯過注定的人,
          錯過注定的風(fēng)景...

          若我曾經(jīng)再某個分叉路口選錯了方向卻遇到了注定的人,該感謝上蒼賜予我的福氣吧!
          可是人生又有了新的岔口,選擇有些艱難,但是面對幸福我很堅定!

          該怎么愛你

          我聽 過你的微笑
          就忘了 所有動蕩
          當(dāng)我靠過你的 那雙肩膀
          也就忘了 塵土飛楊
          我只是 一棵小草
          孤單的 微不足道
          當(dāng)你搬進我的小小國度
          我才相信 平凡的美好
          該怎么愛你 我才不會忘
          你的溫度 來過身旁
          就算哪一天 失去了方向
          愛過的 完整的 還在心上
          該怎么愛你 才可以盼望
          那種幸福 遠(yuǎn)遠(yuǎn)流長
          就怕這時間 讓我趕不上
          說一句 只一句 我曾到過天堂
          我相信最燦爛的一秒
          是守著你的眼光
          不是熱烈擁抱
          不是驚濤駭浪
          我相信最美麗的風(fēng)光
          是在彼此身旁
          有另一雙肩膀
          一起慢慢變老

          posted @ 2006-12-13 14:22 Lansing 閱讀(317) | 評論 (0)編輯 收藏
          ?本文主要面向具體使用,適用于已熟悉java編程的lucene初學(xué)者。
          1. Lucene的簡介


          1.1 Lucene 歷史


          ????? org.apache.lucene包是純java語言的全文索引檢索工具包。
          ????? Lucene的作者是資深的全文索引/檢索專家,最開始發(fā)布在他本人的主頁上,2001年10月貢獻給APACHE,成為APACHE基金jakarta的一個子項目。
          ????? 目前,lucene廣泛用于全文索引/檢索的項目中。
          ????? lucene也被翻譯成C#版本,目前發(fā)展為Lucene.Net(不過最近好象有流產(chǎn)的消息)。


          1.2 Lucene 原理


          ?????? lucene的檢索算法屬于索引檢索,即用空間來換取時間,對需要檢索的文件、字符流進行全文索引,在檢索的時候?qū)λ饕M行快速的檢索,得到檢索位置,這個位置記錄檢索詞出現(xiàn)的文件路徑或者某個關(guān)鍵詞。
          ?????? 在使用數(shù)據(jù)庫的項目中,不使用數(shù)據(jù)庫進行檢索的原因主要是:數(shù)據(jù)庫在非精確查詢的時候使用查詢語言“l(fā)ike %keyword%”,對數(shù)據(jù)庫進行查詢是對所有記錄遍歷,并對字段進行“%keyword%”匹配,在數(shù)據(jù)庫的數(shù)據(jù)龐大以及某個字段存儲的數(shù)據(jù)量龐大的時候,這種遍歷是致命的,它需要對所有的記錄進行匹配查詢。因此,lucene主要適用于文檔集的全文檢索,以及海量數(shù)據(jù)庫的模糊檢索,特別是對數(shù)據(jù)庫的xml或者大數(shù)據(jù)的字符類型。


          2.Lucene的下載和配置


          2.1 Lucene的下載


          ?????? lucene在jakarta項目中的發(fā)布主頁:http://jakarta.apache.org/lucene/docs/index.html。以下主要針對windows用戶,其它用戶請在上面的地址中查找相關(guān)下載。


          ?????? lucene的.jar包的下載(包括.jar和一個范例demo):
          http://apache.oregonstate.edu/jakarta/lucene/binaries/lucene-1.4-final.zip


          ??????? lucene的源代碼下載:
          http://www.signal42.com/mirrors/apache/jakarta/lucene/source/lucene-1.4-final-src.zip


          ?lucene的api地址:http://jakarta.apache.org/lucene/docs/api/index.html


          ?本文使用lucene版本:lucene-1.4-final.jar。


          2.2 lucene的配置


          ??????? 首先請確定你的機子已經(jīng)進行了java使用環(huán)境的基本配置,即確保在某個平臺下能夠運行java源代碼,否則請查閱相關(guān)文檔進行配置。
          ??????? 接下來進入lucene的配置:
          ??????? 普通使用者:在環(huán)境變量的CLASSPATH中添加lucene的位置。比如:“D:\java \lucene-1.4-final\lucene-1.4-final.jar;”。
          ?????? jbuilder使用者:在“Project”--“Project Properties”--“Required Libraries”進行添加。
          ?????? Jsp使用者:也可以直接將lucene-1.4-final.jar文件放到\WEB-INF\classes下。


          3. Lucene 的范例(Demo )


          3.1 Demo說明

          ?????
          ??????? 可以得到的Demo包括:lucene-demos-1.4-final、XMLIndexingDemo,lucene-demos-1.4-final中包括對普通文件和html文件的兩種索引,XMLIndexingDemo針對xml文件的索引。他們的區(qū)別主要在于:對普通文件進行索引時只要對文件的全文進行索引,而針對html、xml文件時,對標(biāo)簽類型不能進行索引,在實現(xiàn)上:html、xml的索引需要額外的數(shù)據(jù)流分析器,以分析哪些內(nèi)容有用哪些無用。因此,在后兩者實現(xiàn)上,索引的時間額外開支,甚至超過索引本身時間,而檢索時間沒有區(qū)別。


          ??????? 以上Demo中,lucene-demos-1.4-final自帶于lucene-1.4-final.zip中,XMLIndexingDemo的下載地址:
          http://cvs.apache.org/viewcvs.cgi/jakarta-lucene-sandbox/contributions/XML-Indexing-Demo/


          3.2 Demo的運行


          ????????首先將demo.jar的路徑添加如環(huán)境變量的CLASSPATH中,例如:“D:\java\lucene-1.4-final\lucene-demos-1.4-final.jar;”,同時確保已經(jīng)添加lucene-1.4-final.jar。


          ????????然后進行文件的全文索引,在dos控制臺中,輸入命令“java org.apache.lucene.demo.IndexFiles {full-path-to-lucene}/src”,后面的路徑為所要進行索引的文件夾,例如:“java org.apache.lucene.demo.IndexFiles c:\test”。


          ??????? 接著對索引進行檢索,敲入“java org.apache.lucene.demo.SearchFiles”,在提示“Query:”后輸入檢索詞,程序?qū)⑦M行檢索列出檢索得到的結(jié)果(檢索詞出現(xiàn)的文件路徑)。
          ?
          ?????? 其他Demo的運行請參考\docs\demo.html。
          ?????? 在運行Demo后請閱讀Demo的源代碼以便深入學(xué)習(xí)。

          4. 利用Lucene進行索引


          ??????? 進行l(wèi)ucene的熟悉后,我們將學(xué)習(xí)如何使用Lucene。
          ?一段索引的應(yīng)用實例:

          ??? //需要捕捉IOException異常
          ??? //建立一個IndexWriter,索引保存目錄為“index”
          ??? String[] stopStrs = {
          ??????? "他奶奶的", "fuck"};
          ??? StandardAnalyzer analyzer = new StandardAnalyzer(stopStrs);
          ??? IndexWriter writer = new IndexWriter("index", analyzer, true);
          ???
          ??? //添加一條文檔
          ??? Document doc = new Document();
          ??? doc.add(Field.UnIndexed("id", "1"));//“id”為字段名,“1”為字段值
          ??? doc.add(Field.Text("text", "fuck,他奶奶的,入門與使用"));
          ??? writer.addDocument(doc);
          ???
          ??? //索引完成后的處理
          ??? writer.optimize();
          ??? writer.close();

          ?????? 看完這段實例后,我們開始熟悉lucene的使用:

          4.1 Lucene的索引接口


          ?在學(xué)習(xí)索引的時候,首先需要熟悉幾個接口:


          4.1.1分析器Analyzer


          ??????? 分析器主要工作是篩選,一段文檔進來以后,經(jīng)過它,出去的時候只剩下那些有用的部分,其他則剔除。而這個分析器也可以自己根據(jù)需要而編寫。
          ??????? org.apache.lucene.analysis.Analyzer:這是一個虛構(gòu)類,以下兩個借口均繼承它而來。


          ????????org.apache.lucene.analysis.SimpleAnalyzer:分析器,支持最簡單拉丁語言。


          ????????org.apache.lucene.analysis.standard.StandardAnalyzer:標(biāo)準(zhǔn)分析器,除了拉丁語言還支持亞洲語言,并在一些匹配功能上進行完善。在這個接口中還有一個很重要的構(gòu)造函數(shù):StandardAnalyzer(String[] stopWords),可以對分析器定義一些使用詞語,這不僅可以免除檢索一些無用信息,而且還可以在檢索中定義禁止的政治性、非法性的檢索關(guān)鍵詞。


          4.1.2 IndexWriter


          ????????IndexWriter的構(gòu)造函數(shù)有三種接口,針對目錄Directory、文件File、文件路徑String三種情況。
          例如IndexWriter(String path, Analyzer a, boolean create),path為文件路徑,a為分析器,create標(biāo)志是否重建索引(true:建立或者覆蓋已存在的索引,false:擴展已存在的索引。)
          ?????? 一些重要的方法:

          接口名

          備注

          addDocument(Document doc)

          索引添加一個文檔

          addIndexes(Directory[] dirs)

          將目錄中已存在索引添加到這個索引

          addIndexes(IndexReader[] readers)

          將提供的索引添加到這個索引

          optimize()

          合并索引并優(yōu)化

          close()

          關(guān)閉


          ?????? IndexWriter為了減少大量的io維護操作,在每得到一定量的索引后建立新的小索引文件(筆者測試索引批量的最小單位為10),然后再定期將它們整合到一個索引文件中,因此在索引結(jié)束時必須進行wirter. optimize(),以便將所有索引合并優(yōu)化。


          4.1.3 org.apache.lucene.document


          ?以下介紹兩種主要的類:
          ?a)org.apache.lucene.document.Document:
          ????????Document文檔類似數(shù)據(jù)庫中的一條記錄,可以由好幾個字段(Field)組成,并且字段可以套用不同的類型(詳細(xì)見b)。Document的幾種接口:
          ?

          接口名

          備注

          add(Field field)

          添加一個字段(Field)到Document

          String get(String name)

          從文檔中獲得一個字段對應(yīng)的文本

          Field getField(String name)

          由字段名獲得字段值

          Field[] getFields(String name)

          由字段名獲得字段值的集


          ?b)org.apache.lucene.document.Field
          ??????? 即上文所說的“字段”,它是Document的片段section。
          ??????? Field的構(gòu)造函數(shù):
          ?????? Field(String name, String string, boolean store, boolean index, boolean token)。
          ??????? Indexed:如果字段是Indexed的,表示這個字段是可檢索的。
          ????????Stored:如果字段是Stored的,表示這個字段的值可以從檢索結(jié)果中得到。
          ????????Tokenized:如果一個字段是Tokenized的,表示它是有經(jīng)過Analyzer轉(zhuǎn)變后成為一個tokens序列,在這個轉(zhuǎn)變過程tokenization中,Analyzer提取出需要進行索引的文本,而剔除一些冗余的詞句(例如:a,the,they等,詳見org.apache.lucene.analysis.StopAnalyzer.ENGLISH_STOP_WORDS和org.apache.lucene.analysis.standard.StandardAnalyzer(String[] stopWords)的API)。Token是索引時候的基本單元,代表一個被索引的詞,例如一個英文單詞,或者一個漢字。因此,所有包含中文的文本都必須是Tokenized的。
          ???? Field的幾種接口:

          Name

          Stored

          Indexed

          Tokenized

          use

          Keyword(String name,

          ??????? String value)

          Y

          Y

          N

          date,url

          Text(String name, Reader value)

          N

          Y

          Y

          short text fields:

          title,subject

          Text(String name, String value)

          Y

          Y

          Y

          longer text fields,

          like “body”

          UnIndexed(String name,

          String value)

          Y

          N

          N

          ?

          UnStored(String name,

          ???????? String value)

          N

          Y

          Y

          ?

          ?


          5. 利用Lucene進行檢索


          5.1 一段簡單的檢索代碼

          ?

          ??? //需要捕捉IOException,ParseException異常
          ??? //處理檢索條件
          ??? Query query = QueryParser.parse("入門", "text", analyzer);

          ??? //檢索
          ??? Searcher searcher = new IndexSearcher("./index");//"index"指定索引文件位置
          Hits hits = searcher.search(query);

          ??? //打印結(jié)果值集
          ??? for (int i = 0; i < hits.length(); i++) {
          ????? doc = hits.doc(i);
          ????? String id = doc.get("id");
          ????? System.out.println("found " + "入門" + " on the id:" + id);
          }

          ?

          5.2 利用Lucene的檢索接口


          5.2.1 Query與QueryParser


          ??????? 主要使用方法:
          QueryParser .parse(String query, String field, Analyzer analyzer),例如:
          Query query = QueryParser.parse("入門", "text", analyzer);
          "入門"為檢索詞, "text"為檢索的字段名, analyzer為分析器


          5.2.2 Hits與Searcher


          ?????? Hits的主要使用接口:
          ?

          接口名

          備注

          Doc(int n)

          返回第n個的文檔的所有字段

          length()

          返回這個集中的可用個數(shù)

          ?


          6. Lucene的其他使用


          6.1 Lucene 的索引修改


          ??????? 下面給出一段修改索引的代碼,請根據(jù)Lucene的API解讀:


          ? /**
          ?? * 對已有的索引添加新的一條索引
          ?? * @param idStr String:要修改的id
          ?? * @param doc Document:要修改的值
          ?? */
          ? public void addIndex(String idStr, String valueStr) {
          ??? StandardAnalyzer analyzer = new StandardAnalyzer();
          ??? IndexWriter writer = null;
          ??? try {
          ????? writer = new IndexWriter(indexPath, analyzer, false);
          ????? writer.mergeFactor = 2; //修正lucene 1.4.2 bug,不添加則不合并原有索引

          ?????? ?? Document doc = new Document();
          ????????? doc.add(Field.UnIndexed("id", idStr));//“id”為字段名,“1”為字段值
          ????????? doc.add(Field.Text("text", valueStr));
          ????? writer.addDocument(doc);

          ????? writer.optimize();
          ????? writer.close();
          ??? }
          ??? catch (IOException ioe) {
          ????? ioe.printStackTrace();
          ??? }
          ? }

          ? /**
          ?? * 刪除索引
          ?? *
          ?? * @param idStr String
          ?? */
          ? public void deleteIndex(String idStr) {
          ??? try {
          ????? Directory dirt = FSDirectory.getDirectory(indexPath, false);
          ????? IndexReader reader = IndexReader.open(dirt);
          ????? IndexXML.deleteIndex(idStr, reader);
          ????? reader.close();
          ????? dirt.close();
          ??? }
          ??? catch (IOException ioe) {
          ????? ioe.printStackTrace();
          ??? }
          ? }


          6.2 Lucene 的檢索結(jié)果排序


          ??????? Lucene的排序主要是對org.apache.lucene.search.Sort的使用。Sort可以直接根據(jù)字段Field生成,也可以根據(jù)標(biāo)準(zhǔn)的SortField生成,但是作為Sort的字段,必須符合以下的條件:唯一值以及Indexed。可以對Integers, Floats, Strings三種類型排序。
          ??????? 對整數(shù)型的ID檢索結(jié)果排序只要進行以下的簡單操作:

          ?Sort sort = new Sort("id");
          Hits hits = searcher.search(query, sort);

          ?????? 用戶還可以根據(jù)自己定義更加復(fù)雜的排序,詳細(xì)請參考API。


          7 總結(jié)


          ??????? Lucene給java的全文索引檢索帶來了非常強大的力量,以上僅對Lucene進行簡單的入門說明。

          posted @ 2006-11-08 14:59 Lansing 閱讀(349) | 評論 (0)編輯 收藏

          Lucene提供了方便您創(chuàng)建自建查詢的API,也通過QueryParser提供了強大的查詢語言。

          本文講述Lucene的查詢語句解析器支持的語法,Lucene的查詢語句解析器是使用JavaCC工

          具生成的詞法解析器,它將查詢字串解析為Lucene Query對象。
          項(Term)
          一條搜索語句被拆分為一些項(term)和操作符(operator)。項有兩種類型:單獨項和

          短語。
          單獨項就是一個單獨的單詞,例如"test" , "hello"。
          短語是一組被雙引號包圍的單詞,例如"hello dolly"。
          多個項可以用布爾操作符連接起來形成復(fù)雜的查詢語句(接下來您就會看到)。
          注意:Analyzer建立索引時使用的解析器和解析單獨項和短語時的解析器相同,因此選擇

          一個不會受查詢語句干擾的Analyzer非常重要。luence1.4的StandardAnalyzer的解析器已

          經(jīng)支持中文等亞洲國家的文字了,可以直接。標(biāo)準(zhǔn)的解析其不支持中文。

          域(Field)
          Lucene支持域。您可以指定在某一個域中搜索,或者就使用默認(rèn)域。域名及默認(rèn)域是具體

          索引器實現(xiàn)決定的。(怎么定制默認(rèn)域?)
          您可以這樣搜索域:域名+":"+搜索的項名。
          舉個例子,假設(shè)某一個Lucene索引包含兩個域,title和text,text是默認(rèn)域。如果您想查

          找標(biāo)題為"The Right Way"且含有"don't go this way"的文章,您可以輸入:
          title:"The Right Way" AND text:go
          或者
          title:"Do it right" AND right
          因為text是默認(rèn)域,所以這個域名可以不行。
          注意:域名只對緊接于其后的項生效,所以
          title:Do it right
          只有"Do"屬于title域。"it"和"right"仍將在默認(rèn)域中搜索(這里是text域)。

          項修飾符(Term Modifiers)
          Lucene支持項修飾符以支持更寬范圍的搜索選項。
          用通配符搜索
          Lucene支持單個與多個字符的通配搜索。
          使用符號"?"表示單個任意字符的通配。
          使用符號"*"表示多個任意字符的通配。
          單個任意字符匹配的是所有可能單個字符。例如,搜索"text或者"test",可以這樣:

          te?t
          多個任意字符匹配的是0個及更多個可能字符。例如,搜索test, tests 或者 tester,可

          以這樣: test*
          您也可以在字符竄中間使用多個任意字符通配符。 te*t
          注意:您不能在搜索的項開始使用*或者?符號。

          模糊查詢
          Lucene支持基于Levenshtein Distance與Edit Distance算法的模糊搜索。要使用模糊搜索

          只需要在單獨項的最后加上符號"~"。例如搜索拼寫類似于"roam"的項這樣寫:
          roam~
          這次搜索將找到形如foam和roams的單詞。
          注意:使用模糊查詢將自動得到增量因子(boost factor)為0.2的搜索結(jié)果.

          鄰近搜索(Proximity Searches)
          Lucene還支持查找相隔一定距離的單詞。鄰近搜索是在短語最后加上符號"~"。例如在文檔

          中搜索相隔10個單詞的"apache"和"jakarta",這樣寫: "jakarta apache"~10

          Boosting a Term
          Lucene provides the relevance level of matching documents based on the terms

          found. To boost a term use the caret, "^", symbol with a boost factor (a

          number) at the end of the term you are searching. The higher the boost factor,

          the more relevant the term will be.
          Lucene可以設(shè)置在搜索時匹配項的相似度。在項的最后加上符號"^"緊接一個數(shù)字(增量值

          ),表示搜索時的相似度。增量值越高,搜索到的項相關(guān)度越好。
          Boosting allows you to control the relevance of a document by boosting its

          term. For example, if you are searching for jakarta apache and you want the

          term "jakarta" to be more relevant boost it using the ^ symbol along with the

          boost factor next to the term. You would type:
          通過增量一個項可以控制搜索文檔時的相關(guān)度。例如如果您要搜索jakarta apache,同時

          您想讓"jakarta"的相關(guān)度更加好,那么在其后加上"^"符號和增量值,也就是您輸入:
          jakarta^4 apache
          This will make documents with the term jakarta appear more relevant. You can

          also boost Phrase Terms as in the example:
          這將使得生成的doucment盡可能與jakarta相關(guān)度高。您也可以增量短語,象以下這個例子

          一樣:
          "jakarta apache"^4 "jakarta lucene"

          By default, the boost factor is 1. Although, the boost factor must be positive,

          it can be less than 1 (i.e. .2)
          默認(rèn)情況下,增量值是1。增量值也可以小于1(例如0.2),但必須是有效的。

          布爾操作符
          布爾操作符可將項通過邏輯操作連接起來。Lucene支持AND, "+", OR, NOT 和 "-"這些操

          作符。(注意:布爾操作符必須全部大寫)

          OR
          OR操作符是默認(rèn)的連接操作符。這意味著如果兩個項之間沒有布爾操作符,就是使用OR操

          作符。OR操作符連接兩個項,意味著查找含有任意項的文檔。這與集合并運算相同。符號

          ||可以代替符號OR。
          搜索含有"jakarta apache" 或者 "jakarta"的文檔,可以使用這樣的查詢:
          "jakarta apache" jakarta 或者 "jakarta apache" OR jakarta

          AND
          AND操作符匹配的是兩項同時出現(xiàn)的文檔。這個與集合交操作相等。符號&&可以代替符號

          AND。
          搜索同時含有"jakarta apache" 與 "jakarta lucene"的文檔,使用查詢:
          "jakarta apache" AND "jakarta lucene"

          +
          "+"操作符或者稱為存在操作符,要求符號"+"后的項必須在文檔相應(yīng)的域中存在。
          搜索必須含有"jakarta",可能含有"lucene"的文檔,使用查詢:
          +jakarta apache

          NOT
          NOT操作符排除那些含有NOT符號后面項的文檔。這和集合的差運算相同。符號!可以代替

          符號NOT。
          搜索含有"jakarta apache",但是不含有"jakarta lucene"的文檔,使用查詢:
          "jakarta apache" NOT "jakarta lucene"
          注意:NOT操作符不能單獨與項使用構(gòu)成查詢。例如,以下的查詢查不到任何結(jié)果:
          NOT "jakarta apache"

          -
          "-"操作符或者禁止操作符排除含有"-"后面的相似項的文檔。
          搜索含有"jakarta apache",但不是"jakarta lucene",使用查詢:
          "jakarta apache" -"jakarta lucene"

          分組(Grouping)
          Lucene支持使用圓括號來組合字句形成子查詢。這對于想控制查詢布爾邏輯的人十分有用


          搜索含有"jakarta"或者"apache",同時含有"website"的文檔,使用查詢:
          (jakarta OR apache) AND website
          這樣就消除了歧義,保證website必須存在,jakarta和apache中之一也存在。
          轉(zhuǎn)義特殊字符(Escaping Special Characters)
          Lucene支持轉(zhuǎn)義特殊字符,因為特殊字符是查詢語法用到的。現(xiàn)在,特殊字符包括
          + - && || ! ( ) { } [ ] ^ " ~ * ? : \
          轉(zhuǎn)義特殊字符只需在字符前加上符號\,例如搜索(1+1):2,使用查詢
          \(1\+1\)\:2??
          (李宇翻譯,來自Lucene的幫助文檔)上面這段看了之后很有幫助,解除了使用中的不少

          疑惑,謝謝翻譯者,同時應(yīng)該看到,有的時候詳細(xì)查看使用幫助文檔是非常有用的。
          ------------------------------------------------------------------------------
          索引文件格式

          本文定義了Lucene(版本1.3)用到的索引文件的格式。
          Jakarta Lucene是用Java寫成的,同時有很多團體正在默默的用其他的程序語言來改寫它

          。如果這些新的版本想和Jakarta Lucene兼容,就需要一個與具體語言無關(guān)的Lucene索引

          文件格式。本文正是試圖提供一個完整的與語言無關(guān)的Jakarta Lucene 1.3索引文件格式

          的規(guī)格定義。
          隨著Lucene不斷發(fā)展,本文也應(yīng)該更新。不同語言寫成的Lucene實現(xiàn)版本應(yīng)當(dāng)盡力遵守文

          件格式,也必須產(chǎn)生本文的新版本。
          本文同時提供兼容性批注,描述文件格式上與前一版本不同的地方。

          定義
          Lucene中最基礎(chǔ)的概念是索引(index),文檔(document),域(field)和項(term)


          索引包含了一個文檔的序列。
          · 文檔是一些域的序列。
          · 域是一些項的序列。
          · 項就是一個字串。
          存在于不同域中的同一個字串被認(rèn)為是不同的項。因此項實際是用一對字串表示的,第一

          個字串是域名,第二個是域中的字串。

          倒排索引
          為了使得基于項的搜索更有效率,索引中項是靜態(tài)存儲的。Lucene的索引屬于索引方式中

          的倒排索引,因為對于一個項這種索引可以列出包含它的文檔。這剛好是文檔與項自然聯(lián)

          系的倒置。

          域的類型
          Lucene中,域的文本可能以逐字的非倒排的方式存儲在索引中。而倒排過的域稱為被索引

          過了。域也可能同時被存儲和被索引。
          域的文本可能被分解許多項目而被索引,或者就被用作一個項目而被索引。大多數(shù)的域是

          被分解過的,但是有些時候某些標(biāo)識符域被當(dāng)做一個項目索引是很有用的。

          段(Segment)
          Lucene索引可能由多個子索引組成,這些子索引成為段。每一段都是完整獨立的索引,能

          被搜索。索引是這樣作成的:
          1. 為新加入的文檔創(chuàng)建新段。
          2. 合并已經(jīng)存在的段。
          搜索時需要涉及到多個段和/或者多個索引,每一個索引又可能由一些段組成。

          文檔號(Document Number)
          內(nèi)部的來說,Lucene用一個整形(interger)的文檔號來指示文檔。第一個被加入到索引

          中的文檔就是0號,順序加入的文檔將得到一個由前一個號碼遞增而來的號碼。
          注意文檔號是可能改變的,所以在Lucene外部存儲這些號碼時必須小心。特別的,號碼的

          改變的情況如下:
          · 只有段內(nèi)的號碼是相同的,不同段之間不同,因而在一個比段廣泛的上下文環(huán)境中使用

          這些號碼時,就必須改變它們。標(biāo)準(zhǔn)的技術(shù)是根據(jù)每一段號碼多少為每一段分配一個段號

          。將段內(nèi)文檔號轉(zhuǎn)換到段外時,加上段號。將某段外的文檔號轉(zhuǎn)換到段內(nèi)時,根據(jù)每段中

          可能的轉(zhuǎn)換后號碼范圍來判斷文檔屬于那一段,并減調(diào)這一段的段號。例如有兩個含5個文

          檔的段合并,那么第一段的段號就是0,第二段段號5。第二段中的第三個文檔,在段外的

          號碼就是8。
          · 文檔刪除后,連續(xù)的號碼就出現(xiàn)了間斷。這可以通過合并索引來解決,段合并時刪除的

          文檔相應(yīng)也刪掉了,新合并而成的段并沒有號碼間斷。

          緒論
          索引段維護著以下的信息:
          · 域集合。包含了索引中用到的所有的域。
          · 域值存儲表。每一個文檔都含有一個“屬性-值”對的列表,屬性即為域名。這個列表

          用來存儲文檔的一些附加信息,如標(biāo)題,url或者訪問數(shù)據(jù)庫的一個ID。在搜索時存儲域的

          集合可以被返回。這個表以文檔號標(biāo)識。
          · 項字典。這個字典含有所有文檔的所有域中使用過的的項,同時含有使用過它的文檔的

          文檔號,以及指向使用頻數(shù)信息和位置信息的指針。
          · 項頻數(shù)信息。對于項字典中的每個項,這些信息包含含有這個項的文檔的總數(shù),以及每

          個文檔中使用的次數(shù)。
          · 項位置信息。對于項字典中的每個項,都存有在每個文檔中出現(xiàn)的各個位置。
          · Normalization factors. For each field in each document, a value is stored

          that is multiplied into the score for hits on that field. 標(biāo)準(zhǔn)化因子。對于文檔

          中的每一個域,存有一個值,用來以后乘以這個這個域的命中數(shù)(hits)。
          · 被刪除的文檔信息。這是一個可選文件,用來表明那些文檔已經(jīng)刪除了。
          接下來的各部分部分詳細(xì)描述這些信息。

          文件的命名(File Naming)
          同屬于一個段的文件擁有相同的文件名,不同的擴展名。擴展名由以下討論的各種文件格

          式確定。
          一般來說,一個索引存放一個目錄,其所有段都存放在這個目錄里,盡管我們不要求您這

          樣做。

          基本數(shù)據(jù)類型(Primitive Types)

          Byte
          最基本的數(shù)據(jù)類型就是字節(jié)(byte,8位)。文件就是按字節(jié)順序訪問的。其它的一些數(shù)據(jù)

          類型也定義為字節(jié)的序列,文件的格式具有字節(jié)意義上的獨立性。

          UInt32
          32位無符號整數(shù),由四個字節(jié)組成,高位優(yōu)先。

          UInt32 --> <Byte>4
          Uint64
          64位無符號整數(shù),由八字節(jié)組成,高位優(yōu)先。

          UInt64 --> <Byte>8
          VInt
          可變長的正整數(shù)類型,每字節(jié)的最高位表明還剩多少字節(jié)。每字節(jié)的低七位表明整數(shù)的值

          。因此單字節(jié)的值從0到127,兩字節(jié)值從128到16,383,等等。

          VInt 編碼示例
          Value
          First byte
          Second byte
          Third byte

          0
          00000000
          1
          00000001
          2
          00000010
          ...
          127
          01111111
          128
          10000000
          00000001
          129
          10000001
          00000001
          130
          10000010
          00000001
          ...
          16,383
          11111111
          01111111
          16,384
          10000000
          10000000
          00000001
          16,385
          10000001
          10000000
          00000001
          ...

          這種編碼提供了一種在高效率解碼時壓縮數(shù)據(jù)的方法。

          Chars
          Lucene輸出UNICODE字符序列,使用標(biāo)準(zhǔn)UTF-8編碼。

          String
          Lucene輸出由VINT和字符串組成的字串,VINT表示字串長,字符串緊接其后。
          String --> VInt, Chars

          索引包含的文件(Per-Index Files)
          這部分介紹每個索引包含的文件。

          Segments文件
          索引中活動的段存儲在Segments文件中。每個索引只能含有一個這樣的文件,名

          為"segments".這個文件依次列出每個段的名字和每個段的大小。
          Segments --> SegCount, <SegName, SegSize>SegCount
          SegCount, SegSize --> UInt32
          SegName --> String
          SegName表示該segment的名字,同時作為索引其他文件的前綴。
          SegSize是段索引中含有的文檔數(shù)。

          Lock文件
          有一些文件用來表示另一個進程在使用索引。
          · 如果存在"commit.lock"文件,表示有進程在寫"segments"文件和刪除無用的段索引文

          件,或者表示有進程在讀"segments"文件和打開某些段的文件。在一個進程在讀

          取"segments"文件段信息后,還沒來得及打開所有該段的文件前,這個Lock文件可以防止

          另一個進程刪除這些文件。
          · 如果存在"index.lock"文件,表示有進程在向索引中加入文檔,或者是從索引中刪除文

          檔。這個文件防止很多文件同時修改一個索引。

          Deleteable文件
          名為"deletetable"的文件包含了索引不再使用的文件的名字,這些文件可能并沒有被實際

          的刪除。這種情況只存在與Win32平臺下,因為Win32下文件仍打開時并不能刪除。
          Deleteable --> DelableCount, <DelableName>DelableCount
          DelableCount --> UInt32
          DelableName --> String

          段包含的文件(Per-Segment Files)
          剩下的文件是每段中包含的文件,因此由后綴來區(qū)分。
          域(Field)
          域集合信息(Field Info)
          所有域名都存儲在這個文件的域集合信息中,這個文件以后綴.fnm結(jié)尾。
          FieldInfos (.fnm) --> FieldsCount, <FieldName, FieldBits>FieldsCount
          FieldsCount --> VInt
          FieldName --> String
          FieldBits --> Byte
          目前情況下,F(xiàn)ieldBits只有使用低位,對于已索引的域值為1,對未索引的域值為0。
          文件中的域根據(jù)它們的次序編號。因此域0是文件中的第一個域,域1是接下來的,等等。

          這個和文檔號的編號方式相同。
          域值存儲表(Stored Fields)
          域值存儲表使用兩個文件表示:

          1. 域索引(.fdx文件)。
          如下,對于每個文檔這個文件包含指向域值的指針:
          FieldIndex (.fdx) --> <FieldValuesPosition>SegSize
          FieldValuesPosition --> Uint64
          FieldValuesPosition指示的是某一文檔的某域的域值在域值文件中的位置。因為域值文件

          含有定長的數(shù)據(jù)信息,因而很容易隨機訪問。在域值文件中,文檔n的域值信息就存在n*8

          位置處(The position of document n's field data is the Uint64 at n*8 in this

          file.)。

          2. 域值(.fdt文件)。
          如下,每個文檔的域值信息包含:
          FieldData (.fdt) --> <DocFieldData>SegSize
          DocFieldData --> FieldCount, <FieldNum, Bits, Value>FieldCount
          FieldCount --> VInt
          FieldNum --> VInt
          Bits --> Byte
          Value --> String
          目前情況下,Bits只有低位被使用,值為1表示域名被分解過,值為0表示未分解過。

          項字典(Term Dictionary)
          項字典用以下兩個文件表示:
          1. 項信息(.tis文件)。
          TermInfoFile (.tis)--> TermCount, TermInfos
          TermCount --> UInt32
          TermInfos --> <TermInfo>TermCount
          TermInfo --> <Term, DocFreq, FreqDelta, ProxDelta>
          Term --> <PrefixLength, Suffix, FieldNum>
          Suffix --> String
          PrefixLength, DocFreq, FreqDelta, ProxDelta
          --> VInt
          項信息按項排序。項信息排序時先按項所屬的域的文字順序排序,然后按照項的字串的文

          字順序排序。
          項的字前綴往往是共同的,與字的后綴組成字。PrefixLength變量就是表示與前一項相同

          的前綴的字?jǐn)?shù)。因此,如果前一個項的字是"bone",后一個是"boy"的話,PrefixLength值

          為2,Suffix值為"y"。

          FieldNum指明了項屬于的域號,而域名存儲在.fdt文件中。
          DocFreg表示的是含有該項的文檔的數(shù)量。
          FreqDelta指明了項所屬TermFreq變量在.frq文件中的位置。詳細(xì)的說,就是指相對于前一

          個項的數(shù)據(jù)的位置偏移量(或者是0,表示文件中第一個項)。
          ProxDelta指明了項所屬的TermPosition變量在.prx文件中的位置。詳細(xì)的說,就是指相對

          于前一個項的數(shù)據(jù)的位置偏移量(或者是0,表示文件中第一個項)。

          2. 項信息索引(.tii文件)。
          每個項信息索引文件包含.tis文件中的128個條目,依照條目在.tis文件中的順序。這樣設(shè)

          計是為了一次將索引信息讀入內(nèi)存能,然后使用它來隨機的訪問.tis文件。
          這個文件的結(jié)構(gòu)和.tis文件非常類似,只在每個條目記錄上增加了一個變量IndexDelta。
          TermInfoIndex (.tii)--> IndexTermCount, TermIndices
          IndexTermCount --> UInt32
          TermIndices --> <TermInfo, IndexDelta>IndexTermCount
          IndexDelta --> VInt
          IndexDelta表示該項的TermInfo變量值在.tis文件中的位置。詳細(xì)的講,就是指相對于前

          一個條目的偏移量(或者是0,對于文件中第一個項)。

          項頻數(shù)(Frequencies)
          .frq文件包含每一項的文檔的列表,還有該項在對應(yīng)文檔中出現(xiàn)的頻數(shù)。
          FreqFile (.frq) --> <TermFreqs>TermCount
          TermFreqs --> <TermFreq>DocFreq
          TermFreq --> DocDelta, Freq?
          DocDelta,Freq --> VInt
          TermFreqs序列按照項來排序(依據(jù)于.tis文件中的項,即項是隱含存在的)。
          TermFreq元組按照文檔號升序排列。
          DocDelta決定了文檔號和頻數(shù)。詳細(xì)的說,DocDelta/2表示相對于前一文檔號的偏移量(

          或者是0,表示這是TermFreqs里面的第一項)。當(dāng)DocDelta是奇數(shù)時表示在該文檔中頻數(shù)

          為1,當(dāng)DocDelta是偶數(shù)時,另一個VInt(Freq)就表示在該文檔中出現(xiàn)的頻數(shù)。
          例如,假設(shè)某一項在文檔7中出現(xiàn)一次,在文檔11中出現(xiàn)了3次,在TermFreqs中就存在如下

          的VInts序列: 15, 22, 3

          項位置(Position)
          .prx文件包含了某文檔中某項出現(xiàn)的位置信息的列表。
          ProxFile (.prx) --> <TermPositions>TermCount
          TermPositions --> <Positions>DocFreq
          Positions --> <PositionDelta>Freq
          PositionDelta --> VInt
          TermPositions按照項來排序(依據(jù)于.tis文件中的項,即項是隱含存在的)。
          Positions元組按照文檔號升序排列。
          PositionDelta是相對于前一個出現(xiàn)位置的偏移位置(或者為0,表示這是第一次在這個文

          檔中出現(xiàn))。
          例如,假設(shè)某一項在某文檔第4項出現(xiàn),在另一個文檔中第5項和第9項出現(xiàn),將存在如下的

          VInt序列: 4, 5, 4

          標(biāo)準(zhǔn)化因子(Normalization Factor)
          .nrm文件包含了每個文檔的標(biāo)準(zhǔn)化因子,標(biāo)準(zhǔn)化因子用來以后乘以這個這個域的命中數(shù)。
          Norms (.nrm) --> <Byte>SegSize
          每個字節(jié)記錄一個浮點數(shù)。位0-2包含了3位的尾數(shù)部分,位3-8包含了5位的指數(shù)部分。
          按如下規(guī)則可將這些字節(jié)轉(zhuǎn)換為IEEE標(biāo)準(zhǔn)單精度浮點數(shù):
          1. 如果該字節(jié)是0,就是浮點0;
          2. 否則,設(shè)置新浮點數(shù)的標(biāo)志位為0;
          3. 將字節(jié)中的指數(shù)加上48后作為新的浮點數(shù)的指數(shù);
          4. 將字節(jié)中的尾數(shù)映射到新浮點數(shù)尾數(shù)的高3位;并且
          5. 設(shè)置新浮點數(shù)尾數(shù)的低21位為0。

          被刪除的文檔(Deleted Document)
          .del文件是可選的,只有在某段中存在刪除操作后才存在:
          Deletions (.del) --> ByteCount,BitCount,Bits
          ByteSize,BitCount --> Uint32
          Bits --> <Byte>ByteCount
          ByteCount表示的是Bits列表中Byte的數(shù)量。典型的,它等于(SegSize/8)+1。
          BitCount表示Bits列表中多少個已經(jīng)被設(shè)置過了。
          Bits列表包含了一些位(bit),順序表示一個文檔。當(dāng)對應(yīng)于文檔號的位被設(shè)置了,就標(biāo)

          志著這個文檔已經(jīng)被刪除了。位的順序是從低到高。因此,如果Bits包含兩個字節(jié),0x00

          和0x02,那么表示文檔9已經(jīng)刪除了。

          局限性(Limitations)
          在以上的文件格式中,好幾處都有限制項和文檔的最大個數(shù)為32位數(shù)的極限,即接近于40

          億。今天看來,這不會造成問題,但是,長遠(yuǎn)的看,可能造成問題。因此,這些極限應(yīng)該

          或者換為UInt64類型的值,或者更好的,換為VInt類型的值(VInt值沒有上限)。
          有兩處地方的代碼要求必須是定長的值,他們是:
          1. FieldValuesPosition變量(存儲于域索引文件中,.fdx文件)。它已經(jīng)是一個UInt64

          型,所以不會有問題。
          2. TermCount變量(存儲于項信息文件中,.tis文件)。這是最后輸出到文件中的,但是

          最先被讀取,因此是存儲于文件的最前端 。索引代碼先在這里寫入一個0值,然后在其他

          文件輸出完畢后覆蓋這個值。所以無論它存儲在什么地方,它都必須是一個定長的值,它

          應(yīng)該被變成UInt64型。
          除此之外,所有的UInt值都可以換成VInt型以去掉限制
          ------------------------------------------------------------------------------

          ---------
          下面是lucene組成結(jié)構(gòu)中的類說明:
          org.apache.Lucene.search/ 搜索入口
          org.apache.Lucene.index/ 索引入口
          org.apache.Lucene.analysis/ 語言分析器
          org.apache.Lucene.queryParser/ 查詢分析器
          org.apache.Lucene.document/ 存儲結(jié)構(gòu)
          org.apache.Lucene.store/? 底層IO/存儲結(jié)構(gòu)
          org.apache.Lucene.util/ 一些公用的數(shù)據(jù)結(jié)構(gòu)

          域存儲字段規(guī)則
          方法 切詞 索引 存儲 用途
          Field.Text(String name, String value) 切分詞索引并存儲,比如:標(biāo)題,內(nèi)容字段
          Field.Text(String name, Reader value)? 切分詞索引不存儲,比如:META信息,
          不用于返回顯示,但需要進行檢索內(nèi)容
          Field.Keyword(String name, String value)? 不切分索引并存儲,比如:日期字段
          Field.UnIndexed(String name, String value)? 不索引,只存儲,比如:文件路徑
          Field.UnStored(String name, String value)? 只全文索引,不存儲

          建立索引的例子:
          public class IndexFiles {??
          //使用方法:: IndexFiles [索引輸出目錄] [索引的文件列表] ...??
          public static void main(String[] args) throws Exception {???
          String indexPath = args[0];??? IndexWriter writer;???
          //用指定的語言分析器構(gòu)造一個新的寫索引器(第3個參數(shù)表示是否為追加索引)???

          writer = new IndexWriter(indexPath, new SimpleAnalyzer(), false);???
          for (int i=1; i<args.length; i++) {?????
          System.out.println("Indexing file " + args[i]);?????
          InputStream is = new FileInputStream(args[i]);?????
          //構(gòu)造包含2個字段Field的Document對象?????
          //一個是路徑path字段,不索引,只存儲?????
          //一個是內(nèi)容body字段,進行全文索引,并存儲?????
          Document doc = new Document();?????
          doc.add(Field.UnIndexed("path", args[i]));?????
          doc.add(Field.Text("body", (Reader) new InputStreamReader(is)));?????
          //將文檔寫入索引????
          ?writer.addDocument(doc);?????
          is.close();??? };???
          //關(guān)閉寫索引器???
          writer.close();? }
          }
          索引過程中可以看到:

          語言分析器提供了抽象的接口,因此語言分析(Analyser)是可以定制的,雖然lucene缺省

          提供了2個比較通用的分析器SimpleAnalyser和StandardAnalyser,這2個分析器缺省都不

          支持中文,所以要加入對中文語言的切分規(guī)則,需要修改這2個分析器。
          Lucene并沒有規(guī)定數(shù)據(jù)源的格式,而只提供了一個通用的結(jié)構(gòu)(Document對象)來接受索

          引的輸入,因此輸入的數(shù)據(jù)源可以是:數(shù)據(jù)庫,WORD文檔,PDF文檔,HTML文檔……只要能

          夠設(shè)計相應(yīng)的解析轉(zhuǎn)換器將數(shù)據(jù)源構(gòu)造成成Docuement對象即可進行索引。
          對于大批量的數(shù)據(jù)索引,還可以通過調(diào)整IndexerWrite的文件合并頻率屬性(mergeFactor

          )來提高批量索引的效率。
          檢索過程和結(jié)果顯示:

          搜索結(jié)果返回的是Hits對象,可以通過它再訪問Document==>Field中的內(nèi)容。

          假設(shè)根據(jù)body字段進行全文檢索,可以將查詢結(jié)果的path字段和相應(yīng)查詢的匹配度(score)

          打印出來,

          public class Search {??
          public static void main(String[] args) throws Exception {???
          String indexPath = args[0], queryString = args[1];???
          //指向索引目錄的搜索器???
          Searcher searcher = new IndexSearcher(indexPath);???
          //查詢解析器:使用和索引同樣的語言分析器???
          Query query = QueryParser.parse(queryString, "body",???????????????????????????

          ?? new SimpleAnalyzer());???
          //搜索結(jié)果使用Hits存儲???
          Hits hits = searcher.search(query);???
          //通過hits可以訪問到相應(yīng)字段的數(shù)據(jù)和查詢的匹配度???
          for (int i=0; i<hits.length(); i++) {?????
          System.out.println(hits.doc(i).get("path") + "; Score: " +?????????????????????

          ??? hits.score(i));??? };? }
          }
          添加修改刪除指定記錄(Document)

          Lucene提供了索引的擴展機制,因此索引的動態(tài)擴展應(yīng)該是沒有問題的,而指定記錄的修

          改也似乎只能通過記錄的刪除,然后重新加入實現(xiàn)。如何刪除指定的記錄呢?刪除的方法

          也很簡單,只是需要在索引時根據(jù)數(shù)據(jù)源中的記錄ID專門另建索引,然后利用

          IndexReader.delete(Termterm)方法通過這個記錄ID刪除相應(yīng)的Document。

          根據(jù)某個字段值的排序功能
          根據(jù)某個字段值的排序功能

          lucene缺省是按照自己的相關(guān)度算法(score)進行結(jié)果排序的,但能夠根據(jù)其他字段進行

          結(jié)果排序是一個在LUCENE的開發(fā)郵件列表中經(jīng)常提到的問題,很多原先基于數(shù)據(jù)庫應(yīng)用都

          需要除了基于匹配度(score)以外的排序功能。而從全文檢索的原理我們可以了解到,任

          何不基于索引的搜索過程效率都會導(dǎo)致效率非常的低,如果基于其他字段的排序需要在搜

          索過程中訪問存儲字段,速度回大大降低,因此非常是不可取的。

          但這里也有一個折中的解決方法:在搜索過程中能夠影響排序結(jié)果的只有索引中已經(jīng)存儲

          的docID和score這2個參數(shù),所以,基于score以外的排序,其實可以通過將數(shù)據(jù)源預(yù)先排

          好序,然后根據(jù)docID進行排序來實現(xiàn)。這樣就避免了在LUCENE搜索結(jié)果外對結(jié)果再次進行

          排序和在搜索過程中訪問不在索引中的某個字段值。

          這里需要修改的是IndexSearcher中的HitCollector過程:

          ... scorer.score(new HitCollector() {?
          private float minScore = 0.0f;?
          public final void collect(int doc, float score) {??
          if (score > 0.0f &&???? // ignore zeroed buckets??????

          (bits==null || bits.get(doc))) {?? // skip docs not in bits????

          totalHits[0]++;???? if (score >= minScore) {????????????? /* 原先:Lucene將

          docID和相應(yīng)的匹配度score例入結(jié)果命中列表中:??????? * hq.put(new ScoreDoc

          (doc, score));?? // update hit queue?????????????? * 如果用doc 或 1/doc 代替

          score,就實現(xiàn)了根據(jù)docID順排或逆排?????????????? * 假設(shè)數(shù)據(jù)源索引時已經(jīng)按照某個

          字段排好了序,而結(jié)果根據(jù)docID排序也就實現(xiàn)了?????????????? * 針對某個字段的排序

          ,甚至可以實現(xiàn)更復(fù)雜的score和docID的擬合。?????????????? */?????????????

          hq.put(new ScoreDoc(doc, (float) 1/doc )); ??????
          if (hq.size() > nDocs) {??? // if hit queue overfull??

          hq.pop();???? // remove lowest in hit queue??

          minScore = ((ScoreDoc)hq.top()).score; // reset minScore?????? }???? }?

          ? }?}????? }, reader.maxDoc());

          Lucene面向全文檢索的優(yōu)化在于首次索引檢索后,并不把所有的記錄(Document)具體內(nèi)

          容讀取出來,而起只將所有結(jié)果中匹配度最高的頭100條結(jié)果(TopDocs)的ID放到結(jié)果集

          緩存中并返回,這里可以比較一下數(shù)據(jù)庫檢索:如果是一個10,000條的數(shù)據(jù)庫檢索結(jié)果集

          ,數(shù)據(jù)庫是一定要把所有記錄內(nèi)容都取得以后再開始返回給應(yīng)用結(jié)果集的。所以即使檢索

          匹配總數(shù)很多,Lucene的結(jié)果集占用的內(nèi)存空間也不會很多。對于一般的模糊檢索應(yīng)用是

          用不到這么多的結(jié)果的,頭100條已經(jīng)可以滿足90%以上的檢索需求。

          如果首批緩存結(jié)果數(shù)用完后還要讀取更后面的結(jié)果時Searcher會再次檢索并生成一個上次

          的搜索緩存數(shù)大1倍的緩存,并再重新向后抓取。所以如果構(gòu)造一個Searcher去查1-120條

          結(jié)果,Searcher其實是進行了2次搜索過程:頭100條取完后,緩存結(jié)果用完,Searcher重

          新檢索再構(gòu)造一個200條的結(jié)果緩存,依此類推,400條緩存,800條緩存。由于每次

          Searcher對象消失后,這些緩存也訪問那不到了,你有可能想將結(jié)果記錄緩存下來,緩存

          數(shù)盡量保證在100以下以充分利用首次的結(jié)果緩存,不讓Lucene浪費多次檢索,而且可以分

          級進行結(jié)果緩存。

          Lucene的另外一個特點是在收集結(jié)果的過程中將匹配度低的結(jié)果自動過濾掉了。這也是和

          數(shù)據(jù)庫應(yīng)用需要將搜索的結(jié)果全部返回不同之處。

          posted @ 2006-11-08 14:58 Lansing 閱讀(1365) | 評論 (0)編輯 收藏

          Eclipse及其插件介紹和下載- -

          TagEclipse ?? 插件 ?? ??????????????????????????????????????

          0.Eclipse下載
          EMF,GEF - Graphical Editor Framework,UML2,VE - Visual Editor都在這里下載
          http://www.eclipse.org/downloads/index.php
          ?
          0.5.lomboz J2EE插件,開發(fā)JSP,EJB
          http://forge.objectweb.org/projects/lomboz
          1.MyEclipse J2EE開發(fā)插件,支持SERVLET/JSP/EJB/數(shù)據(jù)庫操縱等
          http://www.myeclipseide.com
          ?
          2.Properties Editor? 編輯java的屬性文件,并可以自動存盤為Unicode格式
          http://propedit.sourceforge.jp/index_en.html
          ?
          3.Colorer Take? 為上百種類型的文件按語法著色
          http://colorer.sourceforge.net/
          ?
          4.XMLBuddy 編輯xml文件
          http://www.xmlbuddy.com
          ?
          5.Code Folding? 加入多種代碼折疊功能(比eclipse自帶的更多)
          http://www.coffee-bytes.com/servlet/PlatformSupport
          ?
          6.Easy Explorer? 從eclipse中訪問選定文件、目錄所在的文件夾
          http://easystruts.sourceforge.net/
          ?
          7.Fat Jar 打包插件,可以方便的完成各種打包任務(wù),可以包含外部的包等
          http://fjep.sourceforge.net/
          ?
          8.RegEx Test 測試正則表達式
          http://brosinski.com/stephan/archives/000028.php
          ?
          9.JasperAssistant 報表插件(強,要錢的)
          http://www.jasperassistant.com/
          ?
          10.Jigloo GUI Builder JAVA的GUI編輯插件
          http://cloudgarden.com/jigloo/
          ?
          11.Profiler 性能跟蹤、測量工具,能跟蹤、測量BS程序
          http://sourceforge.net/projects/eclipsecolorer/
          ?
          12.AdvanQas 提供對if/else等條件語句的提示和快捷幫助(自動更改結(jié)構(gòu)等)
          http://eclipsecolorer.sourceforge.net/advanqas/index.html
          ?
          13.Log4E Log4j插件,提供各種和Log4j相關(guān)的任務(wù),如為方法、類添加一個logger等
          http://log4e.jayefem.de/index.php/Main_Page
          ?
          14.VSSPlugin VSS插件
          http://sourceforge.net/projects/vssplugin
          ?
          15.Implementors 提供跳轉(zhuǎn)到一個方法的實現(xiàn)類,而不是接中的功能(實用!)
          http://eclipse-tools.sourceforge.net/implementors/
          ?
          16.Call Hierarchy 顯示一個方法的調(diào)用層次(被哪些方法調(diào),調(diào)了哪些方法)
          http://eclipse-tools.sourceforge.net/call-hierarchy/index.html
          ?
          17.EclipseTidy 檢查和格式化HTML/XML文件
          http://eclipsetidy.sourceforge.net/
          ?
          18.Checkclipse 檢查代碼的風(fēng)格、寫法是否符合規(guī)范
          http://www.mvmsoft.de/content/plugins/checkclipse/checkclipse.htm
          ?
          19.Hibernate Synchronizer Hibernate插件,自動映射等
          http://www.binamics.com/hibernatesync/
          ?
          20.VeloEclipse? Velocity插件
          http://propsorter.sourceforge.net/
          ?
          21.EditorList 方便的列出所有打開的Editor
          http://editorlist.sourceforge.net/
          ?
          22.MemoryManager 內(nèi)存占用率的監(jiān)視
          http://cloudgarden.com/memorymanager/
          ?
          23.swt-designer java的GUI插件
          http://www.swt-designer.com/
          ?
          24.TomcatPlugin 支持Tomcat插件
          http://www.sysdeo.com/eclipse/tomcatPlugin.html
          ?
          25.XML Viewer
          http://tabaquismo.freehosting.net/ignacio/eclipse/xmlview/index.html
          ?
          26.quantum 數(shù)據(jù)庫插件
          http://quantum.sourceforge.net/
          ?
          27.Dbedit 數(shù)據(jù)庫插件
          http://sourceforge.net/projects/dbedit
          ?
          28.clay.core 可視化的數(shù)據(jù)庫插件
          http://www.azzurri.jp/en/software/index.jsp
          http://www.azzurri.jp/eclipse/plugins
          ?
          29.hiberclipse hibernate插件
          http://hiberclipse.sourceforge.net
          http://www.binamics.com/hibernatesync
          ?
          30.struts-console Struts插件
          http://www.jamesholmes.com/struts/console/
          ?
          31.easystruts Struts插件
          http://easystruts.sourceforge.net
          ?
          32.veloedit Velocity插件
          http://veloedit.sourceforge.net/
          ?
          33.jalopy 代碼整理插件
          http://jalopy.sourceforge.net/
          ?
          34.JDepend 包關(guān)系分析
          http://andrei.gmxhome.de/jdepend4eclipse/links.html
          ?
          35.Spring IDE Spring插件
          http://springide-eclip.sourceforge.net/updatesite/
          ?
          36.doclipse 可以產(chǎn)生xdoclet 的代碼提示
          http://beust.com/doclipse/

          posted @ 2006-09-21 19:17 Lansing 閱讀(314) | 評論 (0)編輯 收藏
          <2006年9月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          1234567

          歡迎探討,努力學(xué)習(xí)Java哈

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          Lansing's Download

          Lansing's Link

          我的博客

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 青龙| 汝城县| 教育| 泽库县| 邯郸市| 民和| 白河县| 乐安县| 漯河市| 无锡市| 宜丰县| 宁安市| 禄劝| 裕民县| 丹凤县| 蓬溪县| 遂溪县| 克山县| 罗甸县| 乳山市| 镇坪县| 巨野县| 涿鹿县| 筠连县| 唐海县| 景德镇市| 定兴县| 靖远县| 虎林市| 正安县| 东乌珠穆沁旗| 肇源县| 永康市| 广昌县| 澄迈县| 双峰县| 聊城市| 曲周县| 阿克| 永胜县| 湘阴县|