在使用IndexReader.open()创建一个reader后 
我一直在使用这个reader 创建IndexSearcher进行查询 但是另外的线程使用IndexWriter 去改变索引里的内容 然后commit 
如果reader不调用reopen方法的话 那么查询的结果是不会收到IndexWriter的影响的 而调用reader的reopen方法后 会返回一个新的IndexReader(前提是索引内容已经改变 如果索引内容未变 那么 reopen返回的还是原来的reader) 
用这个新的reader可以查询到 更改了的信息 以上是我对IndexReader 和 IndexWriter的测试结果 
我想请教一下 reader调用open方法都做了些什么?  
根据以上测试结果我可不可以理解为open就是将索引文件的内容加载至内存了? 
谢谢 

解决方案 »

  1.   

    可以这么说,open的时候仅仅是拿到了流,并没有将索引文件完全加载
      

  2.   

    open相当于打开一个快照。你可以理解为把文件加载到内存。
    怎么说呢,拿数据库的ResultSet来说吧,它这个相当于取得resultset时,指定了in_sensintive(单词忘了)和readonly。就是说,数据库的更改不反应到游标以及只读方式打开游标。
      

  3.   

    正在看lucene源代码,懂点皮毛,也是云里雾里,有看源码的同学可以一起研究lucene不支持数据库dynamic,static之类的游标,读写是分开的。读用户看不到更新的部分。它不完全读入索引,只读一部分快照,然后根据这个快照在具体索引文件查寻比方索引的核心是倒排表在tis文件里,但是这个tis太大,只能把各个term和倒排表的offset放到tii里。tii完全读入内存,然后建立一个二分查找字典。每次要查找一个Term的倒排,就得先到tii里找offset,然后raf读取tis。但实际并不这么简单,lucene有复杂的评分机智,还要读取词频,标准化因子之类这些又在别的文件里,然后算什么tif,idf,queryNormalize之类,天了。。整个结果就想网一样,没法自动动态维护,只能读写分开。
      

  4.   

    谢谢 楼上几位同事的回答
    如果索引好大 上G的话  加载到内存是不太可能的  所以还是没搞明白open到底是干了什么