zoukankan      html  css  js  c++  java
  • *lucene索引_的删除和更新

    【删除】

    【恢复删除】

    【强制删除】

    【优化和合并】

    【更新索引】

    附:

    代码:

    IndexUtil.java:

      1 package cn.hk.index;
      2 
      3 import java.io.File;
      4 import java.io.IOException;
      5 
      6 import org.apache.lucene.analysis.standard.StandardAnalyzer;
      7 import org.apache.lucene.document.Document;
      8 import org.apache.lucene.document.Field;
      9 import org.apache.lucene.index.CorruptIndexException;
     10 import org.apache.lucene.index.IndexReader;
     11 import org.apache.lucene.index.IndexWriter;
     12 import org.apache.lucene.index.IndexWriterConfig;
     13 import org.apache.lucene.index.StaleReaderException;
     14 import org.apache.lucene.index.Term;
     15 import org.apache.lucene.store.Directory;
     16 import org.apache.lucene.store.FSDirectory;
     17 import org.apache.lucene.store.LockObtainFailedException;
     18 import org.apache.lucene.util.Version;
     19 
     20 public class IndexUtil {
     21     private String[] ids = {"1","2","3","4","5","6"};
     22     private String[] emails = {"aa@hk.arg","bb@hk.org","cc@hk.arg",
     23                                "dd@hk.org","ee@hk.org","ff@hk.org"};
     24     private String[] content = {
     25             "welcome to visited the space","hello boy","my name is aa","i like football",
     26             "I like football and I like Basketball too","I like movie and swim"
     27     };
     28     private int[] attachs = {2,3,1,4,5,5};
     29     private String[] names = {"zhangsan","lisi","john","mike","jetty","jake"};
     30     
     31     private Directory directory = null;
     32     
     33     public IndexUtil(){
     34         try {
     35             directory = FSDirectory.open(new File("d://lucene/index02"));
     36         } catch (IOException e) {
     37             e.printStackTrace();
     38         }
     39     }
     40     
     41     public void update(){
     42         IndexWriter writer =null;
     43         try {
     44             writer = new IndexWriter(directory,
     45                     new IndexWriterConfig(Version.LUCENE_35,new StandardAnalyzer(Version.LUCENE_35)));
     46             /*
     47              * lucene并没有提供更新的方法,这里的更新其实是提供如下两个操作:
     48              * 先删除之后再添加
     49              */
     50             Document doc = new Document();
     51             doc.add(new Field("id","11",Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));
     52             doc.add(new Field("email",emails[0],Field.Store.YES,Field.Index.NOT_ANALYZED));
     53             doc.add(new Field("content",content[0],Field.Store.NO,Field.Index.ANALYZED));
     54             doc.add(new Field("name",names[0],Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));
     55             writer.updateDocument(new Term("id","1"),doc);
     56         } catch (CorruptIndexException e) {
     57             e.printStackTrace();
     58         } catch (LockObtainFailedException e) {
     59             e.printStackTrace();
     60         } catch (IOException e) {
     61             e.printStackTrace();
     62         }finally{
     63             if(writer != null)
     64                 try {
     65                     writer.close();
     66                 } catch (CorruptIndexException e) {
     67                     e.printStackTrace();
     68                 } catch (IOException e) {
     69                     e.printStackTrace();
     70                 }
     71         }
     72         
     73     }
     74     
     75     
     76     public void merge(){
     77         IndexWriter writer = null;
     78         try {
     79             writer = new IndexWriter(directory,
     80                     new IndexWriterConfig(Version.LUCENE_35, new StandardAnalyzer(Version.LUCENE_35)));
     81             //会将索引合并为2段,这两段中的被删除的数据会被清空
     82             //特别注意:此处在lucene3.5后不建议使用,因为会消耗大量的开销,
     83             //lucene会根据情况自动处理的
     84             writer.forceMerge(2);
     85         } catch (CorruptIndexException e) {
     86             e.printStackTrace();
     87         } catch (LockObtainFailedException e) {
     88             e.printStackTrace();
     89         } catch (IOException e) {
     90             e.printStackTrace();
     91         }finally{
     92             if(writer != null)
     93                 try {
     94                     writer.close();
     95                 } catch (CorruptIndexException e) {
     96                     e.printStackTrace();
     97                 } catch (IOException e) {
     98                     e.printStackTrace();
     99                 }
    100         }
    101     }
    102     
    103     public void forceDelete(){
    104         IndexWriter writer = null;
    105         try {
    106             writer = new IndexWriter(directory,
    107                     new IndexWriterConfig(Version.LUCENE_35,new StandardAnalyzer(Version.LUCENE_35)));
    108             writer.forceMergeDeletes();
    109         } catch (CorruptIndexException e) {
    110             e.printStackTrace();
    111         } catch (LockObtainFailedException e) {
    112             e.printStackTrace();
    113         } catch (IOException e) {
    114             e.printStackTrace();
    115         }finally{
    116             if(writer != null)
    117                 try {
    118                     writer.close();
    119                 } catch (CorruptIndexException e) {
    120                     e.printStackTrace();
    121                 } catch (IOException e) {
    122                     e.printStackTrace();
    123                 }
    124         }
    125     }
    126     
    127     
    128     public void undelete(){
    129         //使用IndexReader进行恢复
    130         try {
    131             IndexReader reader = IndexReader.open(directory,false);
    132             //回复时,必须把IndexReader的只读(readyonly)设置为FALSE
    133             reader.undeleteAll();
    134             reader.close();
    135         } catch (StaleReaderException e) {
    136             
    137             e.printStackTrace();
    138         } catch (CorruptIndexException e) {
    139             
    140             e.printStackTrace();
    141         } catch (LockObtainFailedException e) {
    142             
    143             e.printStackTrace();
    144         } catch (IOException e) {
    145             // TODO Auto-generated catch block
    146             e.printStackTrace();
    147         }
    148     }
    149     
    150     
    151     
    152     
    153     
    154     public void delete(){
    155         IndexWriter writer = null;
    156         try {
    157             writer = new IndexWriter(directory,
    158                     new IndexWriterConfig(Version.LUCENE_35, new StandardAnalyzer(Version.LUCENE_35)));
    159             //删除ID为1的文档
    160             //参数可以是一个选项,可以是一个Query,也可以是一个Term,Term是一个精确查找的值
    161             //此时删除的文档并不会被完全删除,而是存储在回收站中的,可以恢复
    162             writer.deleteDocuments(new Term("id","1"));
    163         } catch (CorruptIndexException e) {
    164             
    165             e.printStackTrace();
    166         } catch (LockObtainFailedException e) {
    167             
    168             e.printStackTrace();
    169         } catch (IOException e) {
    170             
    171             e.printStackTrace();
    172         }finally{
    173             if(writer != null)
    174                 try {
    175                     writer.close();
    176                 } catch (CorruptIndexException e) {
    177                     
    178                     e.printStackTrace();
    179                 } catch (IOException e) {
    180                     
    181                     e.printStackTrace();
    182                 }
    183         }
    184     }
    185     
    186     
    187     
    188     public void query(){
    189         try {
    190             IndexReader reader = IndexReader.open(directory);
    191             //通过reader可以获取文档的数量
    192             System.out.println("numDocs:" + reader.numDocs());
    193             System.out.println("maxDocs" + reader.maxDoc());
    194             System.out.println("deleteDocs:" + reader.numDeletedDocs());
    195             reader.close();
    196         } catch (CorruptIndexException e) {
    197             
    198             e.printStackTrace();
    199         } catch (IOException e) {
    200             
    201             e.printStackTrace();
    202         }
    203     }
    204     
    205     
    206     public void index(){
    207         IndexWriter writer = null;
    208         try {
    209             writer = new IndexWriter(directory,new IndexWriterConfig(Version.LUCENE_35, new StandardAnalyzer(Version.LUCENE_35)));
    210             Document doc = null;
    211             for(int i=0;i<ids.length;i++){
    212                 doc = new Document();
    213                 doc.add(new Field("id",ids[i],Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));
    214                 doc.add(new Field("email",emails[i],Field.Store.YES,Field.Index.NOT_ANALYZED));
    215                 doc.add(new Field("content",content[i],Field.Store.NO,Field.Index.ANALYZED));
    216                 doc.add(new Field("name",names[i],Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));
    217                 writer.addDocument(doc);
    218             }
    219         } catch (CorruptIndexException e) {
    220             e.printStackTrace();
    221         } catch (LockObtainFailedException e) {
    222             e.printStackTrace();
    223         } catch (IOException e) {
    224             e.printStackTrace();
    225         }finally{
    226                 if(writer != null)
    227                     try {
    228                         writer.close();
    229                     } catch (CorruptIndexException e) {
    230                         
    231                         e.printStackTrace();
    232                     } catch (IOException e) {
    233                         
    234                         e.printStackTrace();
    235                     }
    236             
    237         }
    238     }
    239 
    240 }

    TestIndex.java:

     1 package cn.hk.test;
     2 
     3 import org.junit.Test;
     4 
     5 import cn.hk.index.IndexUtil;
     6 
     7 public class TestIndex {
     8     
     9     @Test
    10     public void testIndex(){
    11         IndexUtil iu = new IndexUtil();
    12         iu.index();
    13     }
    14     
    15     @Test
    16     public void testQuery(){
    17         IndexUtil iu = new IndexUtil();
    18         iu.query();
    19     }
    20     
    21     @Test
    22     public void testDelete(){
    23         IndexUtil iu = new IndexUtil();
    24         iu.delete();
    25     }
    26     
    27     @Test
    28     public void testUnDelete(){
    29         IndexUtil iu = new IndexUtil();
    30         iu.undelete();
    31     }
    32     
    33     @Test
    34     public void testForceDelete(){
    35         IndexUtil iu = new IndexUtil();
    36         iu.forceDelete();
    37     }
    38     
    39     public void testMerge(){
    40         IndexUtil  iu = new IndexUtil();
    41         iu.merge();
    42     }
    43     
    44     @Test
    45     public void testUpdate(){
    46         IndexUtil iu = new IndexUtil();
    47         iu.update();
    48     }
    49 }

  • 相关阅读:
    编写便于打印的Shellcode
    DOS路径转化为NT路径
    当你孤单时你会想起谁
    【转载】从文件句柄获得全路径
    C# DLLImport C++ dll 几点注意事项
    充值系统系统异常处理解决方案
    Demo 与实际应用开发之间的距离
    IIS7.0出错的解决方案 IIS 状态代码:IIS详细错误代码以及解释
    log4net 写日志到 Sql server 数据库
    Log4net 的使用及注意事项
  • 原文地址:https://www.cnblogs.com/zhzcode/p/9887656.html
Copyright © 2011-2022 走看看