當幸福來敲門

          我就會牢牢抓住!
          隨筆 - 50, 文章 - 3, 評論 - 8, 引用 - 0
          數(shù)據(jù)加載中……

          Lucene搜集 排序 、過濾、分詞

          2010-03-24 22:05 859人閱讀 評論(0) 收藏 舉報

          1.    排序

          1.1. Sort

          public Sort()

          public Sort(String field)

          public Sort(String field,Boolean reverse) //默認為false,降序排序

          public Sort(String[] fields)

          public Sort(SortField field)

          public Sort(SortField[] fields)

          Sort sort=new Sort(bookname);按照“bookname“這個Field值進行降序排序

          Sort sort=new Sort(bookname,true) //升序排序

          Sort sort=new Sort(new String[]{bookNumber,bookname,publishdate});按照三個Field進行排序,但無法指定升序排序,所以用SortField

          1.2. SortField

          public SortField(String field)

          public SortField(String field,Boolean reverse)

          public SortField(String field,int type) //type表示當前Field值的類型

          public SortField(String field,int type,boolean reverse) //默認為false,升序

          Field值的類型:SortField.STRINGSortField.INTSortField.FLOAT

          SortField sf1=new SortField(“bookNumber”,SortField.INT,false);

          SortField sf2=new SortField(“bookname”,SortField.STRING,false);

          1.3. 指定排序的法則

          1.3.1.按照文檔的得分降序排序

          Hits hits=searcher.search(query,Sort.RELEVANCE);

          1.3.2.按文檔的內(nèi)部ID升序排序

          Hits hits=searcher.search(query, Sort.INDEXORDER);

          1.3.3.按照一個Field來排序

          Sort sort=new Sort();

          SortField sf=new SortField(“bookNumber”,SortField.INT,false);

          sort.setSort(sf);

          Hits hits=searcher.search(query,sort);

          1.3.4.按照多個Field來排序

          Sort sort=new Sort();

          SortField sf1=new SortField(bookNumber,SortField.INT,false);//升序

          SortField sf2=new SortField(publishdate,SortField.STRING,true);//降序

          sort.setSort(new SortField[]{sf1,sf2});

          Hits hits=searcher.search(query,sort);

          1.3.5.改變SortField中的Locale信息

          String str1=”我”; String str2=”你”;

          Collator co1=Collator.getInstance(Locale.CHINA);

          Collator co2=Collator.getInstance(Locale.JAPAN);

          System.out.println(Locale.CHINA+:+co1.compare(str1str2));

          System.out.println(Locale.JAPAN+”:”+co2.compare(str1,str2));

          輸出結(jié)果為:

          zh_CN:1

          ja_JP:-1

          所以

          public SortField(String field,Locale locale)

          public SortField(String field,Locale locale,boolean reverse)

          2.    過濾器

          使用public Hits search(Query query,Filter filter)

          1)簡單過濾

          Hits hits=searcher.search(query,new AdvancedSecurityFilter());//過濾掉securitylevel0的結(jié)果

          2)范圍過濾—RangeFilter

          只顯示中間的

          RangeFilter filter=new RangeFilter(“publishdate”,”1970-01-01”,”1998-12-31”,true,true”);

          Hits hits=searcher.search(query,filter);

           

          無上邊界

          public static RangeFilter More(String fieldname,String lowerTerm)

           

          無下邊界

          public static RangeFilter Less(String fieldname,String upperTerm)

          (3)在結(jié)果中查詢QueryFilter

          RangeQuery q=new RangeQuery(new Term(“publicshdate”,”1970-01-01”),

          new Term(“publishdate”,”1999-01-01”),true);

          QueryFilter filter=new QueryFilter(q);

          Hits hits=searcher.search(query,filter);

          3.    分析器Analysis

          3.1. 自帶分析器和過濾器

          Ø         標準過濾器:StandardAnalyzer

          Ø         大小寫轉(zhuǎn)換器:LowerCaseFilter

          Ø         忽略詞過濾器:StopFilter

          public StopFilter(TokenStream input,String [] stopWords)

          public StopFilter(TokenStream in,String [] stopWords,boolean ignoreCase)

          public StopFilter(TokenStream input,Set stopWords,boolean ignoreCase)

          public StopFilter(TokenStream in, Set stopWords)

          其中,參數(shù)TokenStream代表當前正在進行處理的流;String類型的數(shù)組代表一個用數(shù)組表示的忽略詞集合;Set類型的參數(shù)與String一樣,是用來表示忽略詞集合的;boolean表示當與忽略詞集合中的詞進行匹配時,是否需要忽略大小寫。

          Ø         長度過濾器:LengthFilter

          Ø         PerFieldAnalyzerWrapper

          Ø         WhitespaceAnalyzer

          String str="str1 str2 str3";

                 StringReader reader=new StringReader(str);

                 Analyzer anlyzer=new WhitespaceAnalyzer();

                

                 TokenStream ts=anlyzer.tokenStream("", reader);

                 Token t=null;

                 while( (t=ts.next())!=null ){

                     System.out.println(t.termText());

                 }

          3.2. 第三方過分析器

          Ø         單字分詞

          Ø         二分法:CJKAnalyzer、中科院ICTCLAS分詞、JE分詞

          Ø         詞典分詞

          3.2.1.JE分詞用法

          3.2.1.1.    示例

          import jeasy.analysis.MMAnalyzer;

          IndexWriter writer = new IndexWriter(INDEX_STORE_PATH, new MMAnalyzer()

          , true);

          String str=" Lucene是一個全文檢索引擎的架構(gòu),"+

                     "提供了完整的查詢引擎和索引引擎。Lucene以其方便使用、快" +

                     "速實施以及靈活性受到廣泛的關注。它可以方便地嵌入到各種應用" +

                     "中實現(xiàn)針對應用的全文索引、檢索功能,本總結(jié)使用lucene--2.3.2";

                 MMAnalyzer analyzer=new MMAnalyzer();

                 try{

                     System.out.println(analyzer.segment(str, "|"));

                 }

                 catch(Exception e)

                 {

                     e.printStackTrace();

                 }

          輸出結(jié)果:lucene|一個|全文|檢索|引擎|架構(gòu)|提供|完整|查詢|。。。。

          3.2.1.2.    設定正向最大匹配的字數(shù)

          MMAnalyzer analyzer=new MMAnalyzer(4);

          3.2.1.3.    添加新詞

          MMAnalyzer.addWord(String word);

          MMAnalyzer.addDictionary(Reader reader);

           

          MMAnalyzer analyzer=new MMAnalyzer();

          MMAnalyzer.addWord("邁克爾雷第");

           

          4.    索引的合并

          RAMDirectory RAMDir=new RAMDirectory();

          IndexWriter writer = new IndexWriter(RAMDir, new StandardAnalyzer(), true);//刪除原有索引

          IndexWriter writer2=new IndexWriter(FSDirectory.getDirectory(path,true),

          new StandardAnalyzer(), true);

          writer.addDocument(doc1);

          writer2.addDocument(doc2);

          writer.close();

          writer2.addIndexes(new Directory[]{RAMDir});

          writer2.close();

          posted on 2011-12-30 16:34 wyx 閱讀(1397) 評論(0)  編輯  收藏


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


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 临清市| 乌苏市| 达日县| 荆门市| 泗水县| 吉隆县| 临江市| 宁城县| 大新县| 轮台县| 奈曼旗| 额济纳旗| 海南省| 珠海市| 巨野县| 兴化市| 嘉荫县| 涞源县| 托克逊县| 防城港市| 罗山县| 石景山区| 辽宁省| 积石山| 盐津县| 武义县| 安多县| 金湖县| 柳江县| 永宁县| 九台市| 三台县| 甘孜| 武穴市| 彭山县| 榆中县| 阿克苏市| 邢台县| 汝州市| 崇义县| 荆门市|