国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

Exchange全文檢索概述

2024-07-21 02:08:39
字體:
供稿:網(wǎng)友
0、寫在前面    本文主要講述在windows2000 server環(huán)境下,exchange server和sharepoint portal server全檢索功能的應(yīng)用,同時涉及一些sql server下的概念。    本文只會對一些基本的概念進行說明,主要以個人理解和事例為主,希望了解詳細的資料,可以訪問參考文獻的連接。對于文章中的錯誤與不足,請及時指正。  1、基本概念    我相信很多人對于全文檢索的功能都非常的敬畏,心想exchange居然能夠查找一個作為附件的pdf文檔中的內(nèi)容,exchange實在太強了。其實exchange沒干啥事(還是干了點事情的,不是什么都沒做,下面會講到),全文檢索是windows下一個重要的服務(wù)“ms search service”實現(xiàn)的功能,exchange只需要和ms search交互就自然擁有了全文檢索的功能。所以在ms的enterprise server中不僅僅exchange,shareporit portal server和sql server等都支持全文檢索。    windows下還有一個服務(wù)index service,也完成類似的工作,有它存在,就連windows下的文件系統(tǒng)以及iis都可以進行全文檢索,非常方便的功能。    不知道可不可以這么說index service是ms search service的一個特例,或者倒過來,我沒有看到兩者在體系結(jié)構(gòu)以及完成功能上有什么不同,這也是我比較困惑的地方之一。     說到全文檢索必須要明確一些基本概念,我們才能夠知道那個服務(wù)干了點什么,這樣實現(xiàn)特定功能的時候才明白應(yīng)該在那一個層面上進行開發(fā)。    全文檢索分為兩部分的工作:全文索引(full-text index)和全文查詢(full-text query)。我們知道為了提高查詢的效率,有一種機制叫做“索引(index)”,索引中存儲了關(guān)鍵字和對應(yīng)的記錄在邏輯存儲空間中的位置。數(shù)據(jù)庫管理系統(tǒng)(dbms)中有索引表,相信大家都可以理解,全文檢索中也是同樣的原理。全文索引(full-text index):創(chuàng)建索引的過程,建立關(guān)鍵字與記錄的對應(yīng)關(guān)系。創(chuàng)建完成的索引信息或者以增量的方式修改屬性信息。索引分類(full-text catalog):可以認為是關(guān)鍵字存儲的組織形式。全文查詢(full-text query):利用索引分類,根據(jù)關(guān)鍵字查找對應(yīng)的記錄。    在ms的產(chǎn)品體系結(jié)果中,ms search service和index service這類服務(wù)(以后主要描述search service)的主要工作就是創(chuàng)建和維護索引表和索引分類,可以稱之為搜索引擎;諸如exchange和sql server是為記錄提供存儲空間,可以統(tǒng)稱為存儲引擎,存儲引擎必須支持ms search的一些特定接口,就可以利用。全文索引的過程就是ms search請求存儲引擎,獲得需要索引的數(shù)據(jù),分析關(guān)鍵字,創(chuàng)建或者維護索引信息;全文查詢就是存儲引擎請求ms search,ms search根據(jù)關(guān)鍵字返回對應(yīng)的紀錄的位置,存貯引擎組織這些記錄返回給調(diào)用者。     這樣我們可以了解到,如果希望支持全文檢索,那么首先要有全文檢索服務(wù)的提供者,支持全文檢索的存儲引擎。在windows server的平臺下,針對exchange的應(yīng)用,以上條件均滿足,那么我們可以開始了!  2、全文檢索下的開發(fā)    了解了windows平臺下全文檢索基本的體系結(jié)構(gòu),我們可以在很多方面進行相關(guān)的開發(fā)工作。2-1、全文查詢    全文檢索就是利用查詢語句,在存儲引擎中查找滿足條件的記錄。這個應(yīng)該是大家最熟悉也是應(yīng)用最多的方面,也是本文講述的重點,后面有專門的章節(jié)詳細描述這部分的功能。    需要指出的一點是,全文查詢的過程依賴于ms search以及他所維護的索引數(shù)據(jù),但是是存儲引擎支持的功能,這部分的應(yīng)用是與存儲引擎進行交互,ms search這個搜索引擎對我們來說是透明的。針對不同的存儲引擎,查詢語句(基本上就是select了)是不同的,不過沒有本質(zhì)的區(qū)別。 2-2、ms search下ifilter的開發(fā)    全文檢索最令人感到神奇的地方就是,他怎么能夠從word或者pdf這類二進制或者特定編碼的文件中檢索出文本字符串呢?另一個問題就是ms search是不是支持所有的文件格式呢?ms search并不能支持所有的文件格式,即使以ms之強悍,也無法對抗天下英豪,但是ms search提供一個機制,使支持任何一種格式的文檔成為可能,這個機制就是index filter,簡稱ifilter。我個人以為ifilter最終要的工作有兩個,一個是讀取指定格式的文件,解析內(nèi)部的文本內(nèi)容(而非格式或者圖形、其他二進制包容對象)和文檔屬性(例如:作者,分類等);第二個就是分詞(parsing word or phrase),全文檢索的命中率高不高,關(guān)鍵看關(guān)鍵字生成的是否合理,我總覺得目前以后的這些ifilter對于中文支持的不夠理想,檢索中文經(jīng)常莫名其妙。    windows下默認提供的ifilter有四個:針對純文本的、針對html類型文檔的、針對office系列文檔的、針對mime文件。如果想支持其他類型的文檔,就必須下載該類文檔開發(fā)商提供的ifilter,例如pdf,就需要到adobe的網(wǎng)站上去下載(http://www.adobe.com/support/downloads/product.jsp?product=1&platform=windows)。    很不幸如果你的系統(tǒng)需要支持的文檔沒有ifilter,或者你自己定義的文檔個是,那么就需要開發(fā)自定義的ifilter了。到時候需要具體問題具體分析,這里就不多說了。 2-3、開發(fā)支持全文檢索的存儲引擎    2-1關(guān)注的是用戶需求,可謂最貼近應(yīng)用領(lǐng)域的開發(fā);2-2關(guān)注的是存儲的內(nèi)容;這部分關(guān)心的就是存儲本身了。簡單的說當(dāng)你的工作是開發(fā)一個存儲管理系統(tǒng),并且希望利用已經(jīng)存在的檢索引擎(search service)那么你就需要和檢索引擎本身交道了。    在介紹概念的時候提到過,這類交互分為兩大類,一類是創(chuàng)建或者維護索引時,另一個類是查詢時。簡單的看一下檢索引擎本身,分為三部分:索引支持(indexing support)/索引引擎(index engine)和查詢支持(querying support)/查找引擎(search engine)。在創(chuàng)建索引時,存儲引擎主要和indexing support部分打交道,索引創(chuàng)建和維護的工作由index engine完成;在全文查詢時,主要和querying support打交道,查詢工作由search engine完成。    所謂支持就是實現(xiàn)一系列的接口并且調(diào)用一系列的接口,具體我也沒干過,再說也是廢話,就這些了。  3、全文查詢指南    下面將比較詳細地講解以下在exchange server 2000平臺下如何進行全文查詢。3-1、配置    缺省情況下exchange下是不啟動全文檢索的功能,需要進行一些簡單的配置。配置的過程就是為指定的存儲空間(public store或者private store)創(chuàng)建索引。    在exchange提供的管理工具system manager下,這些配置工作非常容易完成,只有三個步驟。    a)選擇特定的public store,執(zhí)行“create full-text index”的功能,這是需要選擇一個存放index catalog的目錄。    b)剛剛創(chuàng)建完的全文索引是沒有任何內(nèi)容的,需要執(zhí)行“start full population”。這是一個比較耗時的操作,不會立刻產(chǎn)生效果,也正是因為在平時創(chuàng)建好了索引信息,在使用的時候才能夠比較快速的定位記錄。    c)然后還需要修改store的屬性中有關(guān)“full-text index”的標簽頁中,修改其中的“update interval”屬性項,選擇自動更新索引信息的時間間隔,如果選擇的是“always run”,那么就會實時更新,當(dāng)然系統(tǒng)開銷也就比較大。當(dāng)然也可以通過“start incremental population”,以手動的方式,更新索引信息。    d)此外還需要在“full-text index”標簽頁中,選擇“this index is currently available for searching by clients”屬性項,這樣在查詢過程中就會使用這部分創(chuàng)建的索引信息。     這一部分的功能我沒有找到編程接口,所以目前只能夠通過手動的方式配置。希望了解詳細的內(nèi)容,可以查閱ms相關(guān)的白皮書。 3-2、查詢語句的語法說明    2-1中提到查詢語句是沒一個存儲引擎所提供的,通常都是針對select語句的擴展,下面將以exchange的store sql為例講解一下全文查詢。    exchange下全文查詢的語句并不復(fù)雜,在exchange store sql中提供了如下謂詞(predicate)加以支持,在where子句(clause)中包含如下謂詞,即可以繼續(xù)全文檢索:    contains:進行關(guān)鍵字的完整單詞的匹配,格式為,        contains( [" propertyname " | * , ] ' searchspec ' )        如果“propertyname”部分*(astrisk),則在所有屬性中檢索關(guān)鍵字,不包含"propertyname",則在消息或者文檔的正文部分檢索關(guān)鍵字,下同。“searchspec”部分包含關(guān)鍵字,通配符*,例如'good*';也可以包含多個關(guān)鍵字組合查找,支持邏輯操作符and和or。每個關(guān)鍵字需要用"(quote)包含,否則會產(chǎn)生語法錯誤。    freetext:與contains比較類似,但是可以對關(guān)鍵字中每一個單詞或者一組單詞的多種變化形式進行模糊(loosely)匹配,格式為,        freetext( [" propertyname ", ] ' searchspec ' )
        這里需要強調(diào)的是,對于關(guān)鍵字變換形式的匹配,而不是關(guān)鍵字子串(substring)的匹配,也就是說可以通過'rose'找到'roses',但是不能夠通過'public'找到'republican'。    formsof:這個謂詞需要包含在contains或者freetext謂詞中使用,通過該謂詞修飾,可以對關(guān)鍵字的每一個變換形式進行匹配,關(guān)鍵字的變換形式是由搜索引擎決定的。格式為,        formsof( type,"string" [,"string"] )        在exchange中type參數(shù)的值恒為inflectional。    rank by:該謂詞通常用來修飾contains或者freetext謂詞,用來表示關(guān)鍵字出現(xiàn)的頻度。格式為,        rank by clause (mechanism, weight)        其中clause參數(shù)為weight或者coercion,weight表示權(quán)值,corecion居然沒有任何說明。mechanism參數(shù),表示行為,例如weight或者multiphy。weight為0-1之間的一個數(shù)值,表示權(quán)重。        當(dāng)where子句中包含多部分contains和freetext時,有了rank by,可以認為是匹配度,非常有用。添加rank by謂詞之后,可以讀取"urn:schemas.microsoft.com:fulltextqueryinfo"屬性的值,來比較記錄之間的匹配程度。我不知道該屬性最大的值為多少,但是從獲得的實際數(shù)據(jù)的情況來看,最大為128。    來看一個完整的例子:        select "dav:href","urn:schemas.microsoft.com:fulltextqueryinfo:rank"              from scope('deep traversal of ""')             where freetext('"program" or "software"') rank by weight(1.0) or contains('formsof(inflectional,"java") and "vb"') rank by weight(0.5)    以上僅僅對有關(guān)全文查詢相關(guān)的內(nèi)容進行說明,完成的store sql的語法,參閱msdn中的文檔。     順便說一句,exchange主要提供協(xié)同服務(wù),而非文檔管理,所以在全文檢索的支持上并非特別強大和靈活。ms的另一個服務(wù)器產(chǎn)品sharepoint portal server,主要功能是文檔管理,其重要應(yīng)用之一即提供檢索服務(wù),所以它的全文檢索的功能更加強大一點。除了上述內(nèi)容外,還提供了near、isabout、rankmethod等修飾項(term),可以更好的控制查詢條件。其中細節(jié)也請自行參閱相關(guān)文檔。 3-3、ado & webdav    在執(zhí)行查詢時可以采用兩種方法,ado或者webdav。這里只列舉實現(xiàn)的代碼加以說明。    3-3-1、webdav。    通過向指定查詢的url發(fā)送http的search請求,命令參數(shù)和相應(yīng)的數(shù)據(jù),都是一定格式的xml文檔(參看webdav的參考手冊)。示例如下:  private system.xml.xmldocument sendsearchrequest(system.string surl,system.string squery)
  {
   system.net.httpwebrequest  orequest = null;
   system.net.httpwebresponse  oresponse = null;
   system.net.networkcredential ocredential = null;
   system.io.stream    ostream = null;
   system.text.utf8encoding  oencoder = new system.text.utf8encoding();
   system.byte[]     abdata = null;
   system.xml.xmldocument   xmldoc = null;    if ( surl == null || surl == string.empty)
    return null;
   if (squery == null || squery == string.empty)
    return null;    abdata = oencoder.getbytes(squery);
   if (abdata == null)
    return null;    ocredential = new networkcredential("administrator","server",string.empty);
   orequest = (system.net.httpwebrequest) webrequest.create(surl);
   if (orequest != null)
   {
    // preparing search request
    orequest.protocolversion = httpversion.version11;
    orequest.method = @"search";
    if (ocredential != null)
     orequest.credentials = ocredential.getcredential(new system.uri(surl),string.empty);
    orequest.contenttype = @"text/xml";
    orequest.contentlength = abdata.length;
    ostream = orequest.getrequeststream();
    ostream.write(abdata,0,abdata.length);
    ostream.close();
    // waiting for response
    try
    {
     oresponse = (system.net.httpwebresponse) orequest.getresponse();
     orequest = null;
    }
    catch(system.exception e)
    {
     trace.writeline("sendsearchrequest: " + e.message);
    }
    if (oresponse != null)
    {
     ostream = oresponse.getresponsestream();
     // get data from stream
     if (ostream != null)
     {
      try
      {
       xmldoc = new xmldocument();
       if (xmldoc != null)
       {
        xmldoc.load(ostream);
       }
      }
      catch(system.exception e)
      {
       trace.writeline("sendsearchrequest: " + e.message);
      }
      ostream.close();
      ostream = null;
     }
    }
    oresponse = null;
   }    return xmldoc;
  }
    傳入?yún)?shù)分別為,需要查詢的根路徑(可以認為是表名,這里為http url)和查詢語句(格式見上一節(jié)),返回的結(jié)果為包含查詢結(jié)果的xmldocument實例。     3-3-2、ado。    exchange提供了兩種provider,exoledb和msdaipp,可供ado調(diào)用,但是只有msdaipp這個provider支持全文檢索,而且當(dāng)在exchange安裝的主機上采用msdaipp進行全文檢索時,會產(chǎn)生一些不可知的錯誤,比如掛起之類,所以建議采用webdav。    ado的示例如下:  private adodb.recordsetclass getqueryresult(system.string surl,system.string squery)
  {
   adodb.recordsetclass rsresult = null;
   adodb.connectionclass cnnexchange = null;
   adodb.commandclass  cmdquery = null;
   system.object   objaffectedrecords = null,objparams = null;    if (surl == null || surl == string.empty)
    return null;
   if (squery == null || squery == string.empty)
    return null;    try
   {
    cnnexchange = new connectionclass();
    if (cnnexchange == null)
     return null;
    cnnexchange.provider = "provider=msdaipp.dso";
    cnnexchange.open(surl,string.empty,string.empty,0);
   }
   catch (system.exception e)
   {
    trace.writeline("getqueryresult: create connection failed! " + e.message);
    cnnexchange = null;
    return null;
   }    cmdquery = new commandclass();
   if (cmdquery != null)
   {
    cmdquery.activeconnection = cnnexchange;
    cmdquery.commandtype = commandtypeenum.adcmdtext;
    cmdquery.commandtext = squery;
    try
    {
     rsresult = (adodb.recordsetclass) cmdquery.execute(out objaffectedrecords,ref objparams,0);
    }
    catch (system.exception e)
    {
     trace.writeline("getqueryresult: query data failed! " + e.message);
    }
    cmdquery = null;
   }
   cnnexchange = null;    return rsresult;
  }
    傳入?yún)?shù)分別為,需要查詢的根路徑(可以認為是表名)和查詢語句,返回的結(jié)果為包含查詢結(jié)果的recordset實例。需要強調(diào)的是msadipp的provider不支持在打開連接時指定訪問用戶名和口令。     以上就是在exchange下全文檢索的簡要介紹。有關(guān)ifilter和存儲引擎開發(fā)的要點,等有機會再進一步闡述。  參考文檔a、sql server體系結(jié)構(gòu)(full-text support)(http://msdn.microsoft.com/library/en-us/architec/8_ar_sa2_0ehx.asp)b、using custom filter with index service(http://msdn.microsoft.com/library/en-us/indexsrv/html/ixufilt_912d.asp)c、exchagne store sql(http://msdn.microsoft.com/library/en-us/wss/wss/_exch2k_sql_web_storage_system_sql.asp)
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 商城县| 烟台市| 焉耆| 南阳市| 庐江县| 富源县| 邵阳县| 阿克| 房山区| 长岭县| 依安县| 阜宁县| 鄂伦春自治旗| 丹寨县| 封开县| 淮北市| 农安县| 会理县| 湖北省| 静乐县| 古浪县| 定边县| 张家界市| 都昌县| 柯坪县| 沙坪坝区| 海阳市| 天峨县| 桃园县| 肇东市| 开平市| 北碚区| 阳朔县| 雷州市| 林州市| 巴南区| 大余县| 康保县| 康乐县| 拉萨市| 台前县|