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]
(未完)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.