<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    cc

    隨筆 - 20, 文章 - 0, 評(píng)論 - 1, 引用 - 0
    數(shù)據(jù)加載中……

    2007年1月20日

    oracle 可以用判斷某列 存儲(chǔ)的是否是 數(shù)字的 asc 碼 函數(shù)

    select distinct ascii (字段)   from  表

    posted @ 2010-11-24 16:25 cc 閱讀(247) | 評(píng)論 (0)編輯 收藏

    Linux 技巧:讓進(jìn)程在后臺(tái)可靠運(yùn)行的幾種方法

    文檔選項(xiàng)
    將打印機(jī)的版面設(shè)置成橫向打印模式

    打印本頁(yè)

    將此頁(yè)作為電子郵件發(fā)送

    將此頁(yè)作為電子郵件發(fā)送


    級(jí)別: 中級(jí)

    申 毅 (shenyyi@cn.ibm.com), 軟件工程師, IBM 中國(guó)軟件開發(fā)中心

    2008 年 5 月 29 日

    想讓進(jìn)程在斷開連接后依然保持運(yùn)行?如果該進(jìn)程已經(jīng)開始運(yùn)行了該如何補(bǔ)救? 如果有大量這類需求如何簡(jiǎn)化操作?

    我們經(jīng)常會(huì)碰到這樣的問(wèn)題,用 telnet/ssh 登錄了遠(yuǎn)程的 Linux 服務(wù)器,運(yùn)行了一些耗時(shí)較長(zhǎng)的任務(wù), 結(jié)果卻由于網(wǎng)絡(luò)的不穩(wěn)定導(dǎo)致任務(wù)中途失敗。如何讓命令提交后不受本地關(guān)閉終端窗口/網(wǎng)絡(luò)斷開連接的干擾呢?下面舉了一些例子, 您可以針對(duì)不同的場(chǎng)景選擇不同的方式來(lái)處理這個(gè)問(wèn)題。

    nohup/setsid/&

    場(chǎng)景:

    如果只是臨時(shí)有一個(gè)命令需要長(zhǎng)時(shí)間運(yùn)行,什么方法能最簡(jiǎn)便的保證它在后臺(tái)穩(wěn)定運(yùn)行呢?

    hangup 名稱的來(lái)由
    在 Unix 的早期版本中,每個(gè)終端都會(huì)通過(guò) modem 和系統(tǒng)通訊。當(dāng)用戶 logout 時(shí),modem 就會(huì)掛斷(hang up)電話。 同理,當(dāng) modem 斷開連接時(shí),就會(huì)給終端發(fā)送 hangup 信號(hào)來(lái)通知其關(guān)閉所有子進(jìn)程。

    解決方法:

    我們知道,當(dāng)用戶注銷(logout)或者網(wǎng)絡(luò)斷開時(shí),終端會(huì)收到 HUP(hangup)信號(hào)從而關(guān)閉其所有子進(jìn)程。因此,我們的解決辦法就有兩種途徑:要么讓進(jìn)程忽略 HUP 信號(hào),要么讓進(jìn)程運(yùn)行在新的會(huì)話里從而成為不屬于此終端的子進(jìn)程。

    1. nohup

    nohup 無(wú)疑是我們首先想到的辦法。顧名思義,nohup 的用途就是讓提交的命令忽略 hangup 信號(hào)。讓我們先來(lái)看一下 nohup 的幫助信息:

    NOHUP(1)                        User Commands                        NOHUP(1)
                            NAME
                            nohup - run a command immune to hangups, with output to a non-tty
                            SYNOPSIS
                            nohup COMMAND [ARG]...
                            nohup OPTION
                            DESCRIPTION
                            Run COMMAND, ignoring hangup signals.
                            --help display this help and exit
                            --version
                            output version information and exit 

    可見,nohup 的使用是十分方便的,只需在要處理的命令前加上 nohup 即可,標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤缺省會(huì)被重定向到 nohup.out 文件中。一般我們可在結(jié)尾加上"&"來(lái)將命令同時(shí)放入后臺(tái)運(yùn)行,也可用">filename 2>&1"來(lái)更改缺省的重定向文件名。


    nohup 示例
                            [root@pvcent107 ~]# nohup ping www.ibm.com &
                            [1] 3059
                            nohup: appending output to `nohup.out'
                            [root@pvcent107 ~]# ps -ef |grep 3059
                            root      3059   984  0 21:06 pts/3    00:00:00 ping www.ibm.com
                            root      3067   984  0 21:06 pts/3    00:00:00 grep 3059
                            [root@pvcent107 ~]#	 

    2。setsid

    nohup 無(wú)疑能通過(guò)忽略 HUP 信號(hào)來(lái)使我們的進(jìn)程避免中途被中斷,但如果我們換個(gè)角度思考,如果我們的進(jìn)程不屬于接受 HUP 信號(hào)的終端的子進(jìn)程,那么自然也就不會(huì)受到 HUP 信號(hào)的影響了。setsid 就能幫助我們做到這一點(diǎn)。讓我們先來(lái)看一下 setsid 的幫助信息:

    SETSID(8)                 Linux Programmer’s Manual                 SETSID(8)
                            NAME
                            setsid - run a program in a new session
                            SYNOPSIS
                            setsid program [ arg ... ]
                            DESCRIPTION
                            setsid runs a program in a new session. 

    可見 setsid 的使用也是非常方便的,也只需在要處理的命令前加上 setsid 即可。


    setsid 示例
                            [root@pvcent107 ~]# setsid ping www.ibm.com
                            [root@pvcent107 ~]# ps -ef |grep www.ibm.com
                            root     31094     1  0 07:28 ?        00:00:00 ping www.ibm.com
                            root     31102 29217  0 07:29 pts/4    00:00:00 grep www.ibm.com
                            [root@pvcent107 ~]#   

    值得注意的是,上例中我們的進(jìn)程 ID(PID)為31094,而它的父 ID(PPID)為1(即為 init 進(jìn)程 ID),并不是當(dāng)前終端的進(jìn)程 ID。請(qǐng)將此例與nohup 例中的父 ID 做比較。

    3。&

    這里還有一個(gè)關(guān)于 subshell 的小技巧。我們知道,將一個(gè)或多個(gè)命名包含在“()”中就能讓這些命令在子 shell 中運(yùn)行中,從而擴(kuò)展出很多有趣的功能,我們現(xiàn)在要討論的就是其中之一。

    當(dāng)我們將"&"也放入“()”內(nèi)之后,我們就會(huì)發(fā)現(xiàn)所提交的作業(yè)并不在作業(yè)列表中,也就是說(shuō),是無(wú)法通過(guò)jobs來(lái)查看的。讓我們來(lái)看看為什么這樣就能躲過(guò) HUP 信號(hào)的影響吧。


    subshell 示例
                            [root@pvcent107 ~]# (ping www.ibm.com &)
                            [root@pvcent107 ~]# ps -ef |grep www.ibm.com
                            root     16270     1  0 14:13 pts/4    00:00:00 ping www.ibm.com
                            root     16278 15362  0 14:13 pts/4    00:00:00 grep www.ibm.com
                            [root@pvcent107 ~]#   

    從上例中可以看出,新提交的進(jìn)程的父 ID(PPID)為1(init 進(jìn)程的 PID),并不是當(dāng)前終端的進(jìn)程 ID。因此并不屬于當(dāng)前終端的子進(jìn)程,從而也就不會(huì)受到當(dāng)前終端的 HUP 信號(hào)的影響了。





    回頁(yè)首


    disown

    場(chǎng)景:

    我們已經(jīng)知道,如果事先在命令前加上 nohup 或者 setsid 就可以避免 HUP 信號(hào)的影響。但是如果我們未加任何處理就已經(jīng)提交了命令,該如何補(bǔ)救才能讓它避免 HUP 信號(hào)的影響呢?

    解決方法:

    這時(shí)想加 nohup 或者 setsid 已經(jīng)為時(shí)已晚,只能通過(guò)作業(yè)調(diào)度和 disown 來(lái)解決這個(gè)問(wèn)題了。讓我們來(lái)看一下 disown 的幫助信息:

    disown [-ar] [-h] [jobspec ...]
                            Without options, each jobspec is  removed  from  the  table  of
                            active  jobs.   If  the -h option is given, each jobspec is not
                            removed from the table, but is marked so  that  SIGHUP  is  not
                            sent  to the job if the shell receives a SIGHUP.  If no jobspec
                            is present, and neither the -a nor the -r option  is  supplied,
                            the  current  job  is  used.  If no jobspec is supplied, the -a
                            option means to remove or mark all jobs; the -r option  without
                            a  jobspec  argument  restricts operation to running jobs.  The
                            return value is 0 unless a jobspec does  not  specify  a  valid
                            job.

    可以看出,我們可以用如下方式來(lái)達(dá)成我們的目的。

    靈活運(yùn)用 CTRL-z
    在我們的日常工作中,我們可以用 CTRL-z 來(lái)將當(dāng)前進(jìn)程掛起到后臺(tái)暫停運(yùn)行,執(zhí)行一些別的操作,然后再用 fg 來(lái)將掛起的進(jìn)程重新放回前臺(tái)(也可用 bg 來(lái)將掛起的進(jìn)程放在后臺(tái))繼續(xù)運(yùn)行。這樣我們就可以在一個(gè)終端內(nèi)靈活切換運(yùn)行多個(gè)任務(wù),這一點(diǎn)在調(diào)試代碼時(shí)尤為有用。因?yàn)閷⒋a編輯器掛起到后臺(tái)再重新放回時(shí),光標(biāo)定位仍然停留在上次掛起時(shí)的位置,避免了重新定位的麻煩。
    • disown -h jobspec 來(lái)使某個(gè)作業(yè)忽略HUP信號(hào)。
    • disown -ah 來(lái)使所有的作業(yè)都忽略HUP信號(hào)。
    • disown -rh 來(lái)使正在運(yùn)行的作業(yè)忽略HUP信號(hào)。

    需要注意的是,當(dāng)使用過(guò) disown 之后,會(huì)將把目標(biāo)作業(yè)從作業(yè)列表中移除,我們將不能再使用jobs來(lái)查看它,但是依然能夠用ps -ef查找到它。

    但是還有一個(gè)問(wèn)題,這種方法的操作對(duì)象是作業(yè),如果我們?cè)谶\(yùn)行命令時(shí)在結(jié)尾加了"&"來(lái)使它成為一個(gè)作業(yè)并在后臺(tái)運(yùn)行,那么就萬(wàn)事大吉了,我們可以通過(guò)jobs命令來(lái)得到所有作業(yè)的列表。但是如果并沒有把當(dāng)前命令作為作業(yè)來(lái)運(yùn)行,如何才能得到它的作業(yè)號(hào)呢?答案就是用 CTRL-z(按住Ctrl鍵的同時(shí)按住z鍵)了!

    CTRL-z 的用途就是將當(dāng)前進(jìn)程掛起(Suspend),然后我們就可以用jobs命令來(lái)查詢它的作業(yè)號(hào),再用bg jobspec 來(lái)將它放入后臺(tái)并繼續(xù)運(yùn)行。需要注意的是,如果掛起會(huì)影響當(dāng)前進(jìn)程的運(yùn)行結(jié)果,請(qǐng)慎用此方法。


    disown 示例1(如果提交命令時(shí)已經(jīng)用“&”將命令放入后臺(tái)運(yùn)行,則可以直接使用“disown”)
                            [root@pvcent107 build]# cp -r testLargeFile largeFile &
                            [1] 4825
                            [root@pvcent107 build]# jobs
                            [1]+  Running                 cp -i -r testLargeFile largeFile &
                            [root@pvcent107 build]# disown -h %1
                            [root@pvcent107 build]# ps -ef |grep largeFile
                            root      4825   968  1 09:46 pts/4    00:00:00 cp -i -r testLargeFile largeFile
                            root      4853   968  0 09:46 pts/4    00:00:00 grep largeFile
                            [root@pvcent107 build]# logout   


    disown 示例2(如果提交命令時(shí)未使用“&”將命令放入后臺(tái)運(yùn)行,可使用 CTRL-z 和“bg”將其放入后臺(tái),再使用“disown”)
                            [root@pvcent107 build]# cp -r testLargeFile largeFile2
                            [1]+  Stopped                 cp -i -r testLargeFile largeFile2
                            [root@pvcent107 build]# bg %1
                            [1]+ cp -i -r testLargeFile largeFile2 &
                            [root@pvcent107 build]# jobs
                            [1]+  Running                 cp -i -r testLargeFile largeFile2 &
                            [root@pvcent107 build]# disown -h %1
                            [root@pvcent107 build]# ps -ef |grep largeFile2
                            root      5790  5577  1 10:04 pts/3    00:00:00 cp -i -r testLargeFile largeFile2
                            root      5824  5577  0 10:05 pts/3    00:00:00 grep largeFile2
                            [root@pvcent107 build]#   





    回頁(yè)首


    screen

    場(chǎng)景:

    我們已經(jīng)知道了如何讓進(jìn)程免受 HUP 信號(hào)的影響,但是如果有大量這種命令需要在穩(wěn)定的后臺(tái)里運(yùn)行,如何避免對(duì)每條命令都做這樣的操作呢?

    解決方法:

    此時(shí)最方便的方法就是 screen 了。簡(jiǎn)單的說(shuō),screen 提供了 ANSI/VT100 的終端模擬器,使它能夠在一個(gè)真實(shí)終端下運(yùn)行多個(gè)全屏的偽終端。screen 的參數(shù)很多,具有很強(qiáng)大的功能,我們?cè)诖藘H介紹其常用功能以及簡(jiǎn)要分析一下為什么使用 screen 能夠避免 HUP 信號(hào)的影響。我們先看一下 screen 的幫助信息:

    SCREEN(1)                                                           SCREEN(1)
                            NAME
                            screen - screen manager with VT100/ANSI terminal emulation
                            SYNOPSIS
                            screen [ -options ] [ cmd [ args ] ]
                            screen -r [[pid.]tty[.host]]
                            screen -r sessionowner/[[pid.]tty[.host]]
                            DESCRIPTION
                            Screen  is  a  full-screen  window manager that multiplexes a physical
                            terminal between several  processes  (typically  interactive  shells).
                            Each  virtual  terminal provides the functions of a DEC VT100 terminal
                            and, in addition, several control functions from the  ISO  6429  (ECMA
                            48,  ANSI  X3.64)  and ISO 2022 standards (e.g. insert/delete line and
                            support for multiple character sets).  There is a  scrollback  history
                            buffer  for  each virtual terminal and a copy-and-paste mechanism that
                            allows moving text regions between windows.	

    使用 screen 很方便,有以下幾個(gè)常用選項(xiàng):

    • screen -dmS session name 來(lái)建立一個(gè)處于斷開模式下的會(huì)話(并指定其會(huì)話名)。
    • screen -list 來(lái)列出所有會(huì)話。
    • screen -r session name 來(lái)重新連接指定會(huì)話。
    • 用快捷鍵CTRL-a d 來(lái)暫時(shí)斷開當(dāng)前會(huì)話。

    screen 示例
                            [root@pvcent107 ~]# screen -dmS Urumchi
                            [root@pvcent107 ~]# screen -list
                            There is a screen on:
                            12842.Urumchi   (Detached)
                            1 Socket in /tmp/screens/S-root.
                            [root@pvcent107 ~]# screen -r Urumchi	 

    當(dāng)我們用“-r”連接到 screen 會(huì)話后,我們就可以在這個(gè)偽終端里面為所欲為,再也不用擔(dān)心 HUP 信號(hào)會(huì)對(duì)我們的進(jìn)程造成影響,也不用給每個(gè)命令前都加上“nohup”或者“setsid”了。這是為什么呢?讓我來(lái)看一下下面兩個(gè)例子吧。


    1. 未使用 screen 時(shí)新進(jìn)程的進(jìn)程樹
                            [root@pvcent107 ~]# ping www.google.com &
                            [1] 9499
                            [root@pvcent107 ~]# pstree -H 9499
                            init─┬─Xvnc
                            ├─acpid
                            ├─atd
                            ├─2*[sendmail]
                            ├─sshd─┬─sshd───bash───pstree
                            │       └─sshd───bash───ping
                            

    我們可以看出,未使用 screen 時(shí)我們所處的 bash 是 sshd 的子進(jìn)程,當(dāng) ssh 斷開連接時(shí),HUP 信號(hào)自然會(huì)影響到它下面的所有子進(jìn)程(包括我們新建立的 ping 進(jìn)程)。


    2. 使用了 screen 后新進(jìn)程的進(jìn)程樹
                            [root@pvcent107 ~]# screen -r Urumchi
                            [root@pvcent107 ~]# ping www.ibm.com &
                            [1] 9488
                            [root@pvcent107 ~]# pstree -H 9488
                            init─┬─Xvnc
                            ├─acpid
                            ├─atd
                            ├─screen───bash───ping
                            ├─2*[sendmail]	

    而使用了 screen 后就不同了,此時(shí) bash 是 screen 的子進(jìn)程,而 screen 是 init(PID為1)的子進(jìn)程。那么當(dāng) ssh 斷開連接時(shí),HUP 信號(hào)自然不會(huì)影響到 screen 下面的子進(jìn)程了。





    回頁(yè)首


    總結(jié)

    現(xiàn)在幾種方法已經(jīng)介紹完畢,我們可以根據(jù)不同的場(chǎng)景來(lái)選擇不同的方案。nohup/setsid 無(wú)疑是臨時(shí)需要時(shí)最方便的方法,disown 能幫助我們來(lái)事后補(bǔ)救當(dāng)前已經(jīng)在運(yùn)行了的作業(yè),而 screen 則是在大批量操作時(shí)不二的選擇了。



    參考資料



    關(guān)于作者

     

    申毅,IBM 中國(guó)軟件開發(fā)中心 WebSphere Portal 部門軟件工程師。




    對(duì)本文的評(píng)價(jià)










    回頁(yè)首


    IBM 公司保留在 developerWorks 網(wǎng)站上發(fā)表的內(nèi)容的著作權(quán)。未經(jīng)IBM公司或原始作者的書面明確許可,請(qǐng)勿轉(zhuǎn)載。如果您希望轉(zhuǎn)載,請(qǐng)通過(guò) 提交轉(zhuǎn)載請(qǐng)求表單 聯(lián)系我們的編輯團(tuán)隊(duì)。

    posted @ 2009-07-29 16:48 cc 閱讀(214) | 評(píng)論 (0)編輯 收藏

    tr

    1、關(guān)于tr
       通過(guò)使用 tr,您可以非常容易地實(shí)現(xiàn) sed 的許多最基本功能。您可以將 tr 看作為 sed 的(極其)簡(jiǎn)化的變體:它可以用一個(gè)字符來(lái)替換另一個(gè)字符,或者可以完全除去一些字符。您也可以用它來(lái)除去重復(fù)字符。這就是所有 tr 所能夠做的。
           tr用來(lái)從標(biāo)準(zhǔn)輸入中通過(guò)替換或刪除操作進(jìn)行字符轉(zhuǎn)換。tr主要用于刪除文件中控制字符或進(jìn)行字符轉(zhuǎn)換。使用tr時(shí)要轉(zhuǎn)換兩個(gè)字符串:字符串1用于查詢, 字符串2用于處理各種轉(zhuǎn)換。tr剛執(zhí)行時(shí),字符串1中的字符被映射到字符串2中的字符,然后轉(zhuǎn)換操作開始。
    帶有最常用選項(xiàng)的tr命令格式為:
    tr -c -d -s ["string1_to_translate_from"] ["string2_to_translate_to"] < input-file
    這里:
    -c 用字符串1中字符集的補(bǔ)集替換此字符集,要求字符集為ASCII。
    -d 刪除字符串1中所有輸入字符。
    -s 刪除所有重復(fù)出現(xiàn)字符序列,只保留第一個(gè);即將重復(fù)出現(xiàn)字符串壓縮為一個(gè)字符串。
    input-file是轉(zhuǎn)換文件名。雖然可以使用其他格式輸入,但這種格式最常用。
    2、字符范圍
    指定字符串1或字符串2的內(nèi)容時(shí),只能使用單字符或字符串范圍或列表。
    [a-z] a-z內(nèi)的字符組成的字符串。
    [A-Z] A-Z內(nèi)的字符組成的字符串。
    [0-9] 數(shù)字串。
    \octal 一個(gè)三位的八進(jìn)制數(shù),對(duì)應(yīng)有效的ASCII字符。
    [O*n] 表示字符O重復(fù)出現(xiàn)指定次數(shù)n。因此[O*2]匹配OO的字符串。
    tr中特定控制字符的不同表達(dá)方式
    速記符含義八進(jìn)制方式
    \a Ctrl-G 鈴聲\007
    \b Ctrl-H 退格符\010
    \f Ctrl-L 走行換頁(yè)\014
    \n Ctrl-J 新行\(zhòng)012
    \r Ctrl-M 回車\015
    \t Ctrl-I tab鍵\011
    \v Ctrl-X \030
    3、應(yīng)用例子
    (1)去除oops.txt里面的重復(fù)的小寫字符
    tr -s "[a-z]"<oops.txt >result.txt
    (2)刪除空行
    tr -s "[\012]" < plan.txt 或 tr -s ["\n"] < plan.txt
    (3)有時(shí)需要?jiǎng)h除文件中的^M,并代之以換行
    tr -s "[\015]" "[\n]" < file 或 tr -s "[\r]" "[\n]" < file
    (4)大寫到小寫
    cat a.txt |tr "[a-z]" "[A-Z]" >b.txt
    (5)刪除指定字符
        一個(gè)星期的日程表。任務(wù)是從其中刪除所有數(shù)字,只保留日期。日期有大寫,也有小寫格式。因此需指定兩個(gè)字符范圍[a-z]和[A-Z],命令tr -cs "[a-z][A-Z]" "[\012*]" 將文件每行所有不包含在[a-z]或[A-Z](所有希臘字母)的字符串放在字符串1中并轉(zhuǎn)換為一新行。-s選項(xiàng)表明壓縮所有新行, -c表明保留所有字母不動(dòng)。原文件如下,后跟tr命令:
    tr -cs "[a-z][A-Z]" "[\012*]" <diary.txt
    (6)轉(zhuǎn)換控制字符
        tr的第一個(gè)功能就是轉(zhuǎn)換控制字符,特別是從dos向UNIX下載文件時(shí),忘記設(shè)置ftp關(guān)于回車換行轉(zhuǎn)換的選項(xiàng)時(shí)更是如此。cat -v filename 顯示控制字符。
        cat -v stat.txt
        box aa^^^^^12^M
        apple bbas^^^^23^M
        ^Z
    猜想‘^ ^ ^ ^ ^ ^’是tab鍵。每一行以Ctrl-M結(jié)尾,文件結(jié)尾Ctrl-Z,以下是改動(dòng)方法。
    使用-s選項(xiàng),查看ASCII表。^的八進(jìn)制代碼是136,^M是015,tab鍵是011,^Z是032 ,下面將按步驟完成最終功能。
    用tab鍵替換^ ^ ^ ^ ^ ^,命令為"\136" "[\011*]"。將結(jié)果重定向到臨時(shí)工作文件stat.tmp
    tr -s "[\136]" "[\011*]" <stat.txt >stat.tmp
    用新行替換每行末尾的^M,并用\n去除^Z,輸入要來(lái)自于臨時(shí)工作文件stat.tmp。
    tr -s "[\015][\032]" "\n" <stat.tmp
    要?jiǎng)h除所有的tab鍵,代之以空格,使用命令
    tr -s "[\011]" "[\040*]" <input.file
    (7)替換passwd文件中所有冒號(hào),代之以tab鍵,可以增加可讀性
    tr -s "[:]" "[\011]" < /etc/passwd 或 tr -s "[:]" "[\t]" < /etc/passwd
    (8)使路徑具有可讀性
        如果用 echo $PATH 或者 echo $LD_LIBRARY_PATH 等類似的命令來(lái)顯示路徑信息的話,我們看到的將會(huì)是一大堆用冒號(hào)連接在一起的路徑, tr命令可以把這些冒號(hào)轉(zhuǎn)換為回車,這樣,這些路徑就具有很好的可讀性了
    echo $PATH | tr ":" "\n"
    (9)可以在vi內(nèi)使用所有這些命令!只要記住:在tr命令前要加上您希望處理的行范圍和感嘆號(hào) (!),如 1,$!tr -d '\t'(美元符號(hào)表示最后一行)。
    (10)另外,當(dāng)有人給您發(fā)送了一個(gè)在 Mac OS 或 DOS/Windows 機(jī)器上創(chuàng)建的文本文件時(shí),您會(huì)發(fā)現(xiàn)tr非常有用。
        如果沒有將文件保存為使用 UNIX 換行符來(lái)表示行結(jié)束這種格式,則需要將這樣的文件轉(zhuǎn)換成本機(jī) UNIX 格式,否則一些命令實(shí)用程序不會(huì)正確地處理這些文件。Mac OS 的行尾以回車字符(\r)結(jié)束,許多文本處理工具將這樣的文件作為一行來(lái)處理。為了糾正這個(gè)問(wèn)題,可以用下列技巧:
    Mac -> UNIX:tr "\r" "\n"<macfile > unixfile
    UNIX -> Mac:tr "\n" "\r"<unixfile > macfile
    Microsoft DOS/Windows 約定,文本的每行以回車字符(\r)并后跟換行符(\n)結(jié)束。為了糾正這個(gè)問(wèn)題,可以使用下列命令:
    DOS -> UNIX:tr -d "\r"<dosfile > unixfile
    UNIX -> DOS:在這種情況下,需要用awk,因?yàn)閠r不能插入兩個(gè)字符來(lái)替換一個(gè)字符。要使用的 awk 命令為 awk '{ print $0"\r" }'<unixfile > dosfile

    posted @ 2009-07-10 23:53 cc 閱讀(219) | 評(píng)論 (0)編輯 收藏

    Linux操作系統(tǒng)下軟件的安裝方法大全

    一、rpm包安裝方式步驟:


    1、找到相應(yīng)的軟件包,比如soft.version.rpm,下載到本機(jī)某個(gè)目錄;

    2、打開一個(gè)終端,su -成root用戶;

    3、cd soft.version.rpm所在的目錄;

    4、輸入rpm -ivh soft.version.rpm


    二、deb包安裝方式步驟:


    1、找到相應(yīng)的軟件包,比如soft.version.deb,下載到本機(jī)某個(gè)目錄;

    2、打開一個(gè)終端,su -成root用戶;

    3、cd soft.version.deb所在的目錄;

    4、輸入dpkg -i soft.version.deb


    三、tar.gz源代碼包安裝方式:


    1、找到相應(yīng)的軟件包,比如soft.tar.gz,下載到本機(jī)某個(gè)目錄;

    2、打開一個(gè)終端,su -成root用戶;

    3、cd soft.tar.gz所在的目錄;

    4、tar -xzvf soft.tar.gz //一般會(huì)生成一個(gè)soft目錄

    5、cd soft

    6、./configure

    7、make

    8、make install


    四、tar.bz2源代碼包安裝方式:

    1、找到相應(yīng)的軟件包,比如soft.tar.bz2,下載到本機(jī)某個(gè)目錄;

    2、打開一個(gè)終端,su -成root用戶;

    3、cd soft.tar.bz2所在的目錄;

    4、tar -xjvf soft.tar.bz2 //一般會(huì)生成一個(gè)soft目錄

    5、cd soft

    6、./configure

    7、make

    8、make install


    五、apt方式安裝:


    1、打開一個(gè)終端,su -成root用戶;

    2、apt-cache search soft 注:soft是你要找的軟件的名稱或相關(guān)信息

    3、如果2中找到了軟件soft.version,則用apt-get install soft.version命令安

    裝軟件 注:只要你可以上網(wǎng),只需要用apt-cache search查找軟件,用apt-get

    install軟件


    六、bin文件安裝:


    如果你下載到的軟件名是soft.bin,一般情況下是個(gè)可執(zhí)行文件,安裝方法如下:

    1、打開一個(gè)終端,su -成root用戶;

    2、chmod +x soft.bin

    3、./soft.bin //運(yùn)行這個(gè)命令就可以安裝軟件了


    七、不需要安裝的軟件:


    有了些軟件,比如lumaqq,是不需要安裝的,自帶jre解壓縮后可直接運(yùn)行。假設(shè)

    下載的是lumaqq.tar.gz,使用方法如下:

    1、打開一個(gè)終端,su -成root用戶;

    2、tar -xzvf lumaqq.tar.gz //這一步會(huì)生成一個(gè)叫LumaQQ的目錄

    3、cd LumaQQ

    4、chmod +x lumaqq //設(shè)置lumaqq這個(gè)程序文件為可運(yùn)行

    5、此時(shí)就可以運(yùn)行l(wèi)umaqq了,用命令./lumaqq即可,但每次運(yùn)行要輸入全路徑或

    切換到剛才生成的LumaQQ目錄里

    6、為了保證不設(shè)置路徑就可以用,你可以在/bin目錄下建立一個(gè)lumaqq的鏈接,

    用命令ln -s lumaqq /bin/ 即可,以后任何時(shí)候打開一個(gè)終端輸入lumaqq就可以

    啟動(dòng)QQ聊天軟件了

    7、 如果你要想lumaqq有個(gè)菜單項(xiàng),使用菜單編輯工具,比如Alacarte Menu

    Editor,找到上面生成的LumaQQ目錄里的lumaqq設(shè)置一個(gè)菜單項(xiàng)就可以了,當(dāng)然你

    也可以直接到 /usr/share/applications目錄,按照里面其它*.desktop文件的格

    式生成一個(gè)自己的desktop文件即可。

    posted @ 2008-11-14 00:25 cc 閱讀(210) | 評(píng)論 (0)編輯 收藏

    Linux下常用壓縮格式的壓縮與解壓方法

    Linux下常用壓縮格式的壓縮與解壓方法

    解包:tar xvf FileName.tar
    打包:tar cvf FileName.tar DirName
    (注:tar是打包,不是壓縮!)
    ---------------------------------------------
    .gz
    解壓1:gunzip FileName.gz
    解壓2:gzip -d FileName.gz
    壓縮:gzip FileName
    .tar.gz
    解壓:tar zxvf FileName.tar.gz
    壓縮:tar zcvf FileName.tar.gz DirName
    ---------------------------------------------
    .bz2
    解壓1:bzip2 -d FileName.bz2
    解壓2:bunzip2 FileName.bz2
    壓縮: bzip2 -z FileName
    .tar.bz2
    解壓:tar jxvf FileName.tar.bz2
    壓縮:tar jcvf FileName.tar.bz2 DirName
    ---------------------------------------------
    .bz
    解壓1:bzip2 -d FileName.bz
    解壓2:bunzip2 FileName.bz
    壓縮:未知
    .tar.bz
    解壓:tar jxvf FileName.tar.bz
    壓縮:未知
    ---------------------------------------------
    .Z
    解壓:uncompress FileName.Z
    壓縮:compress FileName
    .tar.Z
    解壓:tar Zxvf FileName.tar.Z
    壓縮:tar Zcvf FileName.tar.Z DirName
    ---------------------------------------------
    .tgz
    解壓:tar zxvf FileName.tgz
    壓縮:未知
    .tar.tgz
    解壓:tar zxvf FileName.tar.tgz
    壓縮:tar zcvf FileName.tar.tgz FileName
    ---------------------------------------------
    .zip
    解壓:unzip FileName.zip
    壓縮:zip FileName.zip DirName
    ---------------------------------------------
    .rar
    解壓:rar a FileName.rar
    壓縮:rar e FileName.rar


    rar請(qǐng)到:http://www.rarsoft.com/download.htm 下載!
    解壓后請(qǐng)將rar_static拷貝到/usr/bin目錄(其他由$PATH環(huán)境變量指定的目錄也可以):
    [root@www2 tmp]# cp rar_static /usr/bin/rar

    ---------------------------------------------
    .lha
    解壓:lha -e FileName.lha
    壓縮:lha -a FileName.lha FileName

    lha請(qǐng)到:http://www.infor.kanazawa-it.ac.jp/~ishii/lhaunix/下載!
    解壓后請(qǐng)將lha拷貝到/usr/bin目錄(其他由$PATH環(huán)境變量指定的目錄也可以):
    [root@www2 tmp]# cp lha /usr/bin/

    ---------------------------------------------
    .tar .tgz .tar.gz .tar.Z .tar.bz .tar.bz2 .zip .cpio .rpm .deb .slp .arj .rar .ace .lha .lzh .lzx .lzs .arc .sda .sfx .lnx .zoo .cab .kar .cpt .pit .sit .sea
    解壓:sEx x FileName.*
    壓縮:sEx a FileName.* FileName

    sEx只是調(diào)用相關(guān)程序,本身并無(wú)壓縮、解壓功能,請(qǐng)注意!
    sEx請(qǐng)到:http://sourceforge.net/projects/sex下載!
    解壓后請(qǐng)將sEx拷貝到/usr/bin目錄(其他由$PATH環(huán)境變量指定的目錄也可以):
    [root@www2 tmp]# cp sEx /usr/bin/

    posted @ 2008-11-14 00:10 cc 閱讀(235) | 評(píng)論 (0)編輯 收藏

    rpm

    rpm -qa | grep ****
    rpm -ql **** | more
    查找軟件是否安裝。

    posted @ 2008-11-13 23:23 cc 閱讀(189) | 評(píng)論 (0)編輯 收藏

    Google原理(ZT)

     

    Google原理(ZT)

    這篇文章中,我們介紹了google,它是一個(gè)大型的搜索引擎(of a large-scale search engine)的原型,搜索引擎在超文本中應(yīng)用廣泛。Google的設(shè)計(jì)能夠高效地抓網(wǎng)頁(yè)并建立索引,它的查詢結(jié)果比其它現(xiàn)有系統(tǒng)都高明。這個(gè)原型的全文和超連接的數(shù)據(jù)庫(kù)至少包含24‘000‘000個(gè)網(wǎng)頁(yè)。我們可以從http://google.stanford.edu/ 下載。

    設(shè)計(jì)搜索引擎是一項(xiàng)富有挑戰(zhàn)性的工作。搜索引擎為上億個(gè)網(wǎng)頁(yè)建立索引,其中包含大量迥然不同的詞匯。而且每天要回答成千上萬(wàn)個(gè)查詢。在網(wǎng)絡(luò)中,盡管大型搜索引擎非常重要,但是學(xué)術(shù)界卻很少研究它。此外由于技術(shù)的快速發(fā)展和網(wǎng)頁(yè)的大量增加,現(xiàn)在建立一個(gè)搜索引擎和三年前完全不同。

    本文詳細(xì)介紹了我們的大型搜索引擎,據(jù)我們所知,在公開發(fā)表的論文中,這是第一篇描述地如此詳細(xì)。除了把傳統(tǒng)數(shù)據(jù)搜索技術(shù)應(yīng)用到如此大量級(jí)網(wǎng)頁(yè)中所遇到的問(wèn)題,還有許多新的技術(shù)挑戰(zhàn),包括應(yīng)用超文本中的附加信息改進(jìn)搜索結(jié)果。

    本文將解決這個(gè)問(wèn)題,描述如何運(yùn)用超文本中的附加信息,建立一個(gè)大型實(shí)用系統(tǒng)。任何人都可以在網(wǎng)上隨意發(fā)布信息,如何有效地處理這些無(wú)組織的超文本集合,也是本文要關(guān)注的問(wèn)題。

    關(guān)鍵詞 World Wide Web,搜索引擎,信息檢索,PageRank, Google 1 緒論 Web 給信息檢索帶來(lái)了新的挑戰(zhàn)。Web上的信息量快速增長(zhǎng),同時(shí)不斷有毫無(wú)經(jīng)驗(yàn)的新用戶來(lái)體驗(yàn)Web這門藝術(shù)。人們喜歡用超級(jí)鏈接來(lái)網(wǎng)上沖浪,通常都以象 Yahoo這樣重要的網(wǎng)頁(yè)或搜索引擎開始。大家認(rèn)為L(zhǎng)ist(目錄)有效地包含了大家感興趣的主題,但是它具有主觀性,建立和維護(hù)的代價(jià)高,升級(jí)慢,不能包括所有深?yuàn)W的主題。基于關(guān)鍵詞的自動(dòng)搜索引擎通常返回太多的低質(zhì)量的匹配。使問(wèn)題更遭的是,一些廣告為了贏得人們的關(guān)注想方設(shè)法誤導(dǎo)自動(dòng)搜索引擎。

    我們建立了一個(gè)大型搜索引擎解決了現(xiàn)有系統(tǒng)中的很多問(wèn)題。應(yīng)用超文本結(jié)構(gòu),大大提高了查詢質(zhì)量。我們的系統(tǒng)命名為google,取名自googol的通俗拼法,即10的100次方,這和我們的目標(biāo)建立一個(gè)大型搜索引擎不謀而合。

    1.1 網(wǎng)絡(luò)搜索引擎—升級(jí)換代(scaling up):1994-2000 搜索引擎技術(shù)不得不快速升級(jí)(scale dramatically)跟上成倍增長(zhǎng)的web數(shù)量。1994年,第一個(gè)Web搜索引擎,World Wide Web Worm(WWWW)可以檢索到110,000個(gè)網(wǎng)頁(yè)和Web的文件。到1994年11月,頂級(jí)的搜索引擎聲稱可以檢索到2‘000'000 (WebCrawler)至100‘000'000個(gè)網(wǎng)絡(luò)文件(來(lái)自 Search Engine Watch)。可以預(yù)見到2000年,可檢索到的網(wǎng)頁(yè)將超過(guò)1‘000'000‘000。同時(shí),搜索引擎的訪問(wèn)量也會(huì)以驚人的速度增長(zhǎng)。在1997年的三四月份,World Wide Web Worm 平均每天收到1500個(gè)查詢。

    在1997年11月,Altavista 聲稱它每天要處理大約20'000'000個(gè)查詢。隨著網(wǎng)絡(luò)用戶的增長(zhǎng),到2000年,自動(dòng)搜索引擎每天將處理上億個(gè)查詢。我們系統(tǒng)的設(shè)計(jì)目標(biāo)要解決許多問(wèn)題,包括質(zhì)量和可升級(jí)性,引入升級(jí)搜索引擎技術(shù)(scaling search engine technology),把它升級(jí)到如此大量的數(shù)據(jù)上。

    1.2 Google:跟上Web的步伐(Scaling with the Web)建立一個(gè)能夠和當(dāng)今web規(guī)模相適應(yīng)的搜索引擎會(huì)面臨許多挑戰(zhàn)。抓網(wǎng)頁(yè)技術(shù)必須足夠快,才能跟上網(wǎng)頁(yè)變化的速度(keep them up to date)。存儲(chǔ)索引和文檔的空間必須足夠大。索引系統(tǒng)必須能夠有效地處理上千億的數(shù)據(jù)。處理查詢必須快,達(dá)到每秒能處理成百上千個(gè)查詢(hundreds to thousands per second.)。隨著Web的不斷增長(zhǎng),這些任務(wù)變得越來(lái)越艱巨。然而硬件的執(zhí)行效率和成本也在快速增長(zhǎng),可以部分抵消這些困難。

    還有幾個(gè)值得注意的因素,如磁盤的尋道時(shí)間(disk seek time),操作系統(tǒng)的效率(operating system robustness)。在設(shè)計(jì)Google的過(guò)程中,我們既考慮了Web的增長(zhǎng)速度,又考慮了技術(shù)的更新。Google的設(shè)計(jì)能夠很好的升級(jí)處理海量數(shù)據(jù)集。它能夠有效地利用存儲(chǔ)空間來(lái)存儲(chǔ)索引。優(yōu)化的數(shù)據(jù)結(jié)構(gòu)能夠快速有效地存取(參考4.2節(jié))。進(jìn)一步,我們希望,相對(duì)于所抓取的文本文件和HTML網(wǎng)頁(yè)的數(shù)量而言,存儲(chǔ)和建立索引的代價(jià)盡可能的小(參考附錄B)。對(duì)于象Google這樣的集中式系統(tǒng),采取這些措施得到了令人滿意的系統(tǒng)可升級(jí)性(scaling properties)。

    1. 3設(shè)計(jì)目標(biāo)

    1.3.1提高搜索質(zhì)量我們的主要目標(biāo)是提高Web搜索引擎的質(zhì)量。 1994年,有人認(rèn)為建立全搜索索引(a complete search index)可以使查找任何數(shù)據(jù)都變得容易。根據(jù)Best of the Web 1994 -- Navigators ,“最好的導(dǎo)航服務(wù)可以使在Web上搜索任何信息都很容易(當(dāng)時(shí)所有的數(shù)據(jù)都可以被登錄)”。然而1997年的Web就迥然不同。近來(lái)搜索引擎的用戶已經(jīng)證實(shí)索引的完整性不是評(píng)價(jià)搜索質(zhì)量的唯一標(biāo)準(zhǔn)。用戶感興趣的搜索結(jié)果往往湮沒在“垃圾結(jié)果Junk result”中。實(shí)際上,到1997年11月為止,四大商業(yè)搜索引擎中只有一個(gè)能夠找到它自己(搜索自己名字時(shí)返回的前十個(gè)結(jié)果中有它自己)。導(dǎo)致這一問(wèn)題的主要原因是文檔的索引數(shù)目增加了好幾個(gè)數(shù)量級(jí),但是用戶能夠看的文檔數(shù)卻沒有增加。用戶仍然只希望看前面幾十個(gè)搜索結(jié)果。因此,當(dāng)集合增大時(shí),我們就需要工具使結(jié)果精確(在返回的前幾十個(gè)結(jié)果中,有關(guān)文檔的數(shù)量)。由于是從成千上萬(wàn)個(gè)有點(diǎn)相關(guān)的文檔中選出幾十個(gè),實(shí)際上,相關(guān)的概念就是指最好的文檔。高精確非常重要,甚至以響應(yīng)(系統(tǒng)能夠返回的有關(guān)文檔的總數(shù))為代價(jià)。令人高興的是利用超文本鏈接提供的信息有助于改進(jìn)搜索和其它應(yīng)用。尤其是鏈接結(jié)構(gòu)和鏈接文本,為相關(guān)性的判斷和高質(zhì)量的過(guò)濾提供了大量的信息。Google既利用了鏈接結(jié)構(gòu)又用到了anchor文本(見2.1和2.2 節(jié))。

    1.3.2搜索引擎的學(xué)術(shù)研究隨著時(shí)間的流逝,除了發(fā)展迅速,Web越來(lái)越商業(yè)化。1993年,只有1.5%的Web服務(wù)是來(lái)自. com域名。到1997年,超過(guò)了60%。同時(shí),搜索引擎從學(xué)術(shù)領(lǐng)域走進(jìn)商業(yè)。到現(xiàn)在大多數(shù)搜索引擎被公司所有,很少技公開術(shù)細(xì)節(jié)。這就導(dǎo)致搜索引擎技術(shù)很大程度上仍然是暗箱操作,并傾向做廣告(見附錄A)。Google的主要目標(biāo)是推動(dòng)學(xué)術(shù)領(lǐng)域在此方面的發(fā)展,和對(duì)它的了解。另一個(gè)設(shè)計(jì)目標(biāo)是給大家一個(gè)實(shí)用的系統(tǒng)。應(yīng)用對(duì)我們來(lái)說(shuō)非常重要,因?yàn)楝F(xiàn)代網(wǎng)絡(luò)系統(tǒng)中存在大量的有用數(shù)據(jù)(us because we think some of the most interesting research will involve leveraging the vast amount of usage data that is available from modern web systems)。例如,每天有幾千萬(wàn)個(gè)研究。然而,得到這些數(shù)據(jù)卻非常困難,主要因?yàn)樗鼈儧]有商業(yè)價(jià)值。我們最后的設(shè)計(jì)目標(biāo)是建立一個(gè)體系結(jié)構(gòu)能夠支持新的關(guān)于海量Web數(shù)據(jù)的研究。為了支持新研究,Google以壓縮的形式保存了實(shí)際所抓到的文檔。設(shè)計(jì)google的目標(biāo)之一就是要建立一個(gè)環(huán)境使其他研究者能夠很快進(jìn)入這個(gè)領(lǐng)域,處理海量Web數(shù)據(jù),得到滿意的結(jié)果,而通過(guò)其它方法卻很難得到結(jié)果。系統(tǒng)在短時(shí)間內(nèi)被建立起來(lái),已經(jīng)有幾篇論文用到了 Google建的數(shù)據(jù)庫(kù),更多的在起步中。我們的另一個(gè)目標(biāo)是建立一個(gè)宇宙空間實(shí)驗(yàn)室似的環(huán)境,在這里研究者甚至學(xué)生都可以對(duì)我們的海量Web數(shù)據(jù)設(shè)計(jì)或做一些實(shí)驗(yàn)。

    2. 系統(tǒng)特點(diǎn) Google搜索引擎有兩個(gè)重要特點(diǎn),有助于得到高精度的搜索結(jié)果。

    第一點(diǎn),應(yīng)用Web的鏈接結(jié)構(gòu)計(jì)算每個(gè)網(wǎng)頁(yè)的Rank值,稱為PageRank,將在98頁(yè)詳細(xì)描述它。

    第二點(diǎn),Google利用超鏈接改進(jìn)搜索結(jié)果。

    2.1 PageRank:給網(wǎng)頁(yè)排序 Web的引用(鏈接)圖是重要的資源,卻被當(dāng)今的搜索引擎很大程度上忽視了。我們建立了一個(gè)包含518‘000'000個(gè)超鏈接的圖,它是一個(gè)具有重要意義的樣本。這些圖能夠快速地計(jì)算網(wǎng)頁(yè)的PageRank值,它是一個(gè)客觀的標(biāo)準(zhǔn),較好的符合人們心目中對(duì)一個(gè)網(wǎng)頁(yè)重要程度的評(píng)價(jià),建立的基礎(chǔ)是通過(guò)引用判斷重要性。因此在web中,PageRank能夠優(yōu)化關(guān)鍵詞查詢的結(jié)果。對(duì)于大多數(shù)的主題,在網(wǎng)頁(yè)標(biāo)題查詢中用PageRank優(yōu)化簡(jiǎn)單文本匹配,我們得到了令人驚嘆的結(jié)果(從google.stanford.edu可以得到演示)。對(duì)于Google主系統(tǒng)中的全文搜索,PageRank也幫了不少忙。

    2.1.1計(jì)算PageRank 文獻(xiàn)檢索中的引用理論用到Web中,引用網(wǎng)頁(yè)的鏈接數(shù),一定程度上反映了該網(wǎng)頁(yè)的重要性和質(zhì)量。PageRank發(fā)展了這種思想,網(wǎng)頁(yè)間的鏈接是不平等的。

    PageRank 定義如下: 我們假設(shè)T1…Tn指向網(wǎng)頁(yè)A(例如,被引用)。參數(shù)d是制動(dòng)因子,使結(jié)果在0,1之間。通常d等于0.85。在下一節(jié)將詳細(xì)介紹d。C(A)定義為網(wǎng)頁(yè) A指向其它網(wǎng)頁(yè)的鏈接數(shù),網(wǎng)頁(yè)A的PageRank值由下式給出: PR(A) = (1-d) + d (PR(T1)/C(T1) + ... + PR(Tn)/C(Tn)) 注意PageRank的形式,分布到各個(gè)網(wǎng)頁(yè)中,因此所有網(wǎng)頁(yè)的PageRank和是1。 PageRank或PR(A)可以用簡(jiǎn)單的迭代算法計(jì)算,相應(yīng)規(guī)格化Web鏈接矩陣的主特征向量。中等規(guī)模的網(wǎng)站計(jì)算26‘000'000網(wǎng)頁(yè)的 PageRank值要花費(fèi)幾小時(shí)。還有一些技術(shù)細(xì)節(jié)超出了本文論述的范圍。

    2.1.2直覺判斷 PageRank被看作用戶行為的模型。我們假設(shè)網(wǎng)上沖浪是隨機(jī)的,不斷點(diǎn)擊鏈接,從不返回,最終煩了,另外隨機(jī)選一個(gè)網(wǎng)頁(yè)重新開始沖浪。隨機(jī)訪問(wèn)一個(gè)網(wǎng)頁(yè)的可能性就是它的PageRank值。制動(dòng)因子d是隨機(jī)訪問(wèn)一個(gè)網(wǎng)頁(yè)煩了的可能性,隨機(jī)另選一個(gè)網(wǎng)頁(yè)。對(duì)單個(gè)網(wǎng)頁(yè)或一組網(wǎng)頁(yè),一個(gè)重要的變量加入到制動(dòng)因子d中。這允許個(gè)人可以故意地誤導(dǎo)系統(tǒng),以得到較高的PageRank值。我們還有其它的PageRank算法,見98頁(yè)。

    另外的直覺判斷是一個(gè)網(wǎng)頁(yè)有很多網(wǎng)頁(yè)指向它,或者一些PageRank值高的網(wǎng)頁(yè)指向它,則這個(gè)網(wǎng)頁(yè)很重要。直覺地,在Web中,一個(gè)網(wǎng)頁(yè)被很多網(wǎng)頁(yè)引用,那么這個(gè)網(wǎng)頁(yè)值得一看。一個(gè)網(wǎng)頁(yè)被象Yahoo這樣重要的主頁(yè)引用即使一次,也值得一看。如果一個(gè)網(wǎng)頁(yè)的質(zhì)量不高,或者是死鏈接,象Yahoo這樣的主頁(yè)不會(huì)鏈向它。 PageRank處理了這兩方面因素,并通過(guò)網(wǎng)絡(luò)鏈接遞歸地傳遞。

    2.2鏈接描述文字(Anchor Text)我們的搜索引擎對(duì)鏈接文本進(jìn)行了特殊的處理。大多數(shù)搜索引擎把鏈接文字和它所鏈向的網(wǎng)頁(yè)(the page that the link is on)聯(lián)系起來(lái)。另外,把它和鏈接所指向的網(wǎng)頁(yè)聯(lián)系起來(lái)。這有幾點(diǎn)好處。

    第一,通常鏈接描述文字比網(wǎng)頁(yè)本身更精確地描述該網(wǎng)頁(yè)。

    第二,鏈接描述文字可能鏈向的文檔不能被文本搜索引擎檢索到,例如圖像,程序和數(shù)據(jù)庫(kù)。有可能使返回的網(wǎng)頁(yè)不能被抓到。注意哪些抓不到的網(wǎng)頁(yè)將會(huì)帶來(lái)一些問(wèn)題。在返回給用戶前檢測(cè)不了它們的有效性。這種情況搜索引擎可能返回一個(gè)根本不存在的網(wǎng)頁(yè),但是有超級(jí)鏈接指向它。然而這種結(jié)果可以被挑出來(lái)的,所以此類的問(wèn)題很少發(fā)生。鏈接描述文字是對(duì)被鏈向網(wǎng)頁(yè)的宣傳,這個(gè)思想被用在World Wide Web Worm 中,主要因?yàn)樗兄谒阉鞣俏谋拘畔ⅲ軌蛴蒙倭康囊严螺d文檔擴(kuò)大搜索范圍。我們大量應(yīng)用鏈接描述文字,因?yàn)樗兄谔岣咚阉鹘Y(jié)果的質(zhì)量。有效地利用鏈接描述文字技術(shù)上存在一些困難,因?yàn)楸仨毺幚泶罅康臄?shù)據(jù)。現(xiàn)在我們能抓到24‘000'000個(gè)網(wǎng)頁(yè),已經(jīng)檢索到259‘000'000多個(gè)鏈接描述文字。

    2.3其它特點(diǎn)除了PageRank和應(yīng)用鏈接描述文字外,Google還有一些其它特點(diǎn)。

    第一,所有hit都有位置信息,所以它可以在搜索中廣泛應(yīng)用鄰近性(proximity)。

    第二,Google跟蹤一些可視化外表細(xì)節(jié),例如字號(hào)。黑體大號(hào)字比其它文字更重要。

    第三,知識(shí)庫(kù)存儲(chǔ)了原始的全文html網(wǎng)頁(yè)。

    3 有關(guān)工作 Web檢索研究的歷史簡(jiǎn)短。World Wide Web Worm()是最早的搜索引擎之一。后來(lái)出現(xiàn)了一些用于學(xué)術(shù)研究的搜索引擎,現(xiàn)在它們中的大多數(shù)被上市公司擁有。與Web的增長(zhǎng)和搜索引擎的重要性相比,有關(guān)當(dāng)今搜索引擎技術(shù)的優(yōu)秀論文相當(dāng)少。根據(jù)Michael Mauldin(Lycos Inc的首席科學(xué)家)) ,“各種各樣的服務(wù)(包括Lycos)非常關(guān)注這些數(shù)據(jù)庫(kù)的細(xì)節(jié)。”雖然在搜索引擎的某些特點(diǎn)上做了大量工作。具有代表性的工作有,對(duì)現(xiàn)有商業(yè)搜索引擎的結(jié)果進(jìn)行傳遞,或建立小型的個(gè)性化的搜索引擎。最后有關(guān)信息檢索系統(tǒng)的研究很多,尤其在有組織機(jī)構(gòu)集合(well controlled collections)方面。在下面兩節(jié),我們將討論在信息檢索系統(tǒng)中的哪些領(lǐng)域需要改進(jìn)以便更好的工作在Web上。

    3.1信息檢索信息檢索系統(tǒng)誕生在幾年前,并發(fā)展迅速。然而大多數(shù)信息檢索系統(tǒng)研究的對(duì)象是小規(guī)模的單一的有組織結(jié)構(gòu)的集合,例如科學(xué)論文集,或相關(guān)主題的新聞故事。實(shí)際上,信息檢索的主要基準(zhǔn),the Text Retrieval Conference(),用小規(guī)模的、有組織結(jié)構(gòu)的集合作為它們的基準(zhǔn)。

    大型文集基準(zhǔn)只有20GB,相比之下,我們抓到的24000000個(gè)網(wǎng)頁(yè)占147GB。在TREC上工作良好的系統(tǒng),在Web上卻不一定產(chǎn)生好的結(jié)果。例如,標(biāo)準(zhǔn)向量空間模型企圖返回和查詢請(qǐng)求最相近的文檔,把查詢請(qǐng)求和文檔都看作由出現(xiàn)在它們中的詞匯組成的向量。在Web環(huán)境下,這種策略常常返回非常短的文檔,這些文檔往往是查詢?cè)~再加幾個(gè)字。例如,查詢“Bill Clinton”,返回的網(wǎng)頁(yè)只包含“Bill Clinton Sucks”,這是我們從一個(gè)主要搜索引擎中看到的。網(wǎng)絡(luò)上有些爭(zhēng)議,用戶應(yīng)該更準(zhǔn)確地表達(dá)他們想查詢什么,在他們的查詢請(qǐng)求中用更多的詞。我們強(qiáng)烈反對(duì)這種觀點(diǎn)。如果用戶提出象“Bill Clinton”這樣的查詢請(qǐng)求,應(yīng)該得到理想的查詢結(jié)果,因?yàn)檫@個(gè)主題有許多高質(zhì)量的信息。象所給的例子,我們認(rèn)為信息檢索標(biāo)準(zhǔn)需要發(fā)展,以便有效地處理Web數(shù)據(jù)。

    3.2有組織結(jié)構(gòu)的集合(Well Controlled Collections)與Web的不同點(diǎn) Web是完全無(wú)組織的異構(gòu)的大量文檔的集合。Web中的文檔無(wú)論內(nèi)在信息還是隱含信息都存在大量的異構(gòu)性。例如,文檔內(nèi)部就用了不同的語(yǔ)言(既有人類語(yǔ)言又有程序),詞匯(email地址,鏈接,郵政編碼,電話號(hào)碼,產(chǎn)品號(hào)),類型(文本,HTML,PDF,圖像,聲音),有些甚至是機(jī)器創(chuàng)建的文件(log文件,或數(shù)據(jù)庫(kù)的輸出)。可以從文檔中推斷出來(lái),但并不包含在文檔中的信息稱為隱含信息。隱含信息包括來(lái)源的信譽(yù),更新頻率,質(zhì)量,訪問(wèn)量和引用。不但隱含信息的可能來(lái)源各種各樣,而且被檢測(cè)的信息也大不相同,相差可達(dá)好幾個(gè)數(shù)量級(jí)。例如,一個(gè)重要主頁(yè)的使用量,象Yahoo 每天瀏覽數(shù)達(dá)到上百萬(wàn)次,于此相比無(wú)名的歷史文章可能十年才被訪問(wèn)一次。很明顯,搜索引擎對(duì)這兩類信息的處理是不同的。 Web與有組織結(jié)構(gòu)集合之間的另外一個(gè)明顯區(qū)別是,事實(shí)上,向Web上傳信息沒有任何限制。靈活利用這點(diǎn)可以發(fā)布任何對(duì)搜索引擎影響重大的信息,使路由阻塞,加上為牟利故意操縱搜索引擎,這些已經(jīng)成為一個(gè)嚴(yán)重的問(wèn)題。這些問(wèn)題還沒有被傳統(tǒng)的封閉的信息檢索系統(tǒng)所提出來(lái)。它關(guān)心的是元數(shù)據(jù)的努力,這在Web 搜索引擎中卻不適用,因?yàn)榫W(wǎng)頁(yè)中的任何文本都不會(huì)向用戶聲稱企圖操縱搜索引擎。甚至有些公司為牟利專門操縱搜索引擎。

    4 系統(tǒng)分析(System Anatomy)首先,我們提供高水平的有關(guān)體系結(jié)構(gòu)的討論。然后,詳細(xì)描述重要的數(shù)據(jù)結(jié)構(gòu)。最后,主要應(yīng)用:抓網(wǎng)頁(yè),索引,搜索將被嚴(yán)格地檢查。 Figure 1. High Level Google Architecture 4.1Google體系結(jié)構(gòu)概述這一節(jié),我們將看看整個(gè)系統(tǒng)是如何工作的(give a high level),見圖1。本節(jié)不討論應(yīng)用和數(shù)據(jù)結(jié)構(gòu),在后幾節(jié)中討論。為了效率大部分Google是用c或c++實(shí)現(xiàn)的,既可以在Solaris也可以在 Linux上運(yùn)行。

    Google系統(tǒng)中,抓網(wǎng)頁(yè)(下載網(wǎng)頁(yè))是由幾個(gè)分布式crawlers完成的。一個(gè)URL服務(wù)器負(fù)責(zé)向crawlers 提供URL列表。抓來(lái)的網(wǎng)頁(yè)交給存儲(chǔ)服務(wù)器storeserver。然后,由存儲(chǔ)服務(wù)器壓縮網(wǎng)頁(yè)并把它們存到知識(shí)庫(kù)repository中。每個(gè)網(wǎng)頁(yè)都有一個(gè)ID,稱作docID,當(dāng)新URL從網(wǎng)頁(yè)中分析出時(shí),就被分配一個(gè)docID。由索引器和排序器負(fù)責(zé)建立索引index function。索引器從知識(shí)庫(kù)中讀取文檔,對(duì)其解壓縮和分析。每個(gè)文檔被轉(zhuǎn)換成一組詞的出現(xiàn)情況,稱作命中hits。Hits紀(jì)錄了詞,詞在文檔中的位置,最接近的字號(hào),大小寫。索引器把這些hits分配到一組桶barrel中,產(chǎn)生經(jīng)過(guò)部分排序后的索引。索引器的另一個(gè)重要功能是分析網(wǎng)頁(yè)中所有的鏈接,將有關(guān)的重要信息存在鏈接描述anchors文件中。該文件包含了足夠的信息,可以用來(lái)判斷每個(gè)鏈接鏈出鏈入節(jié)點(diǎn)的信息,和鏈接文本。 URL分解器resolver閱讀鏈接描述anchors文件,并把相對(duì)URL轉(zhuǎn)換成絕對(duì)URL,再轉(zhuǎn)換成docID。為鏈接描述文本編制索引,并與它所指向的docID關(guān)聯(lián)起來(lái)。同時(shí)建立由docID對(duì)組成的鏈接數(shù)據(jù)庫(kù)。用于計(jì)算所有文檔的PageRank值。用docID分類后的barrels,送給排序器sorter,再根據(jù)wordID進(jìn)行分類,建立反向索引inverted index。這個(gè)操作要恰到好處,以便幾乎不需要暫存空間。排序器還給出docID和偏移量列表,建立反向索引。一個(gè)叫DumpLexicon的程序把這個(gè)列表和由索引器產(chǎn)生的字典結(jié)合在一起,建立一個(gè)新的字典,供搜索器使用。這個(gè)搜索器就是利用一個(gè)Web服務(wù)器,使用由DumpLexicon所生成的字典,利用上述反向索引以及頁(yè)面等級(jí)PageRank來(lái)回答用戶的提問(wèn)。 4.2主要數(shù)據(jù)結(jié)構(gòu)經(jīng)過(guò)優(yōu)化的Google數(shù)據(jù)結(jié)構(gòu),能夠用較小的代價(jià)抓取大量文檔,建立索引和查詢。雖然近幾年CPU和輸入輸出速率迅速提高。磁盤尋道仍然需要10ms。任何時(shí)候Google系統(tǒng)的設(shè)計(jì)都盡可能地避免磁盤尋道。這對(duì)數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)影響很大。

    4.2.1大文件大文件 BigFiles是指虛擬文件生成的多文件系統(tǒng),用長(zhǎng)度是64位的整型數(shù)據(jù)尋址。多文件系統(tǒng)之間的空間分配是自動(dòng)完成的。BigFiles包也處理已分配和未分配文件描述符。由于操縱系統(tǒng)不能滿足我們的需要,BigFiles也支持基本的壓縮選項(xiàng)。

    4.2.2知識(shí)庫(kù) Figure 2. Repository Data Structure 知識(shí)庫(kù)包含每個(gè)網(wǎng)頁(yè)的全部HTML。每個(gè)網(wǎng)頁(yè)用zlib(見RFC1950)壓縮。壓縮技術(shù)的選擇既要考慮速度又要考慮壓縮率。我們選擇zlib的速度而不是壓縮率很高的bzip。知識(shí)庫(kù)用bzip的壓縮率接近4:1。而用zlib的壓縮率是3:1。文檔一個(gè)挨著一個(gè)的存儲(chǔ)在知識(shí)庫(kù)中,前綴是docID,長(zhǎng)度,URL,見圖2。訪問(wèn)知識(shí)庫(kù)不需要其它的數(shù)據(jù)結(jié)構(gòu)。這有助于數(shù)據(jù)一致性和升級(jí)。用其它數(shù)據(jù)結(jié)構(gòu)重構(gòu)系統(tǒng),我們只需要修改知識(shí)庫(kù)和crawler錯(cuò)誤列表文件。

    4.2.3文件索引文件索引保存了有關(guān)文檔的一些信息。索引以docID的順序排列,定寬ISAM(Index sequential access mode)。每條記錄包括當(dāng)前文件狀態(tài),一個(gè)指向知識(shí)庫(kù)的指針,文件校驗(yàn)和,各種統(tǒng)計(jì)表。如果一個(gè)文檔已經(jīng)被抓到,指針指向docinfo文件,該文件的寬度可變,包含了URL和標(biāo)題。否則指針指向包含這個(gè)URL的URL列表。這種設(shè)計(jì)考慮到簡(jiǎn)潔的數(shù)據(jù)結(jié)構(gòu),以及在查詢中只需要一個(gè)磁盤尋道時(shí)間就能夠訪問(wèn)一條記錄。還有一個(gè)文件用于把URL轉(zhuǎn)換成docID。它是URL校驗(yàn)和與相應(yīng)docID的列表,按校驗(yàn)和排序。要想知道某個(gè)URL的docID,需要計(jì)算URL的校驗(yàn)和,然后在校驗(yàn)和文件中執(zhí)行二進(jìn)制查找,找到它的docID。通過(guò)對(duì)這個(gè)文件進(jìn)行合并,可以把一批URL轉(zhuǎn)換成對(duì)應(yīng)的docID。URL分析器用這項(xiàng)技術(shù)把URL轉(zhuǎn)換成docID。這種成批更新的模式是至關(guān)重要的,否則每個(gè)鏈接都需要一次查詢,假如用一塊磁盤,322‘000'000個(gè)鏈接的數(shù)據(jù)集合將花費(fèi)一個(gè)多月的時(shí)間。

    4.2.4詞典詞典有幾種不同的形式。和以前系統(tǒng)的重要不同是,詞典對(duì)內(nèi)存的要求可以在合理的價(jià)格內(nèi)。現(xiàn)在實(shí)現(xiàn)的系統(tǒng),一臺(tái)256M內(nèi)存的機(jī)器就可以把詞典裝入到內(nèi)存中。現(xiàn)在的詞典包含14000000詞匯(雖然一些很少用的詞匯沒有加入到詞典中)。它執(zhí)行分兩部分—詞匯表(用null分隔的連續(xù)串)和指針的哈希表。不同的函數(shù),詞匯表有一些輔助信息,這超出了本文論述的范圍。

    4.2.5 hit list hit list是一篇文檔中所出現(xiàn)的詞的列表,包括位置,字號(hào),大小寫。Hit list占很大空間,用在正向和反向索引中。因此,它的表示形式越有效越好。我們考慮了幾種方案來(lái)編碼位置,字號(hào),大小寫—簡(jiǎn)單編碼(3個(gè)整型數(shù)),緊湊編碼(支持優(yōu)化分配比特位),哈夫曼編碼。Hit的詳細(xì)信息見圖3。我們的緊湊編碼每個(gè)hit用2字節(jié)。有兩種類型hit,特殊hit和普通hit。特殊 hit包含URL,標(biāo)題,鏈接描述文字,meta tag。普通hit包含其它每件事。它包括大小寫特征位,字號(hào),12比特用于描述詞在文檔中的位置(所有超過(guò)4095的位置標(biāo)記為4096)。字號(hào)采用相對(duì)于文檔的其它部分的相對(duì)大小表示,占3比特(實(shí)際只用7個(gè)值,因?yàn)?11標(biāo)志是特殊hit)。特殊hit由大小寫特征位,字號(hào)位為7表示它是特殊 hit,用4比特表示特殊hit的類型,8比特表示位置。對(duì)于anchor hit八比特位置位分出4比特用來(lái)表示在anchor中的位置,4比特用于表明anchor出現(xiàn)的哈希表hash of the docID。短語(yǔ)查詢是有限的,對(duì)某些詞沒有足夠多的anchor。我們希望更新anchor hit的存儲(chǔ)方式,以便解決地址位和docIDhash域位數(shù)不足的問(wèn)題。

    因?yàn)樗阉鲿r(shí),你不會(huì)因?yàn)槲臋n的字號(hào)比別的文檔大而特殊對(duì)待它,所以采用相對(duì)字號(hào)。 hit表的長(zhǎng)度存儲(chǔ)在hit前。為節(jié)省空間hit表長(zhǎng)度,在正向索引中和wordID結(jié)合在一起,在反向索引中和docID結(jié)合存儲(chǔ)。這就限制它相應(yīng)地只占8到5比特(用些技巧,可以從wordID中借8bit)如果大于這些比特所能表示的長(zhǎng)度,用溢出碼填充,其后兩字節(jié)是真正的長(zhǎng)度。 Figure 3. Forward and Reverse Indexes and the Lexicon

    4.2.6正向索引實(shí)際上,正向索引已經(jīng)部分排序。它被存在一定數(shù)量的barrel中(我們用64個(gè)barrels)。每個(gè)barrel裝著一定范圍的wordID。如果一篇文檔中的詞落到某個(gè) barrel,它的docID將被記錄到這個(gè)barrel中,緊跟著那些詞(文檔中所有的詞匯,還是落入該barrel中的詞匯)對(duì)應(yīng)的hitlist。這種模式需要稍多些的存儲(chǔ)空間,因?yàn)橐粋€(gè)docID被用多次,但是它節(jié)省了桶數(shù)和時(shí)間,最后排序器進(jìn)行索引時(shí)降低編碼的復(fù)雜度。更進(jìn)一步的措施是,我們不是存儲(chǔ)docID本身,而是存儲(chǔ)相對(duì)于該桶最小的docID的差。用這種方法,未排序的barrel的docID只需24位,省下8位記錄hitlist 長(zhǎng)。

    4.2.7反向索引除了反向索引由sorter加工處理之外,它和正向索引包含相同的桶。對(duì)每個(gè)有效的docID,字典包含一個(gè)指向該詞所在桶的指針。它指向由docID和它的相應(yīng)hitlist組成的doclish,這個(gè)doclist代表了所有包含該詞的文檔。 doclist中docID的順序是一個(gè)重要的問(wèn)題。最簡(jiǎn)單的解決辦法是用doclish排序。這種方法合并多個(gè)詞時(shí)很快。另一個(gè)可選方案是用文檔中該詞出現(xiàn)的次數(shù)排序。這種方法回答單詞查詢,所用時(shí)間微不足道。當(dāng)多詞查詢時(shí)幾乎是從頭開始。并且當(dāng)用其它Rank算法改進(jìn)索引時(shí),非常困難。我們綜合了這兩種方法,建立兩組反向索引barrel,一組barrels的hitlist只包含標(biāo)題和anchor hit,另一組barrel包含全部的hitlist。我們首先查第一組索引桶,看有沒有匹配的項(xiàng),然后查較大的那組桶。

    4.3抓網(wǎng)頁(yè)運(yùn)行網(wǎng)絡(luò)爬行機(jī)器人是一項(xiàng)具有挑戰(zhàn)性的任務(wù)。執(zhí)行的性能和可靠性甚至更重要,還有一些社會(huì)焦點(diǎn)。網(wǎng)絡(luò)爬行是一項(xiàng)非常薄弱的應(yīng)用,它需要成百上千的web服務(wù)器和各種域名服務(wù)器的參與,這些服務(wù)器不是我們系統(tǒng)所能控制的。為了覆蓋幾十億的網(wǎng)頁(yè),Google擁有快速的分布式網(wǎng)絡(luò)爬行系統(tǒng)。一個(gè)URL服務(wù)器給若干個(gè)網(wǎng)絡(luò)爬行機(jī)器人(我們采用3個(gè))提供URL列表。URL服務(wù)器和網(wǎng)絡(luò)爬行機(jī)器人都是用Python實(shí)現(xiàn)的。每個(gè)網(wǎng)絡(luò)爬行機(jī)器人可以同時(shí)打開300個(gè)鏈接。抓取網(wǎng)頁(yè)必須足夠快。最快時(shí),用4個(gè)網(wǎng)絡(luò)爬行機(jī)器人每秒可以爬行100個(gè)網(wǎng)頁(yè)。速率達(dá)每秒600K。執(zhí)行的重點(diǎn)是找DNS。每個(gè)網(wǎng)絡(luò)爬行機(jī)器人有它自己的 DNS cache,所以它不必每個(gè)網(wǎng)頁(yè)都查DNS。每一百個(gè)連接都有幾種不同的狀態(tài):查DNS,連接主機(jī),發(fā)送請(qǐng)求,接收回答。這些因素使網(wǎng)絡(luò)爬行機(jī)器人成為系統(tǒng)比較復(fù)雜的部分。它用異步IO處理事件,若干請(qǐng)求隊(duì)列從一個(gè)網(wǎng)站到另一個(gè)網(wǎng)站不停的抓取網(wǎng)頁(yè)。運(yùn)行一個(gè)鏈接到500多萬(wàn)臺(tái)服務(wù)器的網(wǎng)頁(yè)爬行機(jī)器人,產(chǎn)生 1千多萬(wàn)登陸口,導(dǎo)致了大量的Email和電話。因?yàn)榫W(wǎng)民眾多,總有些人不知道網(wǎng)絡(luò)爬行機(jī)器人是何物,這是他們看到的第一個(gè)網(wǎng)絡(luò)爬行機(jī)器人。幾乎每天我們都會(huì)收到這樣的Email“哦,你從我們的網(wǎng)站看了太多的網(wǎng)頁(yè),你想干什么?”還有一些人不知道網(wǎng)絡(luò)搜索機(jī)器人避免協(xié)議(the robots exclusion protocol),以為他們的網(wǎng)頁(yè)上寫著“版權(quán)所有,勿被索引”的字樣就會(huì)被保護(hù)不被索引,不必說(shuō),這樣的話很難被web crawler理解。因?yàn)閿?shù)據(jù)量如此之大,還會(huì)遇到一些意想不到的事情。例如,我們的系統(tǒng)曾經(jīng)企圖抓一個(gè)在線游戲,結(jié)果抓到了游戲中的大量垃圾信息。解決這個(gè)問(wèn)題很簡(jiǎn)單。但是我們下載了幾千萬(wàn)網(wǎng)頁(yè)后才發(fā)現(xiàn)了這個(gè)問(wèn)題。因?yàn)榫W(wǎng)頁(yè)和服務(wù)器的種類繁多,實(shí)際上不在大部分Internet上運(yùn)行它就測(cè)試一個(gè)網(wǎng)頁(yè)爬行機(jī)器人是不可能。總是有幾百個(gè)隱含的問(wèn)題發(fā)生在整個(gè)web的一個(gè)網(wǎng)頁(yè)上,導(dǎo)致網(wǎng)絡(luò)爬行機(jī)器人崩潰,或者更糟,導(dǎo)致不可預(yù)測(cè)的不正確的行為。能夠訪問(wèn)大部分Internet的系統(tǒng)必須精力充沛并精心測(cè)試過(guò)。由于象crawler這樣大型復(fù)雜的系統(tǒng)總是產(chǎn)生這樣那樣的問(wèn)題,因此花費(fèi)一些資源讀這些 Email,當(dāng)問(wèn)題發(fā)生時(shí)解決它,是有必要的。

    4.4Web索引分析—任何運(yùn)行在整個(gè)Web上的分析器必須能夠處理可能包含錯(cuò)誤的大型集合。范圍從HTML標(biāo)記到標(biāo)記之間幾K字節(jié)的0,非ASCII字符,幾百層HTML標(biāo)記的嵌套,各種各樣令人難以想象的錯(cuò)誤。為了獲得最大的速度,我們沒有采用YACC產(chǎn)生上下文無(wú)關(guān)文法CFG分析器,而是采用靈活的方式產(chǎn)生詞匯分析器,它自己配有堆棧。分析器的改進(jìn)大大提高了運(yùn)行速度,它的精力如此充沛完成了大量工作。把文檔裝入barrel建立索引—分析完一篇文檔,之后把該文檔裝入barrel中,用內(nèi)存中的hash表—字典,每個(gè)詞匯被轉(zhuǎn)換成一個(gè) wordID。當(dāng)hash表字典中加入新的項(xiàng)時(shí),笨拙地存入文件。一旦詞匯被轉(zhuǎn)換成wordID,它們?cè)诋?dāng)前文檔的出現(xiàn)就轉(zhuǎn)換成hitlist,被寫進(jìn)正向barrel。索引階段并行的主要困難是字典需要共享。

    我們采用的方法是,基本字典中有140萬(wàn)個(gè)固定詞匯,不在基本字典中的詞匯寫入日志,而不是共享字典。這種方法多個(gè)索引器可以并行工作,最后一個(gè)索引器只需處理一個(gè)較小的額外詞匯日志。排序—為了建立反向索引,排序器讀取每個(gè)正向 barrel,以wordID排序,建立只有標(biāo)題anchor hi t的反向索引barrel和全文反向索引barrel。這個(gè)過(guò)程一次只處理一個(gè)barrel,所以只需要少量暫存空間。排序階段也是并行的,我們簡(jiǎn)單地同時(shí)運(yùn)行盡可能多的排序器,不同的排序器處理不同的桶。由于barrel不適合裝入主存,排序器進(jìn)一步依據(jù)wordID和docID把它分成若干籃子,以便適合裝入主存。然后排序器把每個(gè)籃子裝入主存進(jìn)行排序,并把它的內(nèi)容寫回到短反向barrel和全文反向barrel。

    4.5搜索搜索的目標(biāo)是提供有效的高質(zhì)量的搜索結(jié)果。多數(shù)大型商業(yè)搜索引擎好像在效率方面花費(fèi)了很大力氣。因此我們的研究以搜索質(zhì)量為重點(diǎn),相信我們的解決方案也可以用到那些商業(yè)系統(tǒng)中。

    Google查詢?cè)u(píng)價(jià)過(guò)程見圖4。

    1. 分析查詢。

    2. 把詞匯轉(zhuǎn)換成wordID。

    3. 在短barrel中查找每個(gè)詞匯doclist的開頭。

    4. 掃描doclist直到找到一篇匹配所有關(guān)鍵詞的文檔

    5. 計(jì)算該文檔的rank

    6. 如果我們?cè)诙蘠arrel,并且在所有doclist的末尾,開始從全文barrel的doclist的開頭查找每個(gè)詞,goto 第四步

    7. 如果不在任何doclist的結(jié)尾,返回第四步。

    8. 根據(jù)rank排序匹配文檔,返回前k個(gè)。圖4 Google查詢?cè)u(píng)價(jià)在有限的響應(yīng)時(shí)間內(nèi),一旦找到一定數(shù)量的匹配文檔,搜索引擎自動(dòng)執(zhí)行步驟8。這意味著,返回的結(jié)果是子優(yōu)化的。我們現(xiàn)在研究其它方法來(lái)解決這個(gè)問(wèn)題。過(guò)去根據(jù)PageRank排序hit,看來(lái)能夠改進(jìn)這種狀況。

    4.5.1 Ranking系統(tǒng) Google比典型搜索引擎保存了更多的web信息。每個(gè)hitlish包括位置,字號(hào),大小寫。另外,我們還考慮了鏈接描述文字。Rank綜合所有這些信息是困難的。ranking函數(shù)設(shè)計(jì)依據(jù)是沒有某個(gè)因素對(duì)rank影響重大。首先,考慮最簡(jiǎn)單的情況—單個(gè)詞查詢。為了單個(gè)詞查詢中一個(gè)文檔的 rank,Goole在文檔的hitlist中查找該詞。Google認(rèn)為每個(gè)hit是幾種不同類型(標(biāo)題,鏈接描述文字anchor,URL,普通大字號(hào)文本,普通小字號(hào)文本,……)之一,每種有它自己的類型權(quán)重。類型權(quán)重建立了一個(gè)類型索引向量。Google計(jì)算hitlist中每種hit的數(shù)量。然后每個(gè)hit數(shù)轉(zhuǎn)換成count-weight。Count-weight開始隨hit數(shù)線性增加,很快逐漸停止,以至于hit數(shù)與此不相關(guān)。我們計(jì)算 count-weight向量和type-weight向量的標(biāo)量積作為文檔的IR值。最后IR值結(jié)合PageRank作為文檔的最后rank 對(duì)于多詞查詢,更復(fù)雜些。現(xiàn)在,多詞hitlist必須同時(shí)掃描,以便關(guān)鍵詞出現(xiàn)在同一文檔中的權(quán)重比分別出現(xiàn)時(shí)高。相鄰詞的hit一起匹配。對(duì)每個(gè)匹配 hit 的集合計(jì)算相鄰度。相鄰度基于hit在文檔中的距離,分成10個(gè)不同的bin值,范圍從短語(yǔ)匹配到根本不相關(guān)。不僅計(jì)算每類hit數(shù),而且要計(jì)算每種類型的相鄰度,每個(gè)類型相似度對(duì),有一個(gè)類型相鄰度權(quán)type-prox-weight。Count轉(zhuǎn)換成count-weight,計(jì)算count- weight type-proc-weight的標(biāo)量積作為IR值。應(yīng)用某種debug mode所有這些數(shù)和矩陣與查詢結(jié)果一起顯示出來(lái)。這些顯示有助于改進(jìn)rank系統(tǒng)。

    4.5.2反饋 rank函數(shù)有很多參數(shù)象type-weight和type-prox-weight。指明這些參數(shù)的正確值有點(diǎn)黑色藝術(shù)black art。為此,我們的搜索引擎有一個(gè)用戶反饋機(jī)制。值得信任的用戶可以隨意地評(píng)價(jià)返回的結(jié)果。保存反饋。然后,當(dāng)修改rank函數(shù)時(shí),對(duì)比以前搜索的 rank,我們可以看到修改帶來(lái)的的影響。雖然不是十全十美,但是它給出了一些思路,當(dāng)rank函數(shù)改變時(shí)對(duì)搜索結(jié)果的影響。

    5執(zhí)行和結(jié)果搜索結(jié)果的質(zhì)量是搜索引擎最重要的度量標(biāo)準(zhǔn)。完全用戶評(píng)價(jià)體系超出了本文的論述范圍,對(duì)于大多數(shù)搜索,我們的經(jīng)驗(yàn)說(shuō)明Google的搜索結(jié)果比那些主要的商業(yè)搜索引擎好。作為一個(gè)應(yīng)用PageRank,鏈接描述文字,相鄰度的例子,圖4給出了Google搜索bill Clinton的結(jié)果。它說(shuō)明了Google的一些特點(diǎn)。服務(wù)器對(duì)結(jié)果進(jìn)行聚類。這對(duì)過(guò)濾結(jié)果集合相當(dāng)有幫助。這個(gè)查詢,相當(dāng)一部分結(jié)果來(lái)自 whitehouse.gov域,這正是我們所需要的。現(xiàn)在大多數(shù)商業(yè)搜索引擎不會(huì)返回任何來(lái)自whitehouse.gov的結(jié)果,這是相當(dāng)不對(duì)的。注意第一個(gè)搜索結(jié)果沒有標(biāo)題。因?yàn)樗皇潜蛔サ降摹oogle是根據(jù)鏈接描述文字決定它是一個(gè)好的查詢結(jié)果。同樣地,第五個(gè)結(jié)果是一個(gè)Email地址,當(dāng)然是不可能抓到的。也是鏈接描述文字的結(jié)果。所有這些結(jié)果質(zhì)量都很高,最后檢查沒有死鏈接。因?yàn)樗鼈冎械拇蟛糠諴ageRank值較高。PageRank 百分比用紅色線條表示。沒有結(jié)果只含Bill沒有Clinton或只含Clinton沒有Bill。因?yàn)樵~出現(xiàn)的相近性非常重要。當(dāng)然搜索引擎質(zhì)量的真實(shí)測(cè)試包含廣泛的用戶學(xué)習(xí)或結(jié)果分析,此處篇幅有限,請(qǐng)讀者自己去體驗(yàn)Google,http://google.stanford.edu/。 5.1存儲(chǔ)需求除了搜索質(zhì)量,Google的設(shè)計(jì)可以隨著Web規(guī)模的增大而有效地增大成本。一方面有效地利用存儲(chǔ)空間。表1列出了一些統(tǒng)計(jì)數(shù)字的明細(xì)表和Google存儲(chǔ)的需求。由于壓縮技術(shù)的應(yīng)用知識(shí)庫(kù)只需53GB的存儲(chǔ)空間。是所有要存儲(chǔ)數(shù)據(jù)的三分之一。按當(dāng)今磁盤價(jià)格,知識(shí)庫(kù)相對(duì)于有用的數(shù)據(jù)來(lái)說(shuō)比較便宜。搜索引擎需要的所有數(shù)據(jù)的存儲(chǔ)空間大約55GB。大多數(shù)查詢請(qǐng)求只需要短反向索引。文件索引應(yīng)用先進(jìn)的編碼和壓縮技術(shù),一個(gè)高質(zhì)量的搜索引擎可以運(yùn)行在7GB的新PC。

    5.2系統(tǒng)執(zhí)行搜索引擎抓網(wǎng)頁(yè)和建立索引的效率非常重要。Google的主要操作是抓網(wǎng)頁(yè),索引,排序。很難測(cè)試抓全部網(wǎng)頁(yè)需要多少時(shí)間,因?yàn)榇疟P滿了,域名服務(wù)器崩潰,或者其它問(wèn)題導(dǎo)致系統(tǒng)停止。總的來(lái)說(shuō),大約需要9天時(shí)間下載26000000網(wǎng)頁(yè)(包括錯(cuò)誤)。然而,一旦系統(tǒng)運(yùn)行順利,速度非常快,下載最后11000000網(wǎng)頁(yè)只需要63小時(shí),平均每天4000000網(wǎng)頁(yè),每秒48.5個(gè)網(wǎng)頁(yè)。索引器和網(wǎng)絡(luò)爬行機(jī)器人同步運(yùn)行。索引器比網(wǎng)絡(luò)爬行機(jī)器人快。因?yàn)槲覀兓ㄙM(fèi)了大量時(shí)間優(yōu)化索引器,使它不是瓶頸。這些優(yōu)化包括批量更新文檔索引,本地磁盤數(shù)據(jù)結(jié)構(gòu)的安排。索引器每秒處理54個(gè)網(wǎng)頁(yè)。排序器完全并行,用4臺(tái)機(jī)器,排序的整個(gè)過(guò)程大概需要24小時(shí)。

    5.3搜索執(zhí)行改進(jìn)搜索執(zhí)行不是我們研究的重點(diǎn)。當(dāng)前版本的Google可以在1到10秒間回答查詢請(qǐng)求。時(shí)間大部分花費(fèi)在NFS磁盤IO上(由于磁盤普遍比機(jī)器慢)。進(jìn)一步說(shuō),Google沒有做任何優(yōu)化,例如查詢緩沖區(qū),常用詞匯子索引,和其它常用的優(yōu)化技術(shù)。我們傾向于通過(guò)分布式,硬件,軟件,和算法的改進(jìn)來(lái)提高Google的速度。我們的目標(biāo)是每秒能處理幾百個(gè)請(qǐng)求。表2有幾個(gè)現(xiàn)在版本Google響應(yīng)查詢時(shí)間的例子。它們說(shuō)明IO緩沖區(qū)對(duì)再次搜索速度的影響。 6結(jié)論 Google設(shè)計(jì)成可伸縮的搜索引擎。主要目標(biāo)是在快速發(fā)展的World Wide Web上提供高質(zhì)量的搜索結(jié)果。Google應(yīng)用了一些技術(shù)改進(jìn)搜索質(zhì)量包括PageRank,鏈接描述文字,相鄰信息。進(jìn)一步說(shuō),Google是一個(gè)收集網(wǎng)頁(yè),建立索引,執(zhí)行搜索請(qǐng)求的完整的體系結(jié)構(gòu)。

    6.1未來(lái)的工作大型Web搜索引擎是個(gè)復(fù)雜的系統(tǒng),還有很多事情要做。我們直接的目標(biāo)是提高搜索效率,覆蓋大約100000000個(gè)網(wǎng)頁(yè)。一些簡(jiǎn)單的改進(jìn)提高了效率包括請(qǐng)求緩沖區(qū),巧妙地分配磁盤空間,子索引。另一個(gè)需要研究的領(lǐng)域是更新。我們必須有一個(gè)巧妙的算法來(lái)決定哪些舊網(wǎng)頁(yè)需要重新抓取,哪些新網(wǎng)頁(yè)需要被抓取。這個(gè)目標(biāo)已經(jīng)由實(shí)現(xiàn)了。受需求驅(qū)動(dòng),用代理cache創(chuàng)建搜索數(shù)據(jù)庫(kù)是一個(gè)有前途的研究領(lǐng)域。我們計(jì)劃加一些簡(jiǎn)單的已經(jīng)被商業(yè)搜索引擎支持的特征,例如布爾算術(shù)符號(hào),否定,填充。然而另外一些應(yīng)用剛剛開始探索,例如相關(guān)反饋,聚類(Google現(xiàn)在支持簡(jiǎn)單的基于主機(jī)名的聚類)。我們還計(jì)劃支持用戶上下文(象用戶地址),結(jié)果摘要。我們正在擴(kuò)大鏈接結(jié)構(gòu)和鏈接文本的應(yīng)用。簡(jiǎn)單的實(shí)驗(yàn)證明,通過(guò)增加用戶主頁(yè)的權(quán)重或書簽,PageRank可以個(gè)性化。對(duì)于鏈接文本,我們正在試驗(yàn)用鏈接周圍的文本加入到鏈接文本。Web搜索引擎提供了豐富的研究課題。如此之多以至于我們不能在此一一列舉,因此在不久的將來(lái),我們希望所做的工作不止本節(jié)提到的。

    6.2高質(zhì)量搜索當(dāng)今 Web搜索引擎用戶所面臨的最大問(wèn)題是搜索結(jié)果的質(zhì)量。結(jié)果常常是好笑的,并且超出用戶的眼界,他們常常灰心喪氣浪費(fèi)了寶貴的時(shí)間。例如,一個(gè)最流行的商業(yè)搜索引擎搜索“Bill Clillton”的結(jié)果是the Bill Clinton Joke of the Day: April 14, 1997。Google的設(shè)計(jì)目標(biāo)是隨著Web的快速發(fā)展提供高質(zhì)量的搜索結(jié)果,容易找到信息。為此,Google大量應(yīng)用超文本信息包括鏈接結(jié)構(gòu)和鏈接文本。Google還用到了相鄰性和字號(hào)信息。評(píng)價(jià)搜索引擎是困難的,我們主觀地發(fā)現(xiàn)Google的搜索質(zhì)量比當(dāng)今商業(yè)搜索引擎高。通過(guò)PageRank分析鏈接結(jié)構(gòu)使 Google能夠評(píng)價(jià)網(wǎng)頁(yè)的質(zhì)量。用鏈接文本描述鏈接所指向的網(wǎng)頁(yè)有助于搜索引擎返回相關(guān)的結(jié)果(某種程度上提高了質(zhì)量)。最后,利用相鄰性信息大大提高了很多搜索的相關(guān)性。

    6.3可升級(jí)的體系結(jié)構(gòu)除了搜索質(zhì)量,Google設(shè)計(jì)成可升級(jí)的。空間和時(shí)間必須高效,處理整個(gè)Web時(shí)固定的幾個(gè)因素非常重要。實(shí)現(xiàn)Google系統(tǒng),CPU、訪存、內(nèi)存容量、磁盤尋道時(shí)間、磁盤吞吐量、磁盤容量、網(wǎng)絡(luò)IO都是瓶頸。在一些操作中,已經(jīng)改進(jìn)的 Google克服了一些瓶頸。Google的主要數(shù)據(jù)結(jié)構(gòu)能夠有效利用存儲(chǔ)空間。進(jìn)一步,網(wǎng)頁(yè)爬行,索引,排序已經(jīng)足夠建立大部分web索引,共 24000000個(gè)網(wǎng)頁(yè),用時(shí)不到一星期。我們希望能在一個(gè)月內(nèi)建立100000000網(wǎng)頁(yè)的索引。

    6.4研究工具 Google不僅是高質(zhì)量的搜索引擎,它還是研究工具。Google搜集的數(shù)據(jù)已經(jīng)用在許多其它論文中,提交給學(xué)術(shù)會(huì)議和許多其它方式。最近的研究,例如,提出了Web查詢的局限性,不需要網(wǎng)絡(luò)就可以回答。這說(shuō)明Google不僅是重要的研究工具,而且必不可少,應(yīng)用廣泛。我們希望Google是全世界研究者的資源,帶動(dòng)搜索引擎技術(shù)的更新?lián)Q代。 7致謝 Scott Hassan and Alan Steremberg評(píng)價(jià)了Google的改進(jìn)。他們的才智無(wú)可替代,作者由衷地感謝他們。感謝Hector Garcia-Molina, Rajeev Motwani, Jeff Ullman, and Terry Winograd和全部WebBase開發(fā)組的支持和富有深刻見解的討論。最后感謝IBM,Intel,Sun和投資者的慷慨支持,為我們提供設(shè)備。這里所描述的研究是Stanford綜合數(shù)字圖書館計(jì)劃的一部分,由國(guó)家科學(xué)自然基金支持,合作協(xié)議號(hào)IRI-9411306。DARPA ,NASA,Interva研究,Stanford數(shù)字圖書館計(jì)劃的工業(yè)合作伙伴也為這項(xiàng)合作協(xié)議提供了資金。參考文獻(xiàn) ?

    Google的設(shè)計(jì)目標(biāo)是可升級(jí)到10億網(wǎng)頁(yè)。我們的磁盤和機(jī)器大概能處理這么多網(wǎng)頁(yè)。系統(tǒng)各個(gè)部分耗費(fèi)的總時(shí)間是并行的和線性的。包括網(wǎng)頁(yè)爬行機(jī)器人,索引器和排序器。擴(kuò)展后我們認(rèn)為大多數(shù)數(shù)據(jù)結(jié)構(gòu)運(yùn)行良好。然而10億網(wǎng)頁(yè)接近所有常用操作系統(tǒng)的極限(我們目前運(yùn)行在Solaris和Linux上)。包括主存地址,開放文件描述符的數(shù)量,網(wǎng)絡(luò)socket和帶寬,以及其它因素。我們認(rèn)為當(dāng)網(wǎng)頁(yè)數(shù)量大大超過(guò)10億網(wǎng)頁(yè)時(shí),會(huì)大大增加系統(tǒng)復(fù)雜性。 9.2集中式索引體系的可升級(jí)性隨著計(jì)算機(jī)性能的提高,海量文本索引的成本比較公平。當(dāng)然帶寬需求高的其它應(yīng)用如視頻,越來(lái)越普遍。但是,與多媒體例如視頻相比,文本產(chǎn)品的成本低,因此文本仍然普遍。

    圖2 Google系統(tǒng)的工作流程圖

    (注:原圖來(lái)自Sergey Brin and Lawrence Page, The Anatomy of a Large-Scale Hypertextual. Web Search Engine, 1998.http://www-db.stanford.edu/%7Ebackrub/Google.html)

    ①Google使用高速的分布式爬行器(Crawler)系統(tǒng)中的漫游遍歷器(Googlebot)定時(shí)地遍歷網(wǎng)頁(yè),將遍歷到的網(wǎng)頁(yè)送到存儲(chǔ)服務(wù)器(Store Server)中。

    ② 存儲(chǔ)服務(wù)器使用zlib格式壓縮軟件將這些網(wǎng)頁(yè)進(jìn)行無(wú)損壓縮處理后存入數(shù)據(jù)庫(kù)Repository中。Repository獲得了每個(gè)網(wǎng)頁(yè)的完全Html 代碼后,對(duì)其壓縮后的網(wǎng)頁(yè)及URL進(jìn)行分析,記錄下網(wǎng)頁(yè)長(zhǎng)度、URL、URL長(zhǎng)度和網(wǎng)頁(yè)內(nèi)容,并賦予每個(gè)網(wǎng)頁(yè)一個(gè)文檔號(hào)(docID),以便當(dāng)系統(tǒng)出現(xiàn)故障的時(shí)候,可以及時(shí)完整地進(jìn)行網(wǎng)頁(yè)的數(shù)據(jù)恢復(fù)。

    ③索引器(Indexer)從Repository中讀取數(shù)據(jù),以后做以下四步工作:

    ④(a) 將讀取的數(shù)據(jù)解壓縮后進(jìn)行分析,它將網(wǎng)頁(yè)中每個(gè)有意義的詞進(jìn)行統(tǒng)計(jì)后,轉(zhuǎn)化為關(guān)鍵詞(wordID)的若干索引項(xiàng)(Hits),生成索引項(xiàng)列表,該列表包括關(guān)鍵詞、關(guān)鍵詞的位置、關(guān)鍵詞的大小和大小寫狀態(tài)等。索引項(xiàng)列表被存入到數(shù)據(jù)桶(Barrels)中,并生成以文檔號(hào)(docID)部分排序的順排檔索引。

    索引項(xiàng)根據(jù)其重要程度分為兩種:當(dāng)索引項(xiàng)中的關(guān)鍵詞出現(xiàn)在URL、標(biāo)題、錨文本(Anchor Text)和標(biāo)簽中時(shí),表示該索引項(xiàng)比較重要,稱為特殊索引項(xiàng)(Fancy Hits);其余情況則稱為普通索引項(xiàng)(Plain Hits)。在系統(tǒng)中每個(gè)Hit用兩個(gè)字節(jié)(byte)存儲(chǔ)結(jié)構(gòu)表示:特殊索引項(xiàng)用1位(bit)表示大小寫,用二進(jìn)制代碼111(占3位)表示是特殊索引項(xiàng),其余12位有4位表示特殊索引項(xiàng)的類型(即hit是出現(xiàn)在URL、標(biāo)題、鏈接結(jié)點(diǎn)還是標(biāo)簽中),剩下8位表示hit在網(wǎng)頁(yè)中的具體位置;普通索引項(xiàng)是用1位表示大小寫,3位表示字體大小,其余12位表示在網(wǎng)頁(yè)中的具體位置。

    順排檔索引和Hit的存儲(chǔ)結(jié)構(gòu)如圖3所示。

    圖3 順排檔索引和Hit的存儲(chǔ)結(jié)構(gòu)

    值得注意的是,當(dāng)特殊索引項(xiàng)來(lái)自Anchor Text時(shí),特殊索引項(xiàng)用來(lái)表示位置的信息(8位)將分為兩部分:4位表示Anchor Text出現(xiàn)的具體位置,另4位則用來(lái)與表示Anchor Text所鏈接網(wǎng)頁(yè)的docID相連接,這個(gè)docID是由URL Resolver經(jīng)過(guò)轉(zhuǎn)化存入順排檔索引的。

    (b)索引器除了對(duì)網(wǎng)頁(yè)中有意義的詞進(jìn)行分析外,還分析網(wǎng)頁(yè)的所有超文本鏈接,將其Anchor Text、URL指向等關(guān)鍵信息存入到Anchor文檔庫(kù)中。

    (c)索引器生成一個(gè)索引詞表(Lexicon),它包括兩個(gè)部分:關(guān)鍵詞的列表和指針列表,用于倒排檔文檔相連接(如圖3所示)。

    (d) 索引器還將分析過(guò)的網(wǎng)頁(yè)編排成一個(gè)與Repository相連接的文檔索引(Document Index),并記錄下網(wǎng)頁(yè)的URL和標(biāo)題,以便可以準(zhǔn)確查找出在Repository中存儲(chǔ)的原網(wǎng)頁(yè)內(nèi)容。而且把沒有分析的網(wǎng)頁(yè)傳給URL Server,以便在下一次工作流程中進(jìn)行索引分析。

    ⑤URL分析器(URL Resolver)讀取Anchor文檔中的信息,然后做⑥中的工作。

    ⑥(a) 將其錨文本(Anchor Text)所指向的URL轉(zhuǎn)換成網(wǎng)頁(yè)的docID;(b)將該docID與原網(wǎng)頁(yè)的docID形成“鏈接對(duì)”,存入Link數(shù)據(jù)庫(kù)中;(c)將 Anchor Text指向的網(wǎng)頁(yè)的docID與順排檔特殊索引項(xiàng)Anchor Hits相連接。

    ⑦數(shù)據(jù)庫(kù)Link記錄了網(wǎng)頁(yè)的鏈接關(guān)系,用來(lái)計(jì)算網(wǎng)頁(yè)的PageRank值。

    ⑧文檔索引(Document Index)把沒有進(jìn)行索引分析的網(wǎng)頁(yè)傳遞給URL Server,URL Server則向Crawler提供待遍歷的URL,這樣,這些未被索引的網(wǎng)頁(yè)在下一次工作流程中將被索引分析。

    ⑨排序器(Sorter)對(duì)數(shù)據(jù)桶(Barrels)的順排檔索引重新進(jìn)行排序,生成以關(guān)鍵詞(wordID)為索引的倒排檔索引。倒排檔索引結(jié)構(gòu)如圖4所示:

    圖4 倒排檔索引結(jié)構(gòu)

    ⑩ 將生成的倒排檔索引與先前由索引器產(chǎn)生的索引詞表(Lexicon)相連接產(chǎn)生一個(gè)新的索引詞表供搜索器(Searcher)使用。搜索器的功能是由網(wǎng)頁(yè)服務(wù)器實(shí)現(xiàn)的,根據(jù)新產(chǎn)生的索引詞表結(jié)合上述的文檔索引(Document Index)和Link數(shù)據(jù)庫(kù)計(jì)算的網(wǎng)頁(yè)P(yáng)ageRank值來(lái)匹配檢索。

    在執(zhí)行檢索時(shí),Google通常遵循以下步驟(以下所指的是單個(gè)檢索詞的情況):

    (1)將檢索詞轉(zhuǎn)化成相應(yīng)的wordID;

    (2)利用Lexicon,檢索出包含該wordID的網(wǎng)頁(yè)的docID;

    (3)根據(jù)與Lexicon相連的倒排檔索引,分析各網(wǎng)頁(yè)中的相關(guān)索引項(xiàng)的情況,計(jì)算各網(wǎng)頁(yè)和檢索詞的匹配程度,必要時(shí)調(diào)用順排檔索引;

    (4)根據(jù)各網(wǎng)頁(yè)的匹配程度,結(jié)合根據(jù)Link產(chǎn)生的相應(yīng)網(wǎng)頁(yè)的PageRank情況,對(duì)檢索結(jié)果進(jìn)行排序;

    (5)調(diào)用Document Index中的docID及其相應(yīng)的URL,將排序結(jié)果生成檢索結(jié)果的最終列表,提供給檢索用戶。

    用戶檢索包含多個(gè)檢索詞的情況與以上單個(gè)檢索詞的情況類似:先做單個(gè)檢索詞的檢索,然后根據(jù)檢索式中檢索符號(hào)的要求進(jìn)行必要的布爾操作或其他操作。

    posted @ 2008-10-30 11:34 cc 閱讀(163) | 評(píng)論 (0)編輯 收藏

    who am i和whoami區(qū)別

    who am i 顯示的是實(shí)際用戶ID即用戶登陸的時(shí)候的用戶ID
    whoami   顯示的是有效用戶ID.
    但在大多數(shù)情況下,實(shí)際用戶ID和有效用戶ID是一致的。
     
    login:zhx
    Pssword:
    $who am i
    zhx     pts/0    2007-08-16   13:16   (:0.0)
    $whoami
    zhx
    當(dāng)切換用戶后:
    su
    Password:
    #who am i
    zhx     pts/0   007-08-16   13:16  (:0.0)
    #whoami
    root
     
    也可以說(shuō)who am i  顯示的是切換用戶前的實(shí)際登陸的用戶ID,whoami是切換后的有效的用戶ID,此時(shí)此終端具有切換后用戶的訪問(wèn)權(quán)限,如本文中切換后則具有超級(jí)用戶的訪問(wèn)權(quán)限。
     


    who am i whoami有何區(qū)別?

     

    首先要說(shuō)明uideuideffective user id)的區(qū)別。uid就是你login的時(shí)候使用的id,而euid則是你當(dāng)前的有效id。因?yàn)榈卿浐笪覀兛梢允褂?/span>su切換用戶身份,所以uideuid可能是不同的,程序在運(yùn)行的時(shí)候一般看的都是euid,當(dāng)然也有特出的,who am i就是一個(gè)。

    舉個(gè)例子:用戶用ABC登陸,使用su變成root,用who am i看到的是ABC,使用whoami命令看到的是root

    login: u1

    Password:

    $ su

    Password:

    # /usr/ucb/whoami

    root

    # who am i

    u1         pts/4        10 31 23:18   (192.168.0.1)

    posted @ 2008-10-19 23:32 cc 閱讀(1425) | 評(píng)論 (0)編輯 收藏

    window.opener 跟 window.parent的區(qū)別

    posted @ 2008-09-24 16:16 cc 閱讀(195) | 評(píng)論 (0)編輯 收藏

    Eclipse實(shí)用快捷鍵大全

    俗話說(shuō),工欲善其事,必先利其器,如果大家對(duì)開發(fā)程序稍微有點(diǎn)發(fā)燒的話,都知道快捷鍵對(duì)編程中有多大的作用了(當(dāng)然當(dāng)年Dos用natepad開發(fā)程序的除外了),我就是這樣一個(gè)發(fā)燒友了, 對(duì)各種IDE中的快捷功能頗感興趣,尤其是對(duì)快捷鍵這一部分樂此不彼了.再加上Eclipse又是本人的最愛,因此Eclipse中的快捷鍵就是本人重視的重點(diǎn)了,當(dāng)然,Eclipse的快捷鍵暫時(shí)不是最強(qiáng)的,本人見過(guò)快捷鍵最優(yōu)秀的IDE還是當(dāng)屬IDEA了,里面的快捷鍵為程序員考慮的面面俱到,幾乎到了只要你想不到,沒有按不到的地步了(嘻,好像給它做廣告了).不過(guò)說(shuō)實(shí)話很多功能都是Eclipse借鑒Idea過(guò)來(lái)的了.但至今我發(fā)現(xiàn)在快捷鍵這方面和別的智能開發(fā)方面Eclipse還是稍遜一籌了(這僅僅是從Java IDE的角度),廢話少說(shuō),直接就切入正題了.

    今天寫的這些快捷鍵都是本人在實(shí)際運(yùn)用中總結(jié)出來(lái)的,自己感覺很實(shí)用,都是以自己的喜好程度來(lái)排列了,對(duì)于的Eclipse如果沒有特別說(shuō)明都使用有 Eclipse3.0.X以上了,個(gè)別如果出現(xiàn)不符合的話要么是版本的問(wèn)題,要么是和別的系統(tǒng)級(jí)的快捷鍵有沖突,譬如輸入法的沖突了,這時(shí)就需要修改輸入法了.下面的快捷鍵都是Eclipse特有的,尤其是針對(duì)Java Editer的,但有些對(duì)Eclipse里面的Text也是實(shí)用的了,下面就是這些快捷鍵了(住:這些快捷鍵隨著自己學(xué)習(xí)不斷的深入和Eclipse版本不斷的提高會(huì)慢慢的完善的,有些太普通的就沒有列出來(lái),如Ctrl+A一類):

    Ctrl+1 快速修復(fù)(最經(jīng)典的快捷鍵,就不用多說(shuō)了)

    Ctrl+D: 刪除當(dāng)前行

    Ctrl+Alt+↓ 復(fù)制當(dāng)前行到下一行(復(fù)制增加)

    Ctrl+Alt+↑ 復(fù)制當(dāng)前行到上一行(復(fù)制增加)

    Alt+↓ 當(dāng)前行和下面一行交互位置(特別實(shí)用,可以省去先剪切,再粘貼了)

    Alt+↑ 當(dāng)前行和上面一行交互位置(同上)

    Alt+← 前一個(gè)編輯的頁(yè)面

    Alt+→ 下一個(gè)編輯的頁(yè)面(當(dāng)然是針對(duì)上面那條來(lái)說(shuō)了)

    Alt+Enter 顯示當(dāng)前選擇資源(工程,or 文件 or文件)的屬性

    Shift+Enter 在當(dāng)前行的下一行插入空行(這時(shí)鼠標(biāo)可以在當(dāng)前行的任一位置,不一定是最后)

    Shift+Ctrl+Enter 在當(dāng)前行插入空行(原理同上條)

    Ctrl+Q 定位到最后編輯的地方

    Ctrl+L 定位在某行 (對(duì)于程序超過(guò)100的人就有福音了)

    Ctrl+M 最大化當(dāng)前的Edit或View (再按則反之)

    Ctrl+/ 注釋當(dāng)前行,再按則取消注釋

    Ctrl+O 快速顯示 OutLine

    Ctrl+T 快速顯示當(dāng)前類的繼承結(jié)構(gòu)

    Ctrl+W 關(guān)閉當(dāng)前Editer

    Ctrl+K 參照選中的Word快速定位到下一個(gè)

    Ctrl+E 快速顯示當(dāng)前Editer的下拉列表(如果當(dāng)前頁(yè)面沒有顯示的用黑體表示)

    Ctrl+/(小鍵盤) 折疊當(dāng)前類中的所有代碼

    Ctrl+×(小鍵盤) 展開當(dāng)前類中的所有代碼

    Ctrl+Space 代碼助手完成一些代碼的插入(但一般和輸入法有沖突,可以修改輸入法的熱鍵,也可以暫用Alt+/來(lái)代替)

    Ctrl+Shift+E 顯示管理當(dāng)前打開的所有的View的管理器(可以選擇關(guān)閉,激活等操作)

    Ctrl+J 正向增量查找(按下Ctrl+J后,你所輸入的每個(gè)字母編輯器都提供快速匹配定位到某個(gè)單詞,如果沒有,則在stutes line中顯示沒有找到了,查一個(gè)單詞時(shí),特別實(shí)用,這個(gè)功能Idea兩年前就有了)

    Ctrl+Shift+J 反向增量查找(和上條相同,只不過(guò)是從后往前查)

    Ctrl+Shift+F4 關(guān)閉所有打開的Editer

    Ctrl+Shift+X 把當(dāng)前選中的文本全部變味小寫

    Ctrl+Shift+Y 把當(dāng)前選中的文本全部變?yōu)樾?br />
    Ctrl+Shift+F 格式化當(dāng)前代碼

    Ctrl+Shift+P 定位到對(duì)于的匹配符(譬如{}) (從前面定位后面時(shí),光標(biāo)要在匹配符里面,后面到前面,則反之)

    下面的快捷鍵是重構(gòu)里面常用的,本人就自己喜歡且常用的整理一下(注:一般重構(gòu)的快捷鍵都是Alt+Shift開頭的了)

    Alt+Shift+R 重命名 (是我自己最愛用的一個(gè)了,尤其是變量和類的Rename,比手工方法能節(jié)省很多勞動(dòng)力)

    Alt+Shift+M 抽取方法 (這是重構(gòu)里面最常用的方法之一了,尤其是對(duì)一大堆泥團(tuán)代碼有用)

    Alt+Shift+C 修改函數(shù)結(jié)構(gòu)(比較實(shí)用,有N個(gè)函數(shù)調(diào)用了這個(gè)方法,修改一次搞定)

    Alt+Shift+L 抽取本地變量( 可以直接把一些魔法數(shù)字和字符串抽取成一個(gè)變量,尤其是多處調(diào)用的時(shí)候)

    Alt+Shift+F 把Class中的local變量變?yōu)閒ield變量 (比較實(shí)用的功能)

    Alt+Shift+I 合并變量(可能這樣說(shuō)有點(diǎn)不妥Inline)

    Alt+Shift+V 移動(dòng)函數(shù)和變量(不怎么常用)

    Alt+Shift+Z 重構(gòu)的后悔藥(Undo)BR>

    posted @ 2007-01-20 09:01 cc 閱讀(343) | 評(píng)論 (0)編輯 收藏

    Eclipse常用快捷鍵

    Alt+/:代碼提示
    Ctrl+/:注釋/取消注釋
    Ctrl+D:刪除光標(biāo)所在行
    Ctrl+K:將光標(biāo)停留在變量上,按Ctrl+K鍵可以查找到下一個(gè)同樣的變量? (有不好用的時(shí)候)
    Shift+Ctrl+K:和Ctrl+K查找的方向相反? (有不好用的時(shí)候)
    Shift+Ctrl+F:代碼格式化。如果選擇了代碼,僅對(duì)所選代碼格式化
    Shift+Ctrl+O:快速地導(dǎo)入import? (好像是自動(dòng)導(dǎo)入所需的包)
    Shift+Ctrl+X:將所選字符轉(zhuǎn)為大寫
    Shift+Ctrl+Y:將所選字符轉(zhuǎn)為小寫
    Ctrl+M:快速對(duì)當(dāng)前視圖最大化
    Ctrl+O:在代碼中打開類似大綱視圖的小窗口
    Ctrl+單擊:可以跟蹤方法和類的源碼
    Alt+左右方向鍵:跳到前一次/后一次的編輯位置。
    Ctrl+鼠標(biāo)停留:可以顯示類和方法的源碼
    雙擊左括號(hào)(小括號(hào)、中括號(hào)、大括號(hào)),將選擇括號(hào)內(nèi)的所有內(nèi)容。
    Ctrl+1:光標(biāo)停在某變量上,按Ctrl+1鍵,可以提供快速重構(gòu)方案。選中若干行,按Ctrl+1鍵可將此段代碼放入for、while、if、do或try等代碼塊中。
    F3:打開聲明該引用的文件
    F4:打開類型層次結(jié)構(gòu)
    F5:單步跳入
    F6:單步跳過(guò)
    F7:單步跳出
    F8:繼續(xù),如果后面沒有斷點(diǎn),程序?qū)⑦\(yùn)行完
    Ctrl+H:打開搜索窗口
    Ctrl+Shift+S:保存全部
    Alt+Left:回退一步[[BR]] Alt+Right:前跳一步[[BR]] Ctrl+Shift+T:打開類型
    Ctrl+Shift+R:打開資源
    Ctrl+Q:回到最后一次編輯的地方
    Ctrl+Shift+G: 在workspace中搜索引用
    Ctrl+Alt+Down: 復(fù)制高亮顯示的一行或多行
    Alt+Up(Down):將一行或者多行向上或者向下移動(dòng)





    據(jù)說(shuō)熟練運(yùn)用這些快捷方式的時(shí)候,會(huì)被懷疑在打游戲......

    Ctrl+1 快速修復(fù)(最經(jīng)典的快捷鍵,就不用多說(shuō)了)? (不會(huì)用)
    Ctrl+D: 刪除當(dāng)前行
    Ctrl+Alt+↓ 復(fù)制當(dāng)前行到下一行(復(fù)制增加)
    Ctrl+Alt+↑ 復(fù)制當(dāng)前行到上一行(復(fù)制增加)
    Alt+↓ 當(dāng)前行和下面一行交互位置(特別實(shí)用,可以省去先剪切,再粘貼了)
    Alt+↑ 當(dāng)前行和上面一行交互位置(同上)
    Alt+← 前一個(gè)編輯的頁(yè)面
    Alt+→ 下一個(gè)編輯的頁(yè)面(當(dāng)然是針對(duì)上面那條來(lái)說(shuō)了)
    Alt+Enter 顯示當(dāng)前選擇資源(工程,or 文件 or文件)的屬性
    Shift+Enter 在當(dāng)前行的下一行插入空行(這時(shí)鼠標(biāo)可以在當(dāng)前行的任一位置,不一定是最后)
    Shift+Ctrl+Enter 在當(dāng)前行插入空行(原理同上條)
    Ctrl+Q 定位到最后編輯的地方
    Ctrl+L 定位在某行 (對(duì)于程序超過(guò)100的人就有福音了)
    Ctrl+M 最大化當(dāng)前的Edit或View (再按則反之)
    Ctrl+/ 注釋當(dāng)前行,再按則取消注釋
    Ctrl+O 快速顯示 OutLine
    Ctrl+T 快速顯示當(dāng)前類的繼承結(jié)構(gòu)
    Ctrl+W 關(guān)閉當(dāng)前Editer
    Ctrl+K 參照選中的Word快速定位到下一個(gè)
    Ctrl+E 快速顯示當(dāng)前Editer的下拉列表(如果當(dāng)前頁(yè)面沒有顯示的用黑體表示)
    Ctrl+/(小鍵盤) 折疊當(dāng)前類中的所有代碼
    Ctrl+×(小鍵盤) 展開當(dāng)前類中的所有代碼
    Ctrl+Space 代碼助手完成一些代碼的插入(但一般和輸入法有沖突,可以修改輸入法的熱鍵,也可以暫用Alt+/來(lái)代替)
    Ctrl+Shift+E 顯示管理當(dāng)前打開的所有的View的管理器(可以選擇關(guān)閉,激活等操作)
    Ctrl+J 正向增量查找(按下Ctrl+J后,你所輸入的每個(gè)字母編輯器都提供快速匹配定位到某個(gè)單詞,如果沒有,則在stutes line中顯示沒有找到了,查一個(gè)單詞時(shí),特別實(shí)用,這個(gè)功能Idea兩年前就有了)
    Ctrl+Shift+J 反向增量查找(和上條相同,只不過(guò)是從后往前查)
    Ctrl+Shift+F4 關(guān)閉所有打開的Editer
    Ctrl+Shift+X 把當(dāng)前選中的文本全部變味小寫
    Ctrl+Shift+Y 把當(dāng)前選中的文本全部變?yōu)樾?br />Ctrl+Shift+F 格式化當(dāng)前代碼
    Ctrl+Shift+P 定位到對(duì)于的匹配符(譬如{}) (從前面定位后面時(shí),光標(biāo)要在匹配符里面,后面到前面,則反之)
    Ctrl+Shift+R 查找文件
    Ctrl+Shift+T 查找類

    下面的快捷鍵是重構(gòu)里面常用的(注:一般重構(gòu)的快捷鍵都是Alt+Shift開頭的了)
    Alt+Shift+R 重命名 (是我自己最愛用的一個(gè)了,尤其是變量和類的Rename,比手工方法能節(jié)省很多勞動(dòng)力)
    Alt+Shift+M 抽取方法 (這是重構(gòu)里面最常用的方法之一了,尤其是對(duì)一大堆泥團(tuán)代碼有用)
    Alt+Shift+C 修改函數(shù)結(jié)構(gòu)(比較實(shí)用,有N個(gè)函數(shù)調(diào)用了這個(gè)方法,修改一次搞定)
    Alt+Shift+L 抽取本地變量( 可以直接把一些魔法數(shù)字和字符串抽取成一個(gè)變量,尤其是多處調(diào)用的時(shí)候)
    Alt+Shift+F 把Class中的local變量變?yōu)閒ield變量 (比較實(shí)用的功能)
    Alt+Shift+I 合并變量(可能這樣說(shuō)有點(diǎn)不妥Inline)
    Alt+Shift+V 移動(dòng)函數(shù)和變量(不怎么常用)
    Alt+Shift+Z 重構(gòu)的后悔藥(Undo)

    posted @ 2007-01-20 09:00 cc 閱讀(7178) | 評(píng)論 (0)編輯 收藏

    主站蜘蛛池模板: 亚洲av无码专区首页| 一级A毛片免费观看久久精品| 污污的视频在线免费观看| 波多野结衣免费一区视频| 亚洲av成人一区二区三区| 亚洲国产精品一区二区久久| 久久久久亚洲精品无码网址 | 亚洲大片在线观看| 亚洲午夜视频在线观看| 亚洲高清乱码午夜电影网| A片在线免费观看| 午夜老司机免费视频| 精品亚洲一区二区| 亚洲国产精品无码观看久久| 国产一区二区免费视频| 久久久久久AV无码免费网站下载| 免费A级毛片无码A∨免费| 在线观看无码AV网站永久免费 | 亚洲国产精品无码久久久秋霞2| 亚洲熟妇AV日韩熟妇在线| 3344在线看片免费| 国产国产人免费人成免费视频| 亚洲性天天干天天摸| 亚洲AV永久无码精品| 亚洲国产精品99久久久久久| 一级毛片不卡片免费观看| 四虎亚洲国产成人久久精品| 亚洲尤码不卡AV麻豆| 亚洲国产成人AV在线播放| 9277手机在线视频观看免费| 国产精品亚洲精品日韩已方| 亚洲综合av一区二区三区| 亚洲免费视频网站| 红杏亚洲影院一区二区三区| 亚洲youwu永久无码精品| 0588影视手机免费看片| 亚洲VA中文字幕不卡无码| 永久免费无码日韩视频| 日韩免费无码一区二区视频| 亚洲天堂一区二区三区四区| 暖暖在线视频免费视频|