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

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

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

    szhswl
    宋針還的個人空間
    在許多應用程序中,用戶總會提出搜索和查詢領域實例的需求。他們或者希望構建一個進入應用程序的入口或者希望填充表單的機制。非常典型的解決方案是用瀏覽的方式(把領域的繼承關系表現出來,這樣用戶可以定位和選擇一個自己需要的)或者一個檢索表單的方式(展現一個多個輸入域的表單,用戶可以檢索他們需要的信息)。

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

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

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

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

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

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

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

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

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

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

    // 在程序中配置和創建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,它使用流行的設計模式來抽象事務管理。第二個選擇是在和事務管理環境下,這樣,Compass與JTA與Spring這樣的事務管理器集成并在一個已經存在的事務中執行。這個情況下,當一個 Session執行的時候,CompassSession 可被用做一個自動加入事務處理的代理。這個代理的創建可以是編程式的,也可使用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)組成。這是用來索引可搜索內容的抽象數據對象。
    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和幾個附加的屬性。定義屬性是可選的,盡管他們允許聲明式的控制不同屬性的特征,包括和一個轉換器關聯。下面的示例代碼填充了一個資源并索引它。

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

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

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

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

    下面是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實現),把XML數據結構直接映射到搜索引擎。XSEM的處理同樣的通過對資源“植入”和“植出”的處理。Compass提供了一個XML包裝對象叫做XmlObject,它定義了不同的實現(dom4j, W3C Document),這些實現允許XPath表達式來求值。如果我們給出下面的XML數據結構:

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

    下面是個XSEM的實現:

    <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數據結構到搜索引擎的映射是使用XPath表達式來完成。XML內容映射可以在搜索引擎中存儲為XML結構,這樣就可以加載和搜索數據。 Compass支持多種XML DOM框架(為XML內容作映射),包括JSE5, dom4j(SAX 和XPP),當然定制的實現也很好做。下面是個不錯的例子:

    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的一個組件,用來把不同的數據源與Compass集成。大部分常用的數據源是Compass與ORM工具的集成。Compass支持JPA、Hibernate、OJB、JDO和iBatis。

    拿Hibernate作為例子,Compass給出了兩個主要的操作:索引與鏡像。擁有這兩個映射的對象可以通過使用Hibernate API注冊時間監聽,進行自動的鏡像操作到搜索引擎。下面的例子給出了怎樣使用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()));


    總結

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

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

    ---------------------------------------------------------------------------------------------------------------------------------
    說人之短,乃護己之短。夸己之長,乃忌人之長。皆由存心不厚,識量太狹耳。能去此弊,可以進德,可以遠怨。
    http://www.tkk7.com/szhswl
    ------------------------------------------------------------------------------------------------------ ----------------- ---------
    posted on 2007-12-12 15:20 宋針還 閱讀(440) 評論(0)  編輯  收藏 所屬分類: 搜索引擎
    主站蜘蛛池模板: 四虎精品免费永久免费视频| 亚洲AV无码专区在线观看成人| 久久高潮一级毛片免费| 国产在线观看免费不卡| 亚洲AV成人精品一区二区三区| 麻豆国产VA免费精品高清在线| 亚洲自偷自偷在线成人网站传媒| 成人免费激情视频| 久久精品国产亚洲AV蜜臀色欲| 91在线视频免费91| 激情综合亚洲色婷婷五月| 性短视频在线观看免费不卡流畅 | 国产免费一区二区三区免费视频| AV在线播放日韩亚洲欧| 你是我的城池营垒免费观看完整版 | eeuss影院ss奇兵免费com| 国产亚洲精久久久久久无码77777| 99在线免费观看| 91亚洲国产成人精品下载| 嫖丰满老熟妇AAAA片免费看| 亚洲精品无码成人| 亚洲男女内射在线播放| 国产午夜无码精品免费看动漫| 亚洲午夜未满十八勿入| 成人超污免费网站在线看| 亚洲AV无码国产剧情| 亚洲精品国精品久久99热| 免费毛片a线观看| 亚洲成aⅴ人在线观看| 免费特级黄毛片在线成人观看 | 久久免费精品视频| 亚洲福利电影在线观看| 日韩伦理片电影在线免费观看| 色爽黄1000部免费软件下载| 久热综合在线亚洲精品| 成年女人毛片免费播放人| 精品久久久久久无码免费| 亚洲乱码一区av春药高潮| 亚洲人成国产精品无码| 成人免费观看一区二区| 一级毛片大全免费播放|