域选项
【名詞】
- 文檔 :文件,相當于數據表中的一條記錄
- 域(Field) :數據中一列(字段)就稱為域,在這里域就是文檔的一個屬性
?
【Field.Store】
- YES :在索引文件中存儲域的內容,存儲的內容可以方便文檔恢復
- NO :不在索引文件中存儲域內容,恢復時無法完整進行恢復(無法通過doc.get()進行獲取)
注:實際使用時一般正文是不會進行存儲的
?
【Field.Index】
?
- ANALYZED :表示進行分詞和索引,一般多用于標題和正文
- NOT_ANALYZED :表示不進行分詞。但進行索引。一般用于Id、身份證號碼、電話等精確查找的內容
- ANALYZED_NO_NORMS :表示進行分詞并索引,但不存儲Norms(包含了索引的權值信息)信息。正常情況下,搜索列表是按照權值進行排序的。做的比較好的是Google
- NOT_ANALYZED_NO_NORMS :即不分詞也不存儲Norms信息
- No :不進行索引和分詞
?
【示例】
創建索引:
1 /** 2 * 創建索引 3 */ 4 @Test 5 public void testIndex(){ 6 //存儲3篇文章的信息。包括:id、標題、作者、內容 7 int[] ids = {1,2,3}; 8 String[] titles = {"Hello","I love you","morning"}; 9 String[] authors = {"Mike","HanMeimei","Tom"}; 10 String[] contents= {"Hello,My Name Is Mike","Tome,I Love You","Good Moring,I'm so sorry,"}; 11 12 IndexWriter writer = null; 13 14 try { 15 //1、創建Directory 16 Directory directory = FSDirectory.open(new File("E:\\lucene\\index2")); 17 18 //2、創建Writer 19 IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_35, 20 new StandardAnalyzer(Version.LUCENE_35)); 21 22 writer = new IndexWriter(directory, config); 23 24 //3、創建Document 25 Document doc = null; 26 27 //4、設置Field 28 //文檔 :文件,相當于數據表中的一條記錄 29 //域(Field) :數據中一列(字段)就稱為域,在這里域就是文檔的一個屬性 30 for(int i = 0;i<ids.length;i++){ 31 doc = new Document(); 32 33 //域屬性 34 //Store(配置域的存儲方式) 35 //YES :在索引文件中存儲域的內容,存儲的內容可以方便文檔恢復 36 //NO :不在索引文件中存儲域內容,恢復時無法完整進行恢復(無法通過doc.get()進行獲取) 37 //實際使用時一般正文是不會進行存儲的 38 39 //Index(配置域的索引選項) 40 //ANALYZED :表示進行分詞和索引,一般多用于標題和正文 41 //NOT_ANALYZED :表示不進行分詞。但進行索引。一般用于Id、身份證號碼、電話等精確查找的內容 42 //ANALYZED_NO_NORMS :表示進行分詞并索引,但不存儲Norms(包含了索引的權值信息)信息 43 //正常情況下,搜索列表是按照權值進行排序的。做的比較好的是Google 44 //NOT_ANALYZED_NO_NORMS :即不分詞也不存儲Norms信息 45 //No :不進行索引和分詞 46 47 //為文檔添加域(屬性) 48 String id = Integer.toString(ids[i]); 49 doc.add(new Field("id",id,Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS)); 50 doc.add(new Field("title",titles[i],Field.Store.YES,Field.Index.NOT_ANALYZED)); 51 doc.add(new Field("author",authors[i],Field.Store.YES,Field.Index.NOT_ANALYZED)); 52 doc.add(new Field("content", contents[i],Field.Store.NO,Field.Index.ANALYZED)); 53 54 writer.addDocument(doc); 55 } 56 } catch (IOException e) { 57 e.printStackTrace(); 58 } 59 finally{ 60 if(writer != null) 61 try { 62 writer.close(); 63 } catch (CorruptIndexException e) { 64 // TODO Auto-generated catch block 65 e.printStackTrace(); 66 } catch (IOException e) { 67 // TODO Auto-generated catch block 68 e.printStackTrace(); 69 } 70 } 71 }?
搜索;
1 /** 2 * 搜索 3 */ 4 @Test 5 public void testSearch(){ 6 IndexReader reader =null; 7 try { 8 //1、創建Directory 9 Directory directory = FSDirectory.open(new File("E:\\lucene\\index2")); 10 11 //2、創建IndexReader 12 reader = IndexReader.open(directory); 13 14 //應用較多 15 System.out.println("索引文件數:" + reader.numDocs()); 16 System.out.println("最大文件數:" + reader.maxDoc()); 17 18 19 20 } catch (IOException e) { 21 // TODO Auto-generated catch block 22 e.printStackTrace(); 23 } 24 finally{ 25 if (reader != null) { 26 try { 27 reader.close(); 28 } catch (IOException e) { 29 // TODO Auto-generated catch block 30 e.printStackTrace(); 31 } 32 } 33 } 34 }?
【最佳實踐】
?
【文件類型】
1)?segment
表示一個完整的索引文件。搜索時通過該文件進行搜索。他是索引的重要文件。
?
2)?fnm
存儲了索引中所有Field的信息。
?
3)?fdx和fdt
.fdx和.fdt是綜合使用的兩類文件,其中.fdt類型文件用于存儲具有Store.YES屬性的Field數據。而.fdx類型文件則是一個索引,用于存儲Document在下面代碼就是創建索引的代碼。
?
4)?tii和tis
.tis文件用于存儲分詞后的分詞(Term,相當于字典的頁),而.tii就是它的所有文件(相當于字典的目錄),它標明了每個.tis文件中分詞的位置.
?
5)?frq
存儲了分詞在文中出現的頻率。
?
6)?prx
存儲了分詞在每次出現的位置。
?
7)?nrm
存儲文檔的標準引子。一般用該因子乘以命中次數。
?
8)?del
存儲刪除之后的索引信息。
注:文件不能隨意刪除,否則可能造成搜索失敗(出現錯誤)
?
轉載于:https://www.cnblogs.com/zhzcode/p/9800809.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
- 上一篇: 工作总结-基于R的数据分析
- 下一篇: linux中文件名有英文括号的问题