lucene中ParallelReader.java使用中的難點

ybzshizds發表於2009-06-03
需求:
表a 一對一 表b
表a 做到索引中後不需要頻繁的修改
表b 做到索引中後會頻繁的修改
索引查詢時需要結合表a和表b中的欄位進行連線查詢

org.apache.lucene.index.ParallelReader的作用

有時對於一個Document(包含Field比較多)來說,有那麼一兩個Field會被頻繁地修改,而另一些Field則不會。這時可以將頻繁修改的Field和其他Field分開存放,而在搜尋時同時檢索這兩部分Field而提取出一個完整的Document。

這要求兩個索引包含的Document的數量必須相同, 在建立索引的時候,可以同時建立多個IndexWriter,將一個Document根據需要拆分成多個包含部分Field的Document,並將這些Document分別新增到不同的索引。

而在搜尋時,則必須藉助ParallelReader類來整合。
Directory dir1=FSDirectory.getDirectory(new File(INDEX_DIR1),false);
Directory dir2=FSDirectory.getDirectory(new File(INDEX_DIR2),false);
ParallelReader preader=new ParallelReader();
preader.add(IndexReader.open(dir1));
preader.add(IndexReader.open(dir2));
IndexSearcher searcher=new IndexSearcher(preader);


Directory dir1=FSDirectory.getDirectory(new File(INDEX_DIR1),false);Directory dir2=FSDirectory.getDirectory(new File(INDEX_DIR2),false)arallelReader preader=new ParallelReader();preader.add(IndexReader.open(dir1));preader.add(IndexReader.open(dir2));IndexSearcher searcher=new IndexSearcher(preader);
之後的操作和一般的搜尋相同。

正好可以滿足以上需求
可是如何保證兩個索引檔案中 Document的順序是對應的,第一次新建的時候沒問題(可以保證索引中Document的數量和順序一致),可是當對錶b對應的索引進行修改時,問題就暴露出來了,我們知道修改索引的做法是先刪除後插入的,這樣一來segement中的文件順序就變了,如何保證兩個表對應的索引檔案的文件順序一致,是個大難題,請有經驗的高手慷慨解難,謝謝!

相關文章