Lucene-2.0學習文檔(3)

接http://www.javaeye.com/post/190335 到現在我們已經可以用lucene建立索引了 下面介紹一下幾個功能來完善一下: 1.索引格式 其實索引目錄有兩種格式,一種是除配置文件外,每一個Document獨立成爲一個文件(這種搜索起來會影響速度)。另一種是全部的Document成一個文件,這樣屬於複合模式就快了。 2.索引文件可放的位置: 索引可以存放在兩個地方1.硬盤,2.內存 放在硬盤上可以用FSDirectory(),放在內存的用RAMDirectory()不過一關機就沒了 FSDirectory.getDirectory(File file, boolean create) FSDirectory.getDirectory(String path, boolean create)兩個工廠方法返回目錄 New RAMDirectory()就直接可以 再和IndexWriter(Directory d, Analyzer a, boolean create)一配合就行了 如: IndexWrtier indexWriter = new IndexWriter(FSDirectory.getDirectory(“c://index”,true),new StandardAnlyazer(),true); IndexWrtier indexWriter = new IndexWriter(new RAMDirectory(),new StandardAnlyazer(),true); 3.索引的合併 這個可用IndexWriter.addIndexes(Directory[] dirs)將目錄加進去 來看個例子: [code] public void UniteIndex() throws IOException     {         IndexWriter writerDisk = new IndexWriter(FSDirectory.getDirectory("c://indexDisk", true),new StandardAnalyzer(),true);         Document docDisk = new Document();         docDisk.add(new Field("name","程序員之家",Field.Store.YES,Field.Index.TOKENIZED));         writerDisk.addDocument(docDisk);         RAMDirectory ramDir = new RAMDirectory();         IndexWriter writerRam = new IndexWriter(ramDir,new StandardAnalyzer(),true);         Document docRam = new Document();         docRam.add(new Field("name","程序員雜誌",Field.Store.YES,Field.Index.TOKENIZED));         writerRam.addDocument(docRam);         writerRam.close();//這個方法非常重要,是必須調用的         writerDisk.addIndexes(new Directory[]{ramDir});         writerDisk.close();     }     public void UniteSearch() throws ParseException, IOException     {         QueryParser queryParser = new QueryParser("name",new StandardAnalyzer());         Query query = queryParser.parse("程序員");         IndexSearcher indexSearcher =new IndexSearcher("c://indexDisk");         Hits hits = indexSearcher.search(query);         System.out.println("找到了"+hits.length()+"結果");         for(int i=0;i         {             Document doc = hits.doc(i);             System.out.println(doc.get("name"));         } } [/code] 這個例子是將內存中的索引合併到硬盤上來. 注意:合併的時候一定要將被合併的那一方的IndexWriter的close()方法調用。 4.對索引的其它操作: IndexReader類是用來操作索引的,它有對Document,Field的刪除等操作。 下面一部分的內容是:全文的搜索 全文的搜索主要是用:IndexSearcher,Query,Hits,Document(都是Query的子類),有的時候用QueryParser 主要步驟: 1.new QueryParser(Field字段,new 分析器) 2.Query query = QueryParser.parser(“要查詢的字串”);這個地方我們可以用反射api看一下query究竟是什麼類型 3.new IndexSearcher(索引目錄).search(query);返回Hits 4.用Hits.doc(n);可以遍歷出Document 5.用Document可得到Field的具體信息了。 其實1 ,2兩步就是爲了弄出個Query 實例,究竟是什麼類型的看分析器了。 拿以前的例子來說吧 QueryParser queryParser = new QueryParser("name",new StandardAnalyzer());         Query query = queryParser.parse("程序員"); /*這裏返回的就是org.apache.lucene.search.PhraseQuery*/         IndexSearcher indexSearcher =new IndexSearcher("c://indexDisk");         Hits hits = indexSearcher.search(query); 不管是什麼類型,無非返回的就是Query的子類,我們完全可以不用這兩步直接new個Query的子類的實例就ok了,不過一般還是用這兩步因爲它返回 的是PhraseQuery這個是非常強大的query子類它可以進行多字搜索用QueryParser可以設置各個關鍵字之間的關係這個是最常用的了。 IndexSearcher: 其實IndexSearcher它內部自帶了一個IndexReader用來讀取索引的,IndexSearcher有個close()方法,這個方法不是用來關閉IndexSearche的是用來關閉自帶的IndexReader。 QueryParser呢可以用parser.setOperator()來設置各個關鍵字之間的關係(與還是或)它可以自動通過空格從字串裏面將關鍵字分離出來。 注意:用QueryParser搜索的時候分析器一定的和建立索引時候用的分析器是一樣的。 Query: 可以看一個lucene2.0的幫助文檔有很多的子類: BooleanQuery, ConstantScoreQuery, ConstantScoreRangeQuery, DisjunctionMaxQuery, FilteredQuery, MatchAllDocsQuery, MultiPhraseQuery, MultiTermQuery, PhraseQuery, PrefixQuery, RangeQuery, SpanQuery, TermQuery 各自有用法看一下文檔就能知道它們的用法了 下面一部分講一下lucene的分析器: 分析器是由分詞器和過濾器組成的,拿英文來說吧分詞器就是通過空格把單詞分開,過濾器就是把the,to,of等詞去掉不被搜索和索引。 我們最常用的是StandardAnalyzer()它是lucene的標準分析器它集成了內部的許多的分析器。 最後一部分了:lucene的高級搜索了 1.排序 Lucene有內置的排序用IndexSearcher.search(query,sort)但是功能並不理想。我們需要自己實現自定義的排序。 這樣的話得實現兩個接口: ScoreDocComparator, SortComparatorSource 用IndexSearcher.search(query,new Sort(new SortField(String Field,SortComparatorSource))); 就看個例子吧: 這是一個建立索引的例子: [code] public void IndexSort() throws IOException {         IndexWriter writer = new IndexWriter("C://indexStore",new StandardAnalyzer(),true);         Document doc = new Document()         doc.add(new Field("sort","1",Field.Store.YES,Field.Index.TOKENIZED));         writer.addDocument(doc);         doc = new Document();         doc.add(new Field("sort","4",Field.Store.YES,Field.Index.TOKENIZED));         writer.addDocument(doc);         doc = new Document();         doc.add(new Field("sort","3",Field.Store.YES,Field.Index.TOKENIZED));         writer.addDocument(doc);         doc = new Document();         doc.add(new Field("sort","5",Field.Store.YES,Field.Index.TOKENIZED));         writer.addDocument(doc);         doc = new Document();         doc.add(new Field("sort","9",Field.Store.YES,Field.Index.TOKENIZED));         writer.addDocument(doc);         doc = new Document();         doc.add(new Field("sort","6",Field.Store.YES,Field.Index.TOKENIZED));         writer.addDocument(doc);         doc = new Document();         doc.add(new Field("sort","7",Field.Store.YES,Field.Index.TOKENIZED));         writer.addDocument(doc);         writer.close(); } [/code] (未完)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章