一、Index屬性介紹
Field.Store.YES或者NO(存儲域選項)
YES:將會存儲域值,原始字符串的值會保存在索引中,以此可以進行相應的恢復操作,對于主鍵,標題可以是這種方式存儲
NO:不會存儲域值,通常與Index.ANAYLIZED合起來使用,索引一些如文章正文等不需要恢復的文檔 , 此時內容無法完全還原(doc.get)
?
Field.Index(索引選項)
Index.ANALYZED:進行分詞和索引,適用于標題、內容等
Index.NOT_ANALYZED:進行索引,但是不進行分詞,如果身份證號,姓名,ID等,適用于精確搜索
Index.ANALYZED_NOT_NORMS:進行分詞但是不存儲norms信息,這個norms中包括了創建索引的時間和權值等信息
Index.NOT_ANALYZED_NOT_NORMS:即不進行分詞也不存儲norms信息
Index.NO:不進行索引
?
使用場景
?
二、索引文件的初步認識:
_0.fdt
_0.fdx
---存儲域的值---
?
_0.fnm
---存儲域的名稱---
?
_0.frq
---分詞出現的頻率---
?
_0.nrm
---存儲評分信息---
?
_0.prx
---位偏移量---
?
_0.tii
_0.tis
---索引信息---
?
?三、索引建立步驟
1、創建Directory
?
Directory directory = FSDirectory.open(new File("D:/test/index01"));? ?
?
2、創建Writer
?
IndexWriter writer = new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_35,new StandardAnalyzer(Version.LUCENE_35)));? ?
?
3、創建文檔并且添加索引
文檔和域的概念很重要
?
文檔相當于表中的每一條記錄,域相當于表中每一個字段
?
Document document = null; Collection<File> files = FileUtils.listFiles(new File("D:/test/lucene"),FileFileFilter.FILE, null); for (File file : files) { document = new Document(); document.add (new Field ("content ", new FileReader(file))); //域名可以重復使用,在 使用 的時候 這樣取出,doc.getValues("content")[1] document.add (new Field ("content ", "可以再次放置一些內容"); document.add(new Field("filename", file.getName(), Field.Store.YES, Field.Index.NOT_ANALYZED)); document.add(new Field("path", file.getAbsolutePath(), Field.Store.YES,Field.Index.NOT_ANALYZED));//是否存儲路徑,是否進行分詞 writer.addDocument (document); }?
?
4、查詢索引的基本信息
?
IndexReader reader = IndexReader.open(directory); //通過reader可以有效的獲取到文檔的數量 System.out.println("numDocs:" + reader.numDocs() );//可以使用的文檔數量 System.out.println("maxDocs:" + reader.maxDoc() );//所有的文檔數量,包括被刪除的文檔 System.out.println("deleteDocs:" + reader.numDeletedDocs() );//被刪除的文檔數量 reader.close();?
?
5、刪除索引
//參數是一個選項,可以是一個Query,也可以是一個term,term是一個精確查找的值 //此時刪除的文檔并不會被完全刪除,而是存儲在一個回收站中的,可以恢復 writer.deleteDocuments (new Term ("id", "1")); writer.commit();
?
6、恢復刪除
?
try { //恢復時,必須把IndexReader的只讀(readOnly)設置為false IndexReader reader = IndexReader.open(directory, false); reader.undeleteAll (); reader.close(); }
?
7、強制刪除,相當于刪除回收站里面的,徹底刪除了
writer = new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_35, new StandardAnalyzer(Version.LUCENE_35))); writer.forceMergeDeletes ();
?
8、優化和合并索引
?
writer = new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_35, new StandardAnalyzer(Version.LUCENE_35))); //會將索引合并為2段,這兩段中的被刪除的數據會被清空 //特別注意:此處Lucene在3.5之后不建議使用,因為會消耗大量的開銷, //Lucene會根據情況自動處理的 writer.forceMerge (2);
?
9、更新索引
writer = new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_35, new StandardAnalyzer(Version.LUCENE_35))); /* * Lucene并沒有提供更新,這里的更新操作其實是如下兩個操作的合集 * 先刪除之后再添加 */ Document doc = new Document(); doc.add(new Field("id", "11", Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS)); doc.add(new Field("email", emails[0], Field.Store.YES, Field.Index.NOT_ANALYZED)); doc.add(new Field("content", contents[0], Field.Store.NO, Field.Index.ANALYZED)); doc .add(new Field("name", names[0], Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS)); writer.updateDocument(new Term("id", "1"), doc); //會把原來id=1的那個文檔刪掉,新增id=11的那個文檔
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
