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

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

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

    szhswl
    宋針還的個人空間
    在許多應用程序中,用戶總會提出搜索和查詢領域?qū)嵗男枨蟆K麄兓蛘呦M麡?gòu)建一個進入應用程序的入口或者希望填充表單的機制。非常典型的解決方案是用瀏覽的方式(把領域的繼承關系表現(xiàn)出來,這樣用戶可以定位和選擇一個自己需要的)或者一個檢索表單的方式(展現(xiàn)一個多個輸入域的表單,用戶可以檢索他們需要的信息)。

    現(xiàn)實中,對于可用性的角度來說,這兩種方案都不是最佳的。瀏覽的方式會在有許多分支的時候變得緩慢而笨重。而且,用戶通常精確地知道他們要用到那個應用,然而卻不情愿要瀏覽整個系統(tǒng)來找到他要的應用。檢索表單的方式同樣被檢索條件個數(shù)的多少限制住了。這就要在設置足夠的檢索域還是檢索表單的復雜性上作出權(quán)衡。

    從可用性的角度來說,解決這個問題的答案就是提供一個單一的、Google樣式的檢索框,用戶可以輸入任何符合實例字段的內(nèi)容。他們可以檢索和表示符合這些內(nèi)容的結(jié)果。表單中的這個檢索框可以自動填充、Google建議模式的輸入框,或者是返回表格式結(jié)果的正則表達式搜索。不管怎樣,這種解決方案的精髓就是UI是簡單的,用戶可以輸入任何他們選擇的條件,然后由搜索引擎去做這些復雜的工作。現(xiàn)在唯一的問題時:如何實現(xiàn)這樣的搜索機能。

    當面對實現(xiàn)傳統(tǒng)的多輸入域的表單的時候,大部分應用程序都選擇了SQL。典型的情況是,檢索的字段都與列名相匹配,并且使用SQL的LIKE語句。然而,因為復雜的SQL要去匹配太多的字段,并且很多情況下由于這些字段的文本長度問題,造成實現(xiàn)的性能經(jīng)常是非常差的。第二個問題是,對檢索結(jié)果沒有排名并且返回的提示并沒有反應出與查詢的內(nèi)容有多大相關性,只是簡單地返回結(jié)果罷了。第三,對檢索結(jié)果相關聯(lián)的關鍵字沒有高亮表示。

    很快,大家意識到大部分應用程序需要搜索引擎。所有實體的字段可以像只有一個文件那樣被索引,并且是正則文本搜索可以匹配的實體。現(xiàn)在非常流行的搜索引擎之一是Luence。Lucene是相當不錯的搜索引擎,在很多項目中應用成功。它提供了底層的搜索引擎API,能夠使用Lucene數(shù)據(jù)結(jié)構(gòu)(Document/Field)去索引數(shù)據(jù),能供使用查詢API或搜索引擎在索引上檢索。它已經(jīng)在多種編程語言上實現(xiàn)了全部功能,包括Java、C#和 C++等。

    如果我們分析一個典型的Web應用程序,一般都有個一個共通的架構(gòu)和特點。通常,應用與后端的關系數(shù)據(jù)庫一起工作。這個應用使用領域模型表示這個系統(tǒng)中的實體,并使用ORM框架把領域模型映射到數(shù)據(jù)庫上。一般情況下,使用一個服務層框架去管理事務、協(xié)作,有時也包括業(yè)務邏輯和Web框架。問題就在于怎么把Lucene集成到這樣的應用程序中去。

    當你試圖去集成Lucene的時候,剛剛把第一個簡單的程序跑起來的時候,馬上就會遇到一連串的挑戰(zhàn)。第一個問題就是索引應用數(shù)據(jù)。在之前很長一段時間,相當多的樣板式代碼熱衷于把領域模型映射到Lucene數(shù)據(jù)模型上去。Lucene文檔,是Lucene主要的數(shù)據(jù)結(jié)構(gòu),它是一個扁平的類似Map 的,只包含字符串的數(shù)據(jù)結(jié)構(gòu)——所以許多無意義的代碼熱衷于“植入”和“植出”領域模型。另外一個問題是缺少對Lucene的事務控制,把領域模型數(shù)據(jù)存儲到數(shù)據(jù)庫和搜索引擎是有問題的。而且還有幾個其他的很有名的實踐和模式要在Lucene中實現(xiàn),比如緩存、隱式的搜索、為支持Google樣式的搜索而創(chuàng)建聚集的屬性和為合適的語義保持可識別的Document對象,等等。
    Compass簡介

    Compass的設計目標是簡化企業(yè)在集成搜索功能時的花費。Compass是在Lucene之上,使用了設計很好的搜索引擎的抽象。Compass擴展了核心Lucene,增加了事務控制功能和快速更新,也包括在數(shù)據(jù)庫存儲索引的功能。當然,它沒有去隱藏Lucene的特性——所有Lucene的功能都能通過Compass實現(xiàn)。
    Compass核心API

    Compass提供給了我們簡單的并且熟悉的API。說Compass提供了讓人熟悉的API是因為它模仿了當前流行的ORM框架的API來降低學習曲線。Compass以下面一些主要的接口作為主要內(nèi)容:

        * CompassConfiguration:用來在一些設置參數(shù)、配置文件和映射定義上配置Compass。通常用來創(chuàng)建Compass接口。
        * Compass:為單線程使用,創(chuàng)建線程安全的實例來打開Compass Seesion。同樣還提供了一些搜索引擎索引級別的操作。
        * CompassSesssion:用來執(zhí)行像保存、刪除、查找、裝載這樣的搜索操作。很輕量但是并不是線程安全的。
        * CompassTransaction:管理Compass事務的接口。使用它并不需要事務管理環(huán)境(像Spring、JTA)。

    下面是使用這些API的一個簡單的例子:

    // 在程序中配置和創(chuàng)建Compass
    CompassConfiguration conf =
         new CompassConfiguration().setConnection("/tmp/index").addClass(Author.class);
    Compass compass = conf.buildCompass();

      // 一個請求操作
    CompassSession session = compass.openSession();
    CompassTransaction tx = null;
    try {
         tx = session.beginTransaction();
         ...
         session.save(author);
         CompassHits hits = session.find("jack london");
         Author a = (Author) hits.data(0);
         Resource r = hits.resource(0);
         ...
         tx.commit();
    } catch (CompassException ce) {
         if (tx != null) tx.rollback();
    } finally {
         session.close();
    }

    為了簡化事務管理代碼,Compass提供了好幾種選擇,首先是使用CompassTemplate,它使用流行的設計模式來抽象事務管理。第二個選擇是在和事務管理環(huán)境下,這樣,Compass與JTA與Spring這樣的事務管理器集成并在一個已經(jīng)存在的事務中執(zhí)行。這個情況下,當一個 Session執(zhí)行的時候,CompassSession 可被用做一個自動加入事務處理的代理。這個代理的創(chuàng)建可以是編程式的,也可使用Spring IOC(Spring 2 中支持@CompassContext)。

    Compass支持原子性的事務運算,與不同的事務管理策略集成,包括本地事務管理、JTA同步、XA for JTA的集成,Spring同步的集成。

    Compass的配置基于“鍵—值”的一一對應的設置。Compass可以使用編程式的配置,基于XML DTD的配置(定義映射和設置),基于XML Schema的配置。基于XML Schema的配置得到了Spring2新的基于Schema配置文件的支持。
    搜索引擎映射

    Compass的主要功能之一就是從應用程序模型到搜索引擎的聲明式映射。Compass搜索引擎的領域模型由資源(Lucene Document)和屬性(一個Lucene Field)組成。這是用來索引可搜索內(nèi)容的抽象數(shù)據(jù)對象。
    RSEM

    第一個映射是RSEM(Resource/SearchEngine Mapping)。這是一個低級別從Compass資源和屬性到搜索引擎抽象到搜索引擎的映射。下面是個對作者資源的RSEM的示例:

    <resource alias="author">
        <resource-id name="id"/>
        <resource-property name="firstName"/>
        <resource-property name="lastName" store="yes" index="tokenized"/>
        <resource-property name="birthdate" converter="mydate"/>
      </resource>
      

    上面的例子中,我們定義了一個映射了作者別名的資源。這個資源的映射包括標識資源的ID和幾個附加的屬性。定義屬性是可選的,盡管他們允許聲明式的控制不同屬性的特征,包括和一個轉(zhuǎn)換器關聯(lián)。下面的示例代碼填充了一個資源并索引它。

    Resource r = session.createResource("author");
      r.addProperty("id", "1")
        .addProperty("firstName", "jack")
        .addProperty("lastName", "london")
        .addProperty("birthdate", new Date());
      session.save(r);
      

    上面的代碼顯示了一些Compass的特性。第一,由于一個資源是可識別的,Compass在這個資源已經(jīng)存在的情況下更新它。第二,可以聲明式的分配一個轉(zhuǎn)換器給這個資源,可以使用Compass內(nèi)置的許多轉(zhuǎn)換器。下面是上面示例代碼的Compass配置(包括對mydate轉(zhuǎn)換器的配置):

    <compass-core-config xmlns="http://www.opensymphony.com/compass/schema/core-config"
          xsi:schemaLocation="http://www.opensymphony.com/compass/schema/core-config
          http://www.opensymphony.com/comp ... ass-core-config.xsd">
        <compass name="default">
          <connection>
                <file path="index" />
          </connection>
          <converters>
            <converter name="mydate" type="org.compass.core.converter.basic.DateConverter">
              <setting name="format" value="yyyy-MM-dd" />
            </converter>
          </converters>
          <mappings>
            <resource location="sample/author.cpm.xml" />
          </mappings>
        </compass>
      </compass-core-config>
      

    OSEM

    OSEM(Object/Search Engine Mapping)是第二個支持的映射方案。它允許把應用對象的領域模型映射到搜索引擎。下面是Author類,使用注釋對它進行了OSEM定義:

    @Searchable
    public class Author {

        @SearchableId
       private Long id;

        @SearchableComponent
       private String Name;

        @SearchableReference
       private List books;

        @SearchableProperty(format = "yyyy-MM-dd")
       private Date birthdate;
    }

      // ...

    @Searchable
    public class Name {

        @SearchableProperty
       private String firstName;

        @SearchableProperty
       private String lastName;
    }

    OSEM支持“植入”和“植出”一個對象的分層結(jié)構(gòu)進入一個資源。當存儲一個Author對象,Compass就會“植入”進一個資源,Name類也會“植入”進相同的資源來表示這個作者(由于組件的映射),也包括一個這個作者書籍列表里的每一本書(存儲在其他的資源里)的引用。這個最后得到的資源會存儲或者索引在搜索引擎中。

    Compass提供了非常靈活的機制來把領域模型映射到搜索引擎中。上面的例子只是一個很簡單的例子。OSEM允許制定不同的轉(zhuǎn)換器,一個類屬性對應多個元數(shù)據(jù)(從資源到屬性的映射)、分析器和所有參與的字段,等等。

    下面是author類怎樣使用的例子:

    // ...
    Author author = new Author(1, new Name("jack", "london"), new Date());
    session.save(author);
    // ...
    author = (Author) session.load(Author.class, 1);

    XSEM

    最后,Compass支持的搜索引擎映射是XSEM(Xml/Search Engine Mapping)。這種映射允許基于XML映射的定義(用XPath實現(xiàn)),把XML數(shù)據(jù)結(jié)構(gòu)直接映射到搜索引擎。XSEM的處理同樣的通過對資源“植入”和“植出”的處理。Compass提供了一個XML包裝對象叫做XmlObject,它定義了不同的實現(xiàn)(dom4j, W3C Document),這些實現(xiàn)允許XPath表達式來求值。如果我們給出下面的XML數(shù)據(jù)結(jié)構(gòu):

    <xml-fragment>
        <author id="1">
          <firstName>Jack</firstName>
          <lastName>London</lastName>
        </author>
      </xml-fragment>
      

    下面是個XSEM的實現(xiàn):

    <compass-core-mapping>
        <xml-object alias="author" xpath="/xml-fragment/author">
          <xml-id name="id" xpath="@id" />
          <xml-property xpath="firstName" />
          <xml-property xpath="lastName" />
          <xml-content name="content" />
        </xml-object>
      </compass-core-mapping>
      

    從XML數(shù)據(jù)結(jié)構(gòu)到搜索引擎的映射是使用XPath表達式來完成。XML內(nèi)容映射可以在搜索引擎中存儲為XML結(jié)構(gòu),這樣就可以加載和搜索數(shù)據(jù)。 Compass支持多種XML DOM框架(為XML內(nèi)容作映射),包括JSE5, dom4j(SAX 和XPP),當然定制的實現(xiàn)也很好做。下面是個不錯的例子:

    Reader reader = // construct an xml reader over raw xml content
    AliasedXmlObject xmlObj = RawAliasedXmlObject("author", reader);
    session.save(xmlObj);
    // ...
    Resource resource = session.loadResource("author", 1);
    // since we have xml-content, we can do the following as well
    XmlObject xmlObj = session.load("author", 1);

    Compass Gps

    Compass Gps 是Compass的一個組件,用來把不同的數(shù)據(jù)源與Compass集成。大部分常用的數(shù)據(jù)源是Compass與ORM工具的集成。Compass支持JPA、Hibernate、OJB、JDO和iBatis。

    拿Hibernate作為例子,Compass給出了兩個主要的操作:索引與鏡像。擁有這兩個映射的對象可以通過使用Hibernate API注冊時間監(jiān)聽,進行自動的鏡像操作到搜索引擎。下面的例子給出了怎樣使用Compass Gps集成Hibernate:

    SessionFactory sessionFactory = // Hibernate Session Factory
    Compass compass = // set up a Compass instance
    CompassGps gps = new SingleCompassGps(compass);
    CompassGpsDevice device = new Hibernate3GpsDevice("hibernate", sessionFactory);
    gps.addDevice(device);
    // start the gps, mirroring any changes made through Hibernate API
    // to be mirrored to the search engine
    gps.start();

      // ....

      // this will cause the database to be indexed
    gps.index();
      // this will cause Hibernate to store the author in the database
      // and also index the author object through Compass
    hibernateSess.save(new Author(1, new Name("jack", "london"), new Date()));


    總結(jié)

    這篇文章對Compass的主要功能的做了介紹,但只是覆蓋了怎樣使用Compass的基本功能(尤其,Compass還有個與Spring集成的擴展組件,這個并沒介紹)。在使用搜索引擎的時候,Compass同樣也有很多現(xiàn)在流行功能和有一些細微的差別功能,還有配置擴展功能。Compass的主要目標,像剛才提到的,是簡化集成搜索到任何類型的應用程序中,這篇文章只是介紹了怎么使用的基本信息。

    個人收藏資料,本文嚴重抄襲:http://bbs.51cto.com/thread-442091-1-1.html

    ---------------------------------------------------------------------------------------------------------------------------------
    說人之短,乃護己之短。夸己之長,乃忌人之長。皆由存心不厚,識量太狹耳。能去此弊,可以進德,可以遠怨。
    http://www.tkk7.com/szhswl
    ------------------------------------------------------------------------------------------------------ ----------------- ---------
    posted on 2007-12-12 15:20 宋針還 閱讀(440) 評論(0)  編輯  收藏 所屬分類: 搜索引擎
    主站蜘蛛池模板: 暖暖免费高清日本中文| 成年女人免费视频播放77777| 91在线视频免费观看| 国产精品美女午夜爽爽爽免费| 午夜影视日本亚洲欧洲精品一区| 精品亚洲成A人在线观看青青| 啦啦啦完整版免费视频在线观看| 亚洲人成图片小说网站| 亚洲日韩中文字幕一区| 国产亚洲漂亮白嫩美女在线| 成年性羞羞视频免费观看无限| 曰批全过程免费视频免费看| 免费的一级黄色片| 亚洲国产精品综合久久20| 免费国产黄网站在线观看| 国产∨亚洲V天堂无码久久久| eeuss影院免费直达入口| 国产a不卡片精品免费观看| 国产亚洲美女精品久久久久| 亚洲成a人片在线观看中文动漫| 四虎影视免费在线| 美女被艹免费视频| 亚洲精品国产日韩无码AV永久免费网| 亚洲国产无线乱码在线观看| 国产成人免费高清在线观看| 美女黄频免费网站| 亚洲国产精品久久人人爱| 成年免费a级毛片免费看无码| 亚洲日韩aⅴ在线视频| 在线观看免费宅男视频| 99蜜桃在线观看免费视频网站| 深夜福利在线视频免费| 精品亚洲视频在线观看| 9久久免费国产精品特黄| 亚洲成人午夜在线| 亚洲国产V高清在线观看| 99久久成人国产精品免费| 国产综合成人亚洲区| 亚洲伊人久久大香线蕉在观| 亚洲国产精品国自产电影| 日韩中文字幕精品免费一区|