欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
lucene3.0創(chuàng )建索引及多目錄搜索詳解
最近項目中用到了Lucene3.0,如下:
創(chuàng )建索引:
Java code
public void index() throws CorruptIndexException,LockObtainFailedException, IOException {// 索引目錄 File indexDir = new File("D:/workspace/code/java/TestLucene3/index/txt/test/");// 注意:這里建立索引用的分詞方法,在搜索時(shí)分詞也應該采用同樣的分詞方法。不然搜索數據可能會(huì )不正確// 使用Lucene自帶分詞器 Analyzer luceneAnalyzer = new StandardAnalyzer(Version.LUCENE_CURRENT);// 第一個(gè)參數是存放索引文件位置, 第二個(gè)參數是使用的分詞方法, 第三個(gè):true,建立全新的索引,false,建立增量索引。// IndexWriter indexWriter = new IndexWriter(indexDir, luceneAnalyzer, true);// 第一個(gè)參數是存放索引目錄有FSDirectory(存儲到磁盤(pán)上)和RAMDirectory(存儲到內存中), 第二個(gè)參數是使用的分詞器, 第三個(gè):true,建立全新的索引,false,建立增量索引,第四個(gè)是建立的索引的最大長(cháng)度。 IndexWriter indexWriter = new IndexWriter(FSDirectory.open(indexDir),luceneAnalyzer, true, IndexWriter.MaxFieldLength.LIMITED);// 索引合并因子// SetMergeFactor(合并因子)// SetMergeFactor是控制segment合并頻率的,其決定了一個(gè)索引塊中包括多少個(gè)文檔,當硬盤(pán)上的索引塊達到多少時(shí),// 將它們合并成一個(gè)較大的索引塊。當MergeFactor值較大時(shí),生成索引的速度較快。MergeFactor的默認值是10,建議在建立索引前將其設置的大一些。 indexWriter.setMergeFactor(100);// SetMaxBufferedDocs(最大緩存文檔數)// SetMaxBufferedDocs是控制寫(xiě)入一個(gè)新的segment前內存中保存的document的數目,// 設置較大的數目可以加快建索引速度,默認為10。 indexWriter.setMaxBufferedDocs(100);// SetMaxMergeDocs(最大合并文檔數)// SetMaxMergeDocs是控制一個(gè)segment中可以保存的最大document數目,值較小有利于追加索引的速度,默認Integer.MAX_VALUE,無(wú)需修改。// 在創(chuàng )建大量數據的索引時(shí),我們會(huì )發(fā)現索引過(guò)程的瓶頸在于大量的磁盤(pán)操作,如果內存足夠大的話(huà),// 我們應當盡量使用內存,而非硬盤(pán)??梢酝ㄟ^(guò)SetMaxBufferedDocs來(lái)調整,增大Lucene使用內存的次數。 indexWriter.setMaxMergeDocs(1000);// SetUseCompoundFile這個(gè)方法可以使Lucene在創(chuàng )建索引庫時(shí),會(huì )合并多個(gè) Segments 文件到一個(gè).cfs中。// 此方式有助于減少索引文件數量,對于將來(lái)搜索的效率有較大影響。// 壓縮存儲(True則為復合索引格式) indexWriter.setUseCompoundFile(true);long startTime = new Date().getTime();String temp = "";// 增加索引字段//// 在Field中有三個(gè)內部類(lèi):Field.Index,Field.Store,Field.termVector,而構造函數也用到了它們。// 參數說(shuō)明:// Field.Store:// Field.Store.NO:表示該Field不需要存儲。// Field.Store.Yes:表示該Field需要存儲。// Field.Store.COMPRESS:表示使用壓縮方式來(lái)存儲。// Field.Index:// Field.Index.NO:表示該Field不需要索引。// Field.Index.TOKENIZED:表示該Field先被分詞再索引。// Field.Index.UN_TOKENIZED:表示不對該Field進(jìn)行分詞,但要對其索引。// Field.Index.NO_NORMS:表示該Field進(jìn)行索引,但是要對它用Analyzer,同時(shí)禁止它參加評分,主要是為了減少內在的消耗。// TermVector這個(gè)參數也不常用,它有五個(gè)選項。// Field.TermVector.NO表示不索引Token的位置屬性;// Field.TermVector.WITH_OFFSETS表示額外索引Token的結束點(diǎn);// Field.TermVector.WITH_POSITIONS表示額外索引Token的當前位置;// Field.TermVector.WITH_POSITIONS_OFFSETS表示額外索引Token的當前和結束位置;// Field.TermVector.YES則表示存儲向量。// 增加文檔 Field相當于增加數據庫字段一樣檢索,獲取都需要的內容,直接放index中,不過(guò)這樣會(huì )增大index,保存文件的txt內容 /*** Field.Store 表示“是否存儲”,即該Field內的信息是否要被原封不動(dòng)的保存在索引中。* Field.Index 表示“是否索引”,即在這個(gè)Field中的數據是否在將來(lái)檢索時(shí)需要被用戶(hù)檢索到,一個(gè)“不索引”的Field通常僅是提供輔助信息儲存的功能。* Field.TermVector 表示“是否切詞”,即在這個(gè)Field中的數據是否需要被切詞。*/Field fieldPath = new Field("path", "", Field.Store.YES, Field.Index.NO);Field fieldBody = new Field("content", temp, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS);Field fieldId = new Field("id", "", Field.Store.YES, Field.Index.NOT_ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS);Document document = new Document();// 做測試,循環(huán)100000遍建索引。也可以讀取文件內容建索引 for (int i=0; i<100000; i++) {document = new Document();temp = "王熙鳳歷幻返金陵 甄應嘉蒙恩還玉闕";fieldPath.setValue("D:\\workspace\\code\\java\\TestLucene3\\txt\\" + i + ".txt");fieldBody.setValue(temp);fieldId.setValue(String.valueOf(i));document.add(fieldPath);document.add(fieldBody);document.add(fieldId);indexWriter.addDocument(document);i++;}//optimize()方法是對索引進(jìn)行優(yōu)化 indexWriter.optimize();indexWriter.close();// 若需要從索引中刪除某一個(gè)或者某一類(lèi)文檔,IndexReader提供了兩種方法:// reader.DeleteDocument(int docNum)// reader.DeleteDocuments(Term term)// 前者是根據文檔的編號來(lái)刪除該文檔,docNum是該文檔進(jìn)入索引時(shí)Lucene的編號,是按照順序編的;后者是刪除滿(mǎn)足某一個(gè)條件的多個(gè)文檔。// 在執行了DeleteDocument或者DeleteDocuments方法后,系統會(huì )生成一個(gè)*.del的文件,該文件中記錄了刪除的文檔,但并未從物理上刪除這些文檔。此時(shí),這些文檔是受保護的,當使用Document// doc = reader.Document(i)來(lái)訪(fǎng)問(wèn)這些受保護的文檔時(shí),Lucene會(huì )報“Attempt to access a// deleted document”異常。如果一次需要刪除多個(gè)文檔時(shí),可以用兩種方法來(lái)解決:// 1. 刪除一個(gè)文檔后,用IndexWriter的Optimize方法來(lái)優(yōu)化索引,這樣我們就可以繼續刪除另一個(gè)文檔。// 2. 先掃描整個(gè)索引文件,記錄下需要刪除的文檔在索引中的編號。然后,一次性調用DeleteDocument刪除這些文檔,再調用IndexWriter的Optimize方法來(lái)優(yōu)化索引。long endTime = new Date().getTime();System.out.println("\n這花費了" + (endTime - startTime) + " 毫秒增加到索引!");}
查詢(xún):
Java code
/*** 查詢(xún)** @param String word 關(guān)鍵詞* @param String filedName 域字段* @param String indexDir 索引位置* @throws CorruptIndexException* @throws IOException* @throws ParseException* @auther <a href="mailto:gaoxuguo@feinno.com">Gao XuGuo</a> Nov 30, 2009* 2:56:42 PM*/public List<Map<String, String>> search(String indexDir)throws CorruptIndexException, IOException, ParseException {File file = new File(indexDir);IndexSearcher is = new IndexSearcher(FSDirectory.open(file), true);String field = "content";BooleanQuery bq = new BooleanQuery();QueryParser parser = new QueryParser(Version.LUCENE_CURRENT, field,new StandardAnalyzer(Version.LUCENE_CURRENT));Query query = parser.parse("content:王熙鳳");Query q = new TermQuery(new Term("id","100"));bq.add(q,Occur.SHOULD);bq.add(query,Occur.SHOULD);// 100表示取前100條數據 TopScoreDocCollector collector = TopScoreDocCollector.create(100, true);long start = new Date().getTime();// start time/*** Lucene內置了三個(gè)Filter子類(lèi):* 1)DateFilter使搜索只限于指定的日期域的值在某一時(shí)間范圍內的文檔空間里* 2)QueryFilter把查詢(xún)結果做為另一個(gè)新查詢(xún)可搜索的文檔空間* 3)CachingWrappperFilter是其他過(guò)濾器的裝飾器,將結果緩存起來(lái)以便再次使用,從而提高性能。**/String[] dirs = {indexDir};MultiSearcher ms = this.getMultiSearcher(dirs);ms.search(bq, collector);// is.search(bq, collector); ScoreDoc[] docs = collector.topDocs().scoreDocs;Document doc;for (ScoreDoc sd : docs) {doc = is.doc(sd.doc);// 取得doc里面的Field并從doc里面讀取值 for (Fieldable fa : doc.getFields()) {System.out.print(fa.name() + "=" + doc.get(fa.name()) + " ");}System.out.println();}long end = new Date().getTime();if(is != null) is.close();System.out.println("找到 " + collector.getTotalHits()+ " 條數據,花費時(shí)間 " + (end - start)+ " 秒");return null;}
少發(fā)了一個(gè)方法:
Java code
/*** 得到MultiSearcher多目錄查詢(xún)實(shí)例** @param String[] dirs 要查詢(xún)的索引目錄。** @return MultiSearcher* @throws IOException* @auther <a href="mailto:gaoxuguo@feinno.com">Gao XuGuo</a>* Jan 22, 2010 3:44:16 PM*/private MultiSearcher getMultiSearcher(String[] dirs) throws IOException {// 多目錄 IndexSearcher [] searchers = new IndexSearcher[dirs.length];int i = 0;for (String dir : dirs) {searchers[i] = new IndexSearcher(FSDirectory.open(new File(dir)), true);i++;}// 多目錄查詢(xún) return new MultiSearcher(searchers);}
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Lucene 簡(jiǎn)介(一)
利用Lucene.net搭建站內搜索(3)
<轉>Lucene1.4與Lucene2.0的Field_㎡-流逝-時(shí)光-Ψ
lucene入門(mén)與使用
lucene爬數據庫中的數據無(wú)非也是查詢(xún)數據。所有我們用lucene搜索數據主要有下面幾個(gè)步驟
關(guān)于lucene2.0的創(chuàng )建、檢索和刪除功能的完整實(shí)現 - xiaodaoxiaodao—...
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久