lucene中ParallelReader.java使用中的难点
需求:
表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中的文档顺序就变了,如何保证两个表对应的索引文件的文档顺序一致,是个大难题,请有经验的高手慷慨解难,谢谢!