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

    索引的删除: 
    IndexReader和IndexWriter都由删除索引的功能,但这两者是有区别的, 
    使用IndexReader删除索引时,索引会马上被删除,其有两种方法,可以删除索引deleteDocument(int docNum)和deleteDocument(Term term)前者会删除编号为docNum的document,后者会删除带有term的document。但是用这个类删除有局限性,当用此类打开的索引后来修改后会报StaleReaderException异常,并且当其他writer已经打开此索引时也会报异常。 

    IndexWriter可以根据多种情况进行删除deleteAll()删除所有的document、deleteDocuments(Query… queries)删除多个查询出来的document,deleteDocuments(Query query)删除query查询出来的document等等,但用Indexwriter执行删除的话一定要进行关闭,否则删除不会立马生效。

    1. Directory directory = FSDirectory.open(new File("d:\lucene"));  
    2.         IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_34, new StandardAnalyzer(Version.LUCENE_34));  
    3.         //最大缓存文档数,控制写入一个新的segment前内存中保存的document的数目  
    4.         config.setMaxBufferedDocs(100);  
    5.         //控制一个segment中可以保存的最大document数目,值较大有利于追加索引的速度,默认Integer.MAX_VALUE,无需修改。  
    6.         config.setMaxBufferedDocs(Integer.MAX_VALUE);  
    7.         IndexWriter indexWriter = new IndexWriter(directory, config);  
    8.         indexWriter.deleteDocuments(new Term("id",index));  
    9.          //这两句一定要执行  
    10.         indexWriter.optimize();  
    11.         indexWriter.close();  

    索引的更新: 
    IndexWriter可以更新索引。 
    更新索引实际上是把要更新的document删除,然后把修改过的document加入到索引中,其方法是document(Term term,Document doc),第一个参数是删除含有term的document,第二个参数是更新后的document。 

    1. Directory directory = FSDirectory.open(new File("d:\lucene"));  
    2.         IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_34, new StandardAnalyzer(Version.LUCENE_34));  
    3.         //最大缓存文档数,控制写入一个新的segment前内存中保存的document的数目  
    4.         config.setMaxBufferedDocs(100);  
    5.         //控制一个segment中可以保存的最大document数目,值较大有利于追加索引的速度,默认Integer.MAX_VALUE,无需修改。  
    6.         config.setMaxBufferedDocs(Integer.MAX_VALUE);  
    7.         IndexWriter indexWriter = new IndexWriter(directory, config);  
    8.           
    9.         Document doc = new Document();  
    10.           
    11.         //设置Field的name是为了搜索时更精确,比如只想在title中搜索。  
    12.         Field idField = new Field("id", blog2.getId() + "", Field.Store.YES, Field.Index.NOT_ANALYZED);  
    13.         Field titleField = new Field("title", blog2.getTitle(), Field.Store.YES, Field.Index.ANALYZED);  
    14.         Field contentField = new Field("content", blog2.getContent(), Field.Store.NO, Field.Index.ANALYZED);  
    15.         Field dateField = new Field("date", blog2.getDate(), Field.Store.YES, Field.Index.NO);  
    16.           
    17.         doc.add(titleField);  
    18.         doc.add(contentField);  
    19.         doc.add(idField);  
    20.         doc.add(dateField);  
    21.           
    22.         indexWriter.updateDocument(new Term("id", blog2.getId() + ""), doc);  
    23.         //这两句一定要执行,不然的话,更新不会马上执行。  
    24. indexWriter.optimize();  
    25.         indexWriter.close();  
     
  • 相关阅读:
    常用的IDEA快捷键
    异步任务 & 定时任务 & 邮件任务
    Swagger
    路由钩子&异步请求axios
    vue-参数绑定及重定向
    Spring事务的传播机制
    使用mybatis的BaseTypeHandler来给敏感字段进行AES加密
    SpringBoot2.0.3.RELEASE+sharding-jdbc4.1.0+mybatis-plus3.4.1+druid1.1.22 快速搭建分库分表
    使用SpringCloudStream整合RabbitMQ
    获取汉字首字母
  • 原文地址:https://www.cnblogs.com/a-du/p/6950203.html
Copyright © 2011-2022 走看看