`
wutao8818
  • 浏览: 607141 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

IndexWriter合并索引

阅读更多
IndexWriter 提供一个接口

帮助开发者合并不同的索引。这并不是合并具体的目录,而是合并不同的Directory类型的对象。这样我们可以就将不同文件系统路径下的索引合并,还可以将内存中的索引与文件系统中的索引进行合并。

RAMDirectory ramDir=new RAMDirectory();
FSDirectory fsdir=new FSDirectory();

IndexWriter ramWriter=new IndexWriter()...
IndexWriter fsWriter=new IndexWriter()...

ramWriter.addDocument........
ramWriter.close();//必须先关闭。将缓存中的文档刷入RAMDirectory

fsWriter.addIndexes(new Directory[]{ramDir});

fsWriter.close;


引用
IndexWriter.optimize


对所有segment 做优化。使所有的segments合并为一个。即整个目录只出现一种文件前缀。原因是如果太多的文件,打开文件对系统资源消耗是致命的。很多系统都有最大打开文件数量限制。超过,操作系统会禁止打开最后的文件,导致检索失败。
当然优化的消耗也很大,Lucene在索引优化时,采用的策略是建立新的segment来取代那些被合并的segments,所以旧的segment还未被删除前,索引内的磁盘空间消耗会非常大,甚至2倍。IO也会非常高,优化只能在需要时进行,而非任意时刻。

引用
删除索引中的文档


IndexReader 负责对索引的各种读取和维护工作。打开索引,获得索引中文档,获得索引中总文档数量,删除某个文档。


//显示索引内所有的Document
IndexReader reader=IndexReader.open(..)
for(int i=0;i<reader.numDocs();i++){
  reader.document(i);
}
//输出当前索引的版本信息
reader.getVersion();
//输出当前索引文档数量
reader.numDocs();

Term term1=new Term("bookname","女");
TermDocs docs=reader.termDocs(term1);

while(docs.next()){
 docs.doc();//查找的term1的Document的编号
 docs.freq();//term在文档中出现的次数
}

reader.close();


引用
使用ID来删除文档


reader.deleteDocument(0);
reader.close();//必须要关闭,以便将删除信息写入磁盘。
//如果未删除即开始读取
for(int i=0;i<reader.numDocs;i++){
  reader.document(i);
}
//如果不关闭,直接执行上门的代码会发生错误。

//反删除,恢复刚才删除的内容
reader.undeleteAll();
reader.close();
//真正删除,只需要运行一下optimize(),就会重新分配ID.那就再也无法恢复了。


引用
用Field信息来删除

Term term=new Term("field","value");
reader.deleteDocuments(term);//批量删除
reader.close();



引用
同步问题


处理并发问题,索引是一个关键资源。
1.同一时刻,只允许一个线程进行加入,删除,更新操作
2.任一时刻,系统只能有一个indexWriter实例对索引进行操作
3.任一时刻,只有一个indexReader对索引进行删除操作。删除后需要close后再启用新的reader
4.在写入时,必须先关闭删除操作。
5.在删除前,必须关闭indexWriter

引用
lucene lock


锁存放于临时文件夹。位置由 java.io.tempdir 属性定义

1.write.lock

添加文档,或者删除文档时。在IndexWriter初始化时创建,在close()时释放。
在IndexReader.delete时创建,在IndexWriter.close()时释放。

2.commit.lock
与segment合并和读取相关操作时出现。出现在IndexWriter初始化时候,但一旦segment信息被读取完毕,就立刻被释放。当调用IndexWriter.addIndexes()或mergeSegments()方法时,生成这个锁。
不能仅仅依赖Lucene锁机制来防止非法操作,需要编写具有良好同步特性的代码来实现高效

引用
IndexModifier

集成IndexWriter 添加功能,同时还提供了IndexReader的删除功能。
分享到:
评论

相关推荐

    Lucene创建索引步骤

    Lucene创建索引步骤: 1、创建Directory(索引位置) 2、创建IndexWrite(写入索引) 3、创建Document对象 4、为Document添加Field(相当于添加属性:类似于表与字段的关系) 5、通过IndexWriter添加文档到索引中

    基于JAVA的搜索引擎 lucene-2.2.0

    索引器IndexWriter的功能主要就是创建索引,是建立索引工作中最核心的。 当构造完一个索引器IndexWriter之后,就可以向其中添加Document了。 在前面Lucene-2.2.0 源代码阅读学习(1)中,根据Lucene提供的一个Demo,...

    Lucene 详细教案

    这段代码就时建立一个索引前所必须的操作,先声明这个 IndexWriter ,实例化它你必须传入三个参数。他们分别代表:你要建立索引文件的存放位置、你要使用索引建立的分词方法、是否重新建立索引。这样你就告诉 lucene...

    lucene2.9.1所有最新开发包及源码及文档

    对索引文件的segment进行写、合并、优化的IndexWriter类。对索引进行读取和删除操作的IndexReader类。 3) store模块:负责索引的存储。提供索引的各种存储类:FSDirectory,RAMDirectory等。 4) document模块:...

    lucene.net搜索技术,附带学习资料

    然后再把所有的内存索引合并到FSDirectory里,甚至可以让多台服务器分别处理内容的各个部分,然后把索引结果放到一个队列里,再有一台机器去读取索引结果队列并合并索引结果。  做这个示例主要是为了演示一下Lucene...

    基于lucene的搜索引擎总结

    不允许使用多个IndexWriter或IndexReader实例同时对一个索引进行修改 IndexWriter和IndexReader是线程安全的,可以被多线程共享 全文索引/搜索 中文分词器 最大匹配法(机械分词):按照一定的策略将待分析的汉字串...

    Apache Lucene全文检索和IKAnalyzer分词工具类

    /**查看IndexWriter里面有多少个索引**/ int num = indexWriter.docCount(); System.out.println("总共------》" + num); indexWriter.optimize(); indexWriter.close(); return num; } /** * IK...

    Homework-4 作业补充1

    2.1 在创建索引过程中,首先提供的是一个目录,用于存储索引 2.2 然后建立索引写文件入口 IndexWriter 2.3 创建索引过程中会使用 Field,

    lucene2.9.1完整DEMO及开发文档

    //创建一个IndexWriter(存放索引文件的目录,分析器,Field的最大长度) iwriter = new IndexWriter(directory, analyzer,true, IndexWriter.MaxFieldLength.UNLIMITED); //iwriter.setUseCompoundFile(true);//...

    Lucene3.1使用教程.doc

    Lucene3.1使用教程 随着Lucene开发的推进,Lucene3.1推出了,但是目前Lucene3.1的使用文档较少,特收集了...9. 新的 TotalHitCountCollector用来获取索引的命中数 10. ReaderFinishedListener API 用来清除外部缓存

    Lucene5 工具类

    工具类对IndexWriter,IndexReader,IndexSearcher,Analyzer,QueryParser等Lucene这些常用操作对象的获取进行了封装,其中IndexWriter采用了单例模式,确保始终只有一个对象实例,因为Lucene限制了索引写操作是阻塞的...

    lucene,lucene教程,lucene讲解

    为了对文档进行索引,Lucene 提供了五个基础的类 public class IndexWriter org.apache.lucene.index.IndexWriter public abstract class Directory org.apache.lucene.store.Directory public abstract class ...

    solr基础知识介绍

    3.3.5 IndexWriter 6 3.3.6 IndexSearcher 6 3.3.7 Directory 6 3.3.8 Segment 7 3.3.9 QueryParser 7 3.3.10 Hits 7 4.应用示例 7 4.1 创建索引 7 4.1 删除索引 7 4.1 索引查询 8 5.配置文件分析 9 5.1 schema.xml ...

    【分享:lucene学习资料】---<下载不扣分,回帖加1分,欢迎下载,童叟无欺>

    8. 索引的合并 18 9. 各种Query 18 9.1. 概述 18 9.2. 使用特定的分析器搜索 18 9.3. 按词条搜索—TermQuery 19 9.4. 按“与或”搜索—BooleanQuery 19 9.5. 在某一范围内搜索—RangeQuery 19 9.6. 使用前缀搜索—...

    NewsCrusader

    新闻十字军 ###项目介绍 该项目旨在使用新闻索引器构建一个功能齐全的新闻搜索引擎,其... ###IndexWriter 一旦给定的文件被转换成文档,IndexWriter 负责将字段写入相应的索引和字典。 您应该实现以下索引。 索引

    NewsCrusader:信息检索CS535-2014年秋季,UB

    新闻十字军 ###项目介绍 该项目旨在使用新闻索引器构建功能齐全的... ### IndexWriter一旦将给定文件转换为文档,IndexWriter负责将字段写入相应的索引和字典。 您应该实现以下索引。 索引和字典的代表性快照如下

    Lucene 源码解析

    在创建完最重要的IndexWriter之后,就开始遍历需要索引的文件,构造对应的Document和Filed类,最终通过IndexWriter的addDocument函数开始索引。 Document的构造函数为空,StringField、TextField和Field的构造函数...

    Lucene 全文检索

    public static String indexDirpath = "e:\\work\\zhzyk\\index";...第一次执行请把 indexWriter = new IndexWriter(indexDir, luceneAnalyzer, false);//true建立索引库,false追加索引库 false改为true

    learn-lucene:lucene学习

    lucene_learnlucene学习day_01:索引创建的步骤:创建directory创建IndexWriter创建Document为Document添加Field通过IdexUriter添加文档到索引中搜索的步骤:创建directory创建IndexReader根据IndexReader创建...

    与lucene3.0兼容的庖丁jar包

    lucene升级了,分词也得... at org.apache.lucene.index.IndexWriter.addDocument(IndexWriter.java:1932) at org.apache.lucene.index.IndexWriter.addDocument(IndexWriter.java:1906) 用该升级jar,可以解决该问题

Global site tag (gtag.js) - Google Analytics