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

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

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

    posts - 78, comments - 34, trackbacks - 0, articles - 1
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    2010-01-05 傳智播客—luncene/compass

    Posted on 2010-01-06 16:51 長城 閱讀(1493) 評論(0)  編輯  收藏

    北京好奇怪,晝夜溫差很大,有點像月球。早起時窗上的冰霜很厚實,但到了白天陽光很足,風力很小,氣溫很好。大連現在確在降溫,零下十幾度,比較罕見。可能是我離開她一會,她卻變冷了。呵呵~~

     

    今日上午把lucene的高級部分給結束了。下午搞了一下CompassCompass是對lucene的封閉。因為lucene使用起來有些麻煩。

     

    一、lucene高級

    1.分詞器

    一般的分詞器流程:

    clip_image001
     

     


    1)         輸入文本:輸入查詢的內容。

    2)         關鍵詞切分:使用分詞器取出關鍵詞。

    3)         去除停用詞:去除沒有多大意義的詞,比如a,an,the,的,呢,吧。

    4)         形態還原:將詞的某種形態還原為原形,比如英文復數形式恢復到單數形式。

    5)         轉為小寫:將英文轉為小寫,不區分大小寫。

     

    Lucene中的分詞器

    1)         單字分詞:對應的類ChineseAnalyzer,將輸入的字符串中的每個字做為關鍵字。比如“中國人加油!”,會被切分為“中”、“國”、“人”、“加”、“油”。(標點符號屬于停用詞)

    2)         二分法分詞:對應的類CJKAnalyzer,將輸入的字符串以二分法分詞。比如“中國人加油!”,會被切分為“中國”、“國人”、“人加”、“加油”這四個關鍵字。(標點符號屬于停用詞)

    3)         詞庫分詞:對應的類MMAnalyzer最為常用的分詞器。比如“中國人加油!”,會被切分為“中國人”、“加油”。(標點符號屬于停用詞)

    示例:

    package cn.itcast.cc.anayzler;

     

    import java.io.IOException;

    import java.io.StringReader;

    import jeasy.analysis.MMAnalyzer;

    import org.apache.lucene.analysis.Analyzer;

    import org.apache.lucene.analysis.Token;

    import org.apache.lucene.analysis.TokenStream;

    import org.apache.lucene.analysis.cjk.CJKAnalyzer;

    import org.apache.lucene.analysis.cn.ChineseAnalyzer;

    import org.junit.Test;

     

    public class AnalyzerTest {

     

        Analyzer anaylzer1 = new ChineseAnalyzer();// 單字分詞

        Analyzer anaylzer2 = new CJKAnalyzer();// 二分分詞法

        Analyzer anaylzer3 = new MMAnalyzer();// 詞庫分詞

     

        @Test

        public void test() throws IOException {

            String str = "中國人加油!";

            printAnalyzer(anaylzer1, str);

            printAnalyzer(anaylzer2, str);

            printAnalyzer(anaylzer3, str);

        }

     

        private void printAnalyzer(Analyzer analyzer, String str)

                throws IOException {

            TokenStream tokenStream = analyzer.tokenStream("text", new StringReader(

                    str));

            System.out.println("*****分詞器->" + analyzer.getClass().getName() + ",將'"

                    + str + "'切分為:");

            Token token = new Token();

            while ((token = tokenStream.next(token)) != null) {

                System.out.println(token);

            }

        }

    }

     

    2.高亮

    Lucene的高亮器(Highlighter類)可以實現lucene的關鍵字高亮:

    package cn.itcast.cc.highlighter;

     

    import org.apache.lucene.analysis.Analyzer;

    import org.apache.lucene.document.*;

    import org.apache.lucene.document.Field.*;

    import org.apache.lucene.index.IndexWriter;

    import org.apache.lucene.index.IndexWriter.MaxFieldLength;

    import org.apache.lucene.queryParser.*;

    import org.apache.lucene.search.*;

    import org.apache.lucene.search.highlight.*;

    import org.apache.lucene.search.highlight.Scorer;

    import org.junit.Test;

    import jeasy.analysis.MMAnalyzer;

     

    public class HighLighterTesst {

        private String path = "./index/";// lucene的索引數據被保存在這個目錄中

        private Analyzer analyzer = new MMAnalyzer();// 詞庫分詞器

     

        @Test

        public void test() {

            try {

                // 創建索引數據

                IndexWriter indexWriter = new IndexWriter(this.path, this.analyzer,

                        MaxFieldLength.LIMITED);

                Document doc = new Document();

                doc.add(new Field("content", "中國人民加油!", Store.YES, Index.ANALYZED));

                indexWriter.addDocument(doc);

                indexWriter.close();

                // 查詢數據

                IndexSearcher indexSearcher = new IndexSearcher(this.path);

                QueryParser queryParser = new MultiFieldQueryParser(

                        new String[] { "content" }, this.analyzer);

                Query query = queryParser.parse("加油");

                TopDocs topDocs = indexSearcher.search(query, null, 10);

                // 創建高亮

                // SimpleHTMLFormatter的默認值為"<a></a>"

                Formatter formatter = new SimpleHTMLFormatter("<span>", "</span>");

                Scorer scorer = new QueryScorer(query);

                Highlighter highlighter = new Highlighter(formatter, scorer);

                // 打印結果

                for (ScoreDoc scoreDoc : topDocs.scoreDocs) {

                    // 取出查詢結果

                    Document searchdoc = indexSearcher.doc(scoreDoc.doc);

                    String searchstr = searchdoc.getField("content").stringValue();

                    // 添加高亮

                    String histr = highlighter.getBestFragment(this.analyzer,

                            "content", searchstr);

                    System.out.println(histr);

                }

                indexSearcher.close();

            } catch (Exception e) {

                e.printStackTrace();

            }

        }

    }

     

    3.排序(默認相關度排序)

    a)          實驗相關度排序,得分是在搜索時算出來的。

    b)         影響區域

    i.           整個文檔

    ii.          某個字段

    1.          建立索引時,影響它的排名,創建QueryParser時指定“MultiFieldQueryParser(String[] fields, Analyzer analyzer, Map boosts)”中第三個參數為“new HashMap<String, Float>().put(String fieldname, float fraction)”提升對應字段內容的排名。一般網站內部搜索會將標題部分的內容提升,以至于標題內容的排名大于帖子內容或回復的排名。

    2.          搜索時,標題與內容的含量排名,TopDoc有一個score屬性,它是根據文檔中關鍵字的數量,記錄文檔的得分。

    c)   按指定的字段進行排序,就是在搜索時,指定的字段。

    d)   Sort排序器,由類Sort實現。

    Sort sort = new Sort();

    sort.setSort(SortField field);

    indexSearcher.search(query, null, 100, sort);

     

    4.過濾器

    在查詢時添加一個過濾器,過濾掉查詢后不想要的內容,由Filter接口實現。

    String lower = NumberTools.longToString(3);

    String upper = NumberTools.longToString(6);

    Filter filter = new RangeFilter("id", lower, upper, true, false);

    indexSearcher.search(query, filter, 100);

    lucene中使用數值、日期數據時,必須使用NumberToolsDateTools。前后必須統一,比如使用longToStringLong轉換為String,那么也必須使用stringToLongString轉換為Long

     

    5.搜索,Query的子類對應各種查詢:

    1)         TermQuery,關鍵詞查詢:

    Term term = new Term("context", "加油");

    Query query = new TermQuery(term);

    indexSearcher.search(query, null, 100);

    2)         RangeQuery,范圍查詢:

    Term lower = new Term("content", NumberTools.longToString(3));

    Term upper = new Term("content", NumberTools.longToString(10));

    Query query = new RangeQuery(lower, upper, false/*包含邊界*/);

    indexSearcher.search(query, null, 100);

    3)         WildcardQuery,通配符查詢:

    Term term = new Term("context", "?");//?匹配任意一個字符,*代表任意多個字符。

    Query query = new TermQuery(term);

    indexSearcher.search(query, null, 100);

    indexSearcher.search(query, null, 100);

    4)         PhraseQuery,短語查詢:

    PhraseQuery phraseQuery = new PhraseQuery();

    phraseQuery.add(new Term("context", "中國人民"));

    phraseQuery.add(new Term("context", "加油"));

    phraseQuery.setSlop(5); // 指定關鍵詞之間間隔的字符的最大數量

    indexSearcher.search(query, null, 100);

    5)         BooleanQuery,布爾查詢:

    Query query1 = new TermQuery(new Term("context", "中國人民"));

    Query query2 = new TermQuery(new Term("context", "加油"));

    BooleanQuery boolQuery = new BooleanQuery();

    boolQuery.add(query1, Occur.MUST);

    boolQuery.add(query2, Occur.SHOULD);//Occur的常量值:MUSTSHOULDMUST_NOT

    indexSearcher.search(query, null, 100);

    注意:經過分詞器的所有字母,無論是添加索引還是查詢,都會被轉換為小寫的。但上邊這些查詢類沒有經過分詞器,如果查詢關鍵里有大寫字母,將查詢不到匹配的結果。所以在使用上邊這些查詢類時,查詢文本中的字母全部為小寫。我們之前使用的查詢是通過QueryParser切分出查詢關鍵字,所以使用QueryParser可以不注意大小寫問題。

    二、Compass

    Compasslucene的框架,它與hibernate極其相似(但不具有hibernate那些高級功能,比如緩存技術)。湯兄弟做的好,因為學習lucene之前的課程正是hibernate,他將hibernatecompass對比了一下,使我們學習compass更加容易了。OK,我總結一下。

    1.hibernatecompass

    clip_image001[3]

     

    clip_image001[5]

     


    hibernate

    compass

    配置方式

    1.編程方式:

      Configuation cfg = new Configu...();

      cfg.set...();

      ...

    2.配置文件:

      //默認配置,文件名為“hibernate.cfg.xml

      Configuation cfg= new Configu...();

    //指定文件名(文件名可變更)

    //cfg.configure("hibernate.cfg.xml");

    1.編程方式:

      CompassConfiguation cfg = new CompassConf...();

      cfg.set("key","value");

      ...

    2.配置文件

      //默認配置,文件名為“compass.cfg.xml

      cfg.configure();

      //指定文件名(文件名可變更)

      cfg.configure("hibernate.cfg.xml");

    配置文件

    XML文件

    注解

    XML文件

    注解

     

    2.compass中的注解配置

    package cn.itcast.cc.compass;

     

    import org.compass.annotations.Index;

    import org.compass.annotations.Searchable;

    import org.compass.annotations.SearchableId;

    import org.compass.annotations.SearchableProperty;

    import org.compass.annotations.Store;

     

    @Searchable

    public class Article {

        private Long id;

        private String title;

        private String content;

        @SearchableId

        public Long getId() { return id;}

        @SearchableProperty(store = Store.YES, index = Index.ANALYZED, boost = 2.0F, excludeFromAll = ExcludeFromAll.YES/*這個屬性的內容被查詢忽略*/)

        public String getTitle() {return title;}

        @SearchableProperty(store = Store.YES, index = Index.ANALYZED)

        public String getContent() {return content;}

        public void setId(Long id) {this.id = id;}

        public void setTitle(String title) {this.title = title;}

        public void setContent(String content) {this.content = content;}

    }

    XML配置文件,可以查看“compass-2.2.0-M2/docs/reference/html_single/index.html”手冊,內容較多。

    3.compassAPI

    CompassConfiguration cfg = new CompassConfiguration();

    cfg.setConnection("./indexPath/");// 連接信息

    cfg.addClass(Article.class);// 聲明映射信息

    Compass compassSessionFactory = cfg.buildCompass();

    CompassTransaction tx = session.beginTransaction();

    session.create(article);

    tx.commit();

    session.close();

    其他API

    session.find(String arg0);

    session.save(Object arg0);

    session.delete(Class arg0, Object arg1);

     

     

    這兩天的課程相對比較容易些,雖然容易但仍然需要一定的練習。后天就要學習jbpmOA項目了,終于開始第一個像樣的項目了,呵呵!不過感覺并沒想像中的那么復雜,因為有了jbpm


    只有注冊用戶登錄后才能發表評論。


    網站導航:
    博客園   IT新聞   Chat2DB   C++博客   博問  
     
    主站蜘蛛池模板: 成人免费毛片内射美女-百度| 亚洲精品色在线网站| 久久亚洲精品成人综合| 国产亚洲人成网站在线观看不卡 | 女人裸身j部免费视频无遮挡| 久久精品国产亚洲AV电影网| 亚洲av无码专区在线电影| 色五月五月丁香亚洲综合网| 爱爱帝国亚洲一区二区三区| 国产在亚洲线视频观看| 免费大片黄在线观看| 曰韩无码AV片免费播放不卡| 黄色网页在线免费观看| a级日本高清免费看| 国产成人久久AV免费| 亚洲大片免费观看| 又黄又爽又成人免费视频| 亚洲中文无码永久免费| 精品久久免费视频| 亚洲Av无码乱码在线观看性色| 亚洲国产黄在线观看| 国产亚洲综合成人91精品| 久久亚洲美女精品国产精品| 亚洲色av性色在线观无码| 久久久国产亚洲精品| 国产成人综合亚洲一区| 久久最新免费视频| 99久久综合精品免费| 国产无人区码卡二卡三卡免费| 日韩免费高清视频| 亚洲情a成黄在线观看| 久久精品亚洲综合| 亚洲AV无码一区二区三区牛牛| 国产精品亚洲综合网站| 一级白嫩美女毛片免费| 特级精品毛片免费观看| 一个人免费观看www视频在线| 又爽又高潮的BB视频免费看 | 国产成人一区二区三区免费视频| 亚洲综合色区在线观看| 亚洲综合久久1区2区3区|